初心者OK!質問大歓迎!のアセンブラのスレッドです。
基本情報の勉強中の人、PICやH8を勉強中の学生などなど…
前スレ
アセンブラ初心者スレッド
http://echo.2ch.net/test/read.cgi/tech/1314502612/
関連スレ
アセンブラ 13
http://echo.2ch.net/test/read.cgi/tech/1314512680/
探検
アセンブラ初心者スレッド 2©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2017/04/13(木) 17:35:55.70ID:1WMn3pSz
236デフォルトの名無しさん
2018/09/25(火) 01:58:20.74ID:4rHiZGxF 8bitISAの経験はあるんだがIA32やAMD64のプログラミングマニュアルを見ると命令の多さにめまいがする
しかもググってみるとメモリアドレッシングもなにやら作法があるようでよくわからん・・・
な状態なのだがIA32/AMD64のアセンブラを勉強するのにおすすめの資料とかあるかな
今のところ自力で書いたことのあるISAは78K0S、8051、AVR。基本的な概念はわかっているつもり
リンカ周りは不安あり。プラットフォームはWindowsかLinuxかFreeBSDを検討中
しかもググってみるとメモリアドレッシングもなにやら作法があるようでよくわからん・・・
な状態なのだがIA32/AMD64のアセンブラを勉強するのにおすすめの資料とかあるかな
今のところ自力で書いたことのあるISAは78K0S、8051、AVR。基本的な概念はわかっているつもり
リンカ周りは不安あり。プラットフォームはWindowsかLinuxかFreeBSDを検討中
237デフォルトの名無しさん
2018/09/25(火) 08:56:01.40ID:oRUMH9qn >>236
ISAって何のこと?
ISAって何のこと?
238デフォルトの名無しさん
2018/09/25(火) 09:25:52.53ID:oRUMH9qn ISA=instruction set architecture=命令セットアーキテクチャ
や、
ISA=PC/ATの拡張スロットのバス仕様
??
や、
ISA=PC/ATの拡張スロットのバス仕様
??
239デフォルトの名無しさん
2018/09/25(火) 18:37:53.38ID:oPuX37oa このスレでISAをIndustry Standard Architectureと解釈する必要ってあるのか?
240デフォルトの名無しさん
2018/09/26(水) 04:10:17.53ID:GMLyVXjl 誤解を生まないよう書き込む際は気を付けた方がいいね
241デフォルトの名無しさん
2018/09/26(水) 10:35:31.91ID:s/2dxbJy >>236
VCのx64はインラインアセンブラも使えなくなってるんだから、特殊なビット操作やりたいのでなければ
組み込み関数覚えてからの方が楽なんじゃないの
https://software.intel.com/sites/landingpage/IntrinsicsGuide/
右端に対応するニーモニックが書いてある
VCのx64はインラインアセンブラも使えなくなってるんだから、特殊なビット操作やりたいのでなければ
組み込み関数覚えてからの方が楽なんじゃないの
https://software.intel.com/sites/landingpage/IntrinsicsGuide/
右端に対応するニーモニックが書いてある
242デフォルトの名無しさん
2018/09/27(木) 10:28:07.85ID:+X2PETpr >>240
アスペじゃなければこの文脈でそれはない
アスペじゃなければこの文脈でそれはない
243デフォルトの名無しさん
2018/09/27(木) 10:47:26.07ID:JRG0evD8 そもそも8bitISAなんて言い方は一般的ではないもん。
244デフォルトの名無しさん
2018/09/27(木) 10:58:42.91ID:JRG0evD8 かなりアセンブラ経験あるけど、8bit ISAと聞いても意味が分からなかった。
多分、8bit CPUとか、8bit マイコンのことが言いたかったのではないかとは
思ったけど、意味がはっきりしなかったので念のため聞いてみた。
個人的には、Instrucstion Set Architectureの意味での「ISA」という
言い方は、Intelのマニュアルなどで最近目にするようになった印象が
ある言い方。
修正に告ぐ修正を重ねてが複雑化したx86系CPUのあの複雑さのニュアンス
を出すためにIntelが使い始めた言葉かもしれない。
昔、Z80が流行っていたころは、日本の雑誌などでは、8bit CPUと言われて
いたし、炊飯器や冷蔵庫では、今でもCPUよりもどちらかというと
I/OポートやA/Dコンバーターを内蔵しているみたいななニュアンスを
含めて「マイコン」と言われていると思う。
ISAという言葉は、Intelマニュアル以外ではあまり見たことない。
多分、8bit CPUとか、8bit マイコンのことが言いたかったのではないかとは
思ったけど、意味がはっきりしなかったので念のため聞いてみた。
個人的には、Instrucstion Set Architectureの意味での「ISA」という
言い方は、Intelのマニュアルなどで最近目にするようになった印象が
ある言い方。
修正に告ぐ修正を重ねてが複雑化したx86系CPUのあの複雑さのニュアンス
を出すためにIntelが使い始めた言葉かもしれない。
昔、Z80が流行っていたころは、日本の雑誌などでは、8bit CPUと言われて
いたし、炊飯器や冷蔵庫では、今でもCPUよりもどちらかというと
I/OポートやA/Dコンバーターを内蔵しているみたいななニュアンスを
含めて「マイコン」と言われていると思う。
ISAという言葉は、Intelマニュアル以外ではあまり見たことない。
245デフォルトの名無しさん
2018/09/27(木) 11:23:55.29ID:tmnyfQyv ARM でも MIPS でも普通に ISA 使うけど。
8bit の頃は、セカンドソースはあっても、ISA レベルでのライセンシングが無いか稀だったんじゃないかなあ。
どっちにしろ、16bit バスの ISA を思いつくのはちょっと理解できない。
8bit の頃は、セカンドソースはあっても、ISA レベルでのライセンシングが無いか稀だったんじゃないかなあ。
どっちにしろ、16bit バスの ISA を思いつくのはちょっと理解できない。
246デフォルトの名無しさん
2018/09/27(木) 11:29:57.13ID:JRG0evD8247デフォルトの名無しさん
2018/09/27(木) 11:40:30.81ID:JRG0evD8 >>245
「8-bit ISA card」
で検索すると、色々出てくる。
当時、愛器はNEC製だったのでPC/ATのバス規格であったところのISA
については知らなかったけど。
コンピュータは用語が多様なので、省略形は注意が必要だと思う。
ガングロ女子高生が省略後で通じ合えるのは、多分、興味の対象が
狭いか、語彙が少ないからこそかもしれないと思ってる。
語彙が豊富な人ほど、略さずそのまま言う傾向があると思うし。
「8-bit ISA card」
で検索すると、色々出てくる。
当時、愛器はNEC製だったのでPC/ATのバス規格であったところのISA
については知らなかったけど。
コンピュータは用語が多様なので、省略形は注意が必要だと思う。
ガングロ女子高生が省略後で通じ合えるのは、多分、興味の対象が
狭いか、語彙が少ないからこそかもしれないと思ってる。
語彙が豊富な人ほど、略さずそのまま言う傾向があると思うし。
248デフォルトの名無しさん
2018/09/27(木) 11:40:33.72ID:tmnyfQyv249デフォルトの名無しさん
2018/09/27(木) 11:49:44.12ID:JRG0evD8250デフォルトの名無しさん
2018/09/27(木) 11:55:04.47ID:JRG0evD8 アセンブラの基礎が分かっている人なら、Intelの3 Volumeがセットになった
英文マニュアルがお勧め(なお、英語が分かる人は、日本語版は読まない
方がいいと思う。混乱の元になるから。英語が分からない人は、多分、
混乱しながら時間をかけて前後関係から推定して理解することになる。)
ModRMについても書いてある。ただし、32BITのものが詳しく書かれていて、
64BITのものについては、補足のように後から書かれている。
REX prefixとかと関連して。
非常に壮大なマニュアルで、忘れたけど、総ページ数は5,000ページくらい
あったかもしれないけど、必要なところをかいつまんで読めばいい。
アセンブラ経験がある人なら読めるはず。
英文マニュアルがお勧め(なお、英語が分かる人は、日本語版は読まない
方がいいと思う。混乱の元になるから。英語が分からない人は、多分、
混乱しながら時間をかけて前後関係から推定して理解することになる。)
ModRMについても書いてある。ただし、32BITのものが詳しく書かれていて、
64BITのものについては、補足のように後から書かれている。
REX prefixとかと関連して。
非常に壮大なマニュアルで、忘れたけど、総ページ数は5,000ページくらい
あったかもしれないけど、必要なところをかいつまんで読めばいい。
アセンブラ経験がある人なら読めるはず。
251デフォルトの名無しさん
2018/09/27(木) 12:02:53.61ID:yf1/OigC みんなここを読んでいるのが自分と同じ業界の専門家だと思っているのかな?
初心者スレなんだから上級者は来るなよ
初心者スレなんだから上級者は来るなよ
252デフォルトの名無しさん
2018/09/27(木) 12:09:02.87ID:JRG0evD8 >>250
PDFファイルは、Adobe純正のものではなく、SumatraPDFがお勧め。
場合によっては、それと、PDF-XChange Viewerとの両使いも便利。
2つのビューアーがあると、同じファイルの異なるページを同時に
見ることが出来る。
特に、SumatraPDFは、ネットブラウザやWindows用の
テキスト・エディタなどとよく似た使い勝手で便利。
PDFファイルは、Adobe純正のものではなく、SumatraPDFがお勧め。
場合によっては、それと、PDF-XChange Viewerとの両使いも便利。
2つのビューアーがあると、同じファイルの異なるページを同時に
見ることが出来る。
特に、SumatraPDFは、ネットブラウザやWindows用の
テキスト・エディタなどとよく似た使い勝手で便利。
253デフォルトの名無しさん
2018/09/27(木) 12:29:35.23ID:nUEopGTJ254デフォルトの名無しさん
2018/09/27(木) 12:30:49.36ID:lrUHFZkm 自分の知識不足を棚に上げて絡む馬鹿アスペ
255デフォルトの名無しさん
2018/09/27(木) 12:34:10.71ID:JRG0evD8 お互いに知識に偏りがあるからしょうがないんだよ。
だから、分からない言葉があれば言葉の確認が必要となると思う。
名プログラマやIQ170の人でも、知らない分野では知識不足はあるよ。
だから、分からない言葉があれば言葉の確認が必要となると思う。
名プログラマやIQ170の人でも、知らない分野では知識不足はあるよ。
256デフォルトの名無しさん
2018/09/27(木) 12:51:27.68ID:BciEc+9A >>255
うん、78K0S、8051、AVRがなじみの無いCPUと聞いてショックを受けている。
うん、78K0S、8051、AVRがなじみの無いCPUと聞いてショックを受けている。
257デフォルトの名無しさん
2018/09/27(木) 12:59:24.22ID:JRG0evD8 >>256
78K0Sが、NEC製のマイコンだということだけは、昔知ったことがある。
でも、昔といってもとても最近。
8051は、PC-8801のシリアルコントローラに、似たような型番のものがあったような
気がしたが、たぶん関係ないけど、正確な型番は思い出せない。
78K0Sが、NEC製のマイコンだということだけは、昔知ったことがある。
でも、昔といってもとても最近。
8051は、PC-8801のシリアルコントローラに、似たような型番のものがあったような
気がしたが、たぶん関係ないけど、正確な型番は思い出せない。
258デフォルトの名無しさん
2018/09/27(木) 13:05:15.67ID:JRG0evD8259デフォルトの名無しさん
2018/09/27(木) 16:23:11.07ID:JRG0evD8 >>236
命令が多いのは、基本的には、MMX, SSE〜SSE4, AVX, AVX2, AVX512 が
追加されたことが大きい。その辺の命令はまずは、無視。
整数命令(汎用命令)から見るといい。
なおその前に、どんなレジスタがあるかについて勉強する。
「basic execution environment」みたいな節に書いてある。
レジスタは拡張につぐ拡張があったので、理解するのにそれなりの時間がかかる。
アルファベットごとの命令表の、mov, add, sub, mul, div, imul, idiv,
push, pop, call, jmp, jcc 系を中心に見た後、ModRMについて書かれた節を見る。
最初は、16BIT/32BIT の ModRM、SIB について理解する。
その際、operand prefix, address prefix について理解する。
その後、64BIT の long mode, compatible mode の説明を読んだ後、
64BIT の ModRM, SIB について、REX prefix とまとめて理解する。
ちなみに、以下は後回しにする:
fadd, fsub, fmul, fdiv, fldp, fld, fstp, fld は、x87 FPU。
padd, psub は、MMX, addps, addss, subps, subss, mulps, mulss は、SSE系。
mm0〜mm7, xmm, ymm, zmm, に関する movxxxx も最初は無視。
これらの movxxxx は、アルファベット順の命令ごとについての書かれた章
のに解説が書かれているが、アラインだとかの説明が難しい。
実は、同じマニュアルセットの全然別の場所にこれらの movxxxx 命令の
説明が割りと平易な言葉で書かれているので参考になる。ただし、英語。
翻訳版の日本語だと余計に意味が分からないかもしれないの注意。
AVX系命令は、まず、VEX, EVEX prefix を読む。REX prefix が完全に理解
してないと理解は難しいと思う。
命令が多いのは、基本的には、MMX, SSE〜SSE4, AVX, AVX2, AVX512 が
追加されたことが大きい。その辺の命令はまずは、無視。
整数命令(汎用命令)から見るといい。
なおその前に、どんなレジスタがあるかについて勉強する。
「basic execution environment」みたいな節に書いてある。
レジスタは拡張につぐ拡張があったので、理解するのにそれなりの時間がかかる。
アルファベットごとの命令表の、mov, add, sub, mul, div, imul, idiv,
push, pop, call, jmp, jcc 系を中心に見た後、ModRMについて書かれた節を見る。
最初は、16BIT/32BIT の ModRM、SIB について理解する。
その際、operand prefix, address prefix について理解する。
その後、64BIT の long mode, compatible mode の説明を読んだ後、
64BIT の ModRM, SIB について、REX prefix とまとめて理解する。
ちなみに、以下は後回しにする:
fadd, fsub, fmul, fdiv, fldp, fld, fstp, fld は、x87 FPU。
padd, psub は、MMX, addps, addss, subps, subss, mulps, mulss は、SSE系。
mm0〜mm7, xmm, ymm, zmm, に関する movxxxx も最初は無視。
これらの movxxxx は、アルファベット順の命令ごとについての書かれた章
のに解説が書かれているが、アラインだとかの説明が難しい。
実は、同じマニュアルセットの全然別の場所にこれらの movxxxx 命令の
説明が割りと平易な言葉で書かれているので参考になる。ただし、英語。
翻訳版の日本語だと余計に意味が分からないかもしれないの注意。
AVX系命令は、まず、VEX, EVEX prefix を読む。REX prefix が完全に理解
してないと理解は難しいと思う。
260デフォルトの名無しさん
2018/09/27(木) 16:33:04.36ID:JRG0evD8 >>259
ちなみに、命令表は、
1. マニュアルの中心付近にアルファベット順に書かれているもの
2. ずっと後の付録の当たりに確か2進数の BIT 的に書かれているもの
3. マシン語から命令へ逆にたどれるもの
の3種類ある。
以上の命令表のうち、最初に読むべきなのは、上記の「1」のもの。
その命令表を見るための準備も必要。
マニュアルをよく探すと、/0〜/7 の意味、+b, +w, +d, +q の意味などが書かれた
部分がある。基本的には、そこを読まないとちゃんとした理解は出来ない。
それだけでなく、命令表も2部に分かれているような独特の読み方がある。それも、
上記の説明と同じような場所にまとめて出ている(分かりにくいが)。
(オペランドの種類を1つの表では表しにくいので、ポインタ参照のような感じで
記号で、後の表の行を指定するような感じになっている。)
REX prefixについては、AMD社のAMD64のManualも当然参考になる。
REX prefix は、色々と注意が必要で、細かい点を正確に理解するのは
しばらく時間がかかる。
ちなみに、命令表は、
1. マニュアルの中心付近にアルファベット順に書かれているもの
2. ずっと後の付録の当たりに確か2進数の BIT 的に書かれているもの
3. マシン語から命令へ逆にたどれるもの
の3種類ある。
以上の命令表のうち、最初に読むべきなのは、上記の「1」のもの。
その命令表を見るための準備も必要。
マニュアルをよく探すと、/0〜/7 の意味、+b, +w, +d, +q の意味などが書かれた
部分がある。基本的には、そこを読まないとちゃんとした理解は出来ない。
それだけでなく、命令表も2部に分かれているような独特の読み方がある。それも、
上記の説明と同じような場所にまとめて出ている(分かりにくいが)。
(オペランドの種類を1つの表では表しにくいので、ポインタ参照のような感じで
記号で、後の表の行を指定するような感じになっている。)
REX prefixについては、AMD社のAMD64のManualも当然参考になる。
REX prefix は、色々と注意が必要で、細かい点を正確に理解するのは
しばらく時間がかかる。
261デフォルトの名無しさん
2018/09/27(木) 16:36:18.33ID:qYKYy6B3 墓場に一番近いスレ
262デフォルトの名無しさん
2018/09/27(木) 16:49:13.96ID:JRG0evD8 >>260
分かっているかもしれないが、x86系では、if()文に相当するものは、
基本的には、cmp aaa,bbb 命令で、(仮想的に)引き算をした後、
結果に基づいて、
zf, cf, sf, of(zero flag, carry flag, sign flag, overflow flag) など
のフラグ類に値が設定されて、そのあと、フラグ類に基づいて、
jz, jnz, jg, jge, jl, jle, ja, jae, jb, jbe などで jump (branch) する仕組み。
cmp命令は、ほとんど sub と同じだが、sub は、結果を destination
に実際に代入するのに対し、cmpは、結果はフラグ類以外にはどこにも
返さない。
subでも、フラグ類は設定されるので、上記の条件ジャンプは cmpと
全く同様に使える。実は、add や test, and, xor などでも、
条件ジャンプは行える場合がある。
整数で多倍長の加算を行うには、caryy flag を使って、add, adc を続けて行う。
減算の場合は、sub, sbb。
add ・・・
adc ・・・
adc ・・・
adc ・・・
・・・
みたいにすると、どれだけでも桁数は増やせる。
掛け算や、割り算の多倍長計算については、もっと数学的に行うが足し算と
引き算だけは、簡単に行える。
分かっているかもしれないが、x86系では、if()文に相当するものは、
基本的には、cmp aaa,bbb 命令で、(仮想的に)引き算をした後、
結果に基づいて、
zf, cf, sf, of(zero flag, carry flag, sign flag, overflow flag) など
のフラグ類に値が設定されて、そのあと、フラグ類に基づいて、
jz, jnz, jg, jge, jl, jle, ja, jae, jb, jbe などで jump (branch) する仕組み。
cmp命令は、ほとんど sub と同じだが、sub は、結果を destination
に実際に代入するのに対し、cmpは、結果はフラグ類以外にはどこにも
返さない。
subでも、フラグ類は設定されるので、上記の条件ジャンプは cmpと
全く同様に使える。実は、add や test, and, xor などでも、
条件ジャンプは行える場合がある。
整数で多倍長の加算を行うには、caryy flag を使って、add, adc を続けて行う。
減算の場合は、sub, sbb。
add ・・・
adc ・・・
adc ・・・
adc ・・・
・・・
みたいにすると、どれだけでも桁数は増やせる。
掛け算や、割り算の多倍長計算については、もっと数学的に行うが足し算と
引き算だけは、簡単に行える。
263デフォルトの名無しさん
2018/09/27(木) 17:57:17.06ID:ry/jwNzc264デフォルトの名無しさん
2018/09/27(木) 19:29:19.93ID:fZkL81UT まずはCコンパイラにアセンブラ出力させて、
それを元に命令の動作をリファレンスマニュアルで確認していった方が楽なのでは?
いきなりマニュアルだけ読むだけだと大変だろうね
ちなみにC++よりもC言語の方がアセンブラ出力を読むのは簡単なはず
あと、Visual C++なら32bitのx86でやった方がいいよ
64bitのアセンブラ出力はそのままアセンブラでアセンブルできないはず
32bitならVisual C++のアセンブラ出力をアセンブラでそのままアセンブルできる
それを元に命令の動作をリファレンスマニュアルで確認していった方が楽なのでは?
いきなりマニュアルだけ読むだけだと大変だろうね
ちなみにC++よりもC言語の方がアセンブラ出力を読むのは簡単なはず
あと、Visual C++なら32bitのx86でやった方がいいよ
64bitのアセンブラ出力はそのままアセンブラでアセンブルできないはず
32bitならVisual C++のアセンブラ出力をアセンブラでそのままアセンブルできる
265デフォルトの名無しさん
2018/09/27(木) 19:51:12.89ID:fZkL81UT gccなら64bitでもアセンブラ出力できる
AVRを使ったことがあってgcc使ってたのならLinux上でgcc使ってみるのもあり
この場合、コマンドライン主体になるけどね
Linuxなら
objdump -M intel -d hogehoge
という感じで実行ファイルやオブジェクトファイルの逆アセンブルができる
gccでx86のアセンブラ出力をするときは-masm=intelのオプションを忘れずに
やり方はこんな感じ
gcc -S -masm=intel -o hogehoge.s hogehoge.c
このアセンブラリストを
as -a=hogehoge.lst -o hogehoge.o hogehoge.s
とアセンブルできる
これでできたオブジェクトファイルを
gcc -o hogehoge hogehoge.o
これで実行ファイルが完成
gdbではdisasで逆アセンブルできる
逆アセンブルする前にset disassembly-flavor intelを1回入力してやれば
それ以降の逆アセンブルがintel記法で出力される
最後に、WindowsとLinuxでは関数の呼び出し規約が違ったりするのをお忘れなく
AVRを使ったことがあってgcc使ってたのならLinux上でgcc使ってみるのもあり
この場合、コマンドライン主体になるけどね
Linuxなら
objdump -M intel -d hogehoge
という感じで実行ファイルやオブジェクトファイルの逆アセンブルができる
gccでx86のアセンブラ出力をするときは-masm=intelのオプションを忘れずに
やり方はこんな感じ
gcc -S -masm=intel -o hogehoge.s hogehoge.c
このアセンブラリストを
as -a=hogehoge.lst -o hogehoge.o hogehoge.s
とアセンブルできる
これでできたオブジェクトファイルを
gcc -o hogehoge hogehoge.o
これで実行ファイルが完成
gdbではdisasで逆アセンブルできる
逆アセンブルする前にset disassembly-flavor intelを1回入力してやれば
それ以降の逆アセンブルがintel記法で出力される
最後に、WindowsとLinuxでは関数の呼び出し規約が違ったりするのをお忘れなく
266デフォルトの名無しさん
2018/09/27(木) 19:58:33.40ID:fZkL81UT gccなら上のように64bitのx86_64のアセンブラ出力もasでアセンブルできるよ
267デフォルトの名無しさん
2018/09/27(木) 20:02:31.89ID:fZkL81UT x86のアセンブラで注意が必要なのは
例えば、
mov eax, data01
とあった場合、data01のメモリの内容がeaxに入る
決してdata01のアドレスではない
data01のアドレスを読み込みたかったら
mov eax, offset data01
こうすること
例えば、
mov eax, data01
とあった場合、data01のメモリの内容がeaxに入る
決してdata01のアドレスではない
data01のアドレスを読み込みたかったら
mov eax, offset data01
こうすること
268デフォルトの名無しさん
2018/09/27(木) 23:08:23.40ID:F6rrREqm まただよ…
269デフォルトの名無しさん
2018/09/28(金) 15:40:04.81ID:O5kQkBkV lea だろう常考
270デフォルトの名無しさん
2018/09/29(土) 06:54:45.13ID:31v81hqm 32bitでは
lea eax, hogehoge
よりも
mov eax, offset hogehoge
の方が命令が1バイト少なくなる
64bitでは
lea rax, hogehoge
だとアドレスはRIP相対の32itDISPになって7バイト
mov rax, offset hogehoge
だと64bitのimmを読み込むので10バイトになって3バイト長くなるけど
lea eax, hogehoge
よりも
mov eax, offset hogehoge
の方が命令が1バイト少なくなる
64bitでは
lea rax, hogehoge
だとアドレスはRIP相対の32itDISPになって7バイト
mov rax, offset hogehoge
だと64bitのimmを読み込むので10バイトになって3バイト長くなるけど
271デフォルトの名無しさん
2018/09/29(土) 07:01:44.57ID:31v81hqm gccやgasだとx86_64で64bit immを読み込む命令のニーモニックが違うんだよな
movabs rax, offset flat hogehoge
gasだとこうなるかな
movabs rax, offset flat hogehoge
gasだとこうなるかな
272デフォルトの名無しさん
2018/09/29(土) 09:36:52.97ID:31v81hqm273デフォルトの名無しさん
2018/09/29(土) 10:00:32.42ID:31v81hqm Linuxでx86_64のgccでコンパイルしたものをとアセンブラのリンクする時に
lea rax, hogehoge
これや
mov rax, hogehoge
これをやるとリンク時にエラーが出るね
lea rax, hogehoge[rip]
mov rax, hogehoge[rip]
こうしないといけないみたい
lea rax, hogehoge
これや
mov rax, hogehoge
これをやるとリンク時にエラーが出るね
lea rax, hogehoge[rip]
mov rax, hogehoge[rip]
こうしないといけないみたい
274デフォルトの名無しさん
2018/09/29(土) 12:31:21.31ID:1LSQxS0k >>273
x64 独特の事情からかんがみて、言いたいことは分かってるつもりだが、
一応、MASM の元々の書き方の仕様では、C言語で言うと、
mov rax, hogehoe[rip] ; rax = *(rip + &hogehoge)
mov rax, hogehoe ; rax = *(&hogehoge)
の「意味」なので、本来は、働きが異なるのでその辺は注意を払う必要がある。
x64 だと、メモリオペランドでは、「絶対アドレス指定」より、
「rip 相対」が短いコードになり、なおかつその場合は、
disp 部分に 64BIT値が入れられないので色々と話が複雑になるけれど。
( gcc(gas)でどう意味に解釈されているかは知らないけど。 )
x64 独特の事情からかんがみて、言いたいことは分かってるつもりだが、
一応、MASM の元々の書き方の仕様では、C言語で言うと、
mov rax, hogehoe[rip] ; rax = *(rip + &hogehoge)
mov rax, hogehoe ; rax = *(&hogehoge)
の「意味」なので、本来は、働きが異なるのでその辺は注意を払う必要がある。
x64 だと、メモリオペランドでは、「絶対アドレス指定」より、
「rip 相対」が短いコードになり、なおかつその場合は、
disp 部分に 64BIT値が入れられないので色々と話が複雑になるけれど。
( gcc(gas)でどう意味に解釈されているかは知らないけど。 )
275デフォルトの名無しさん
2018/09/29(土) 12:34:45.26ID:1LSQxS0k >>274
元々の、masm の syntax 的には、
mov rax,[addr] ;絶対アドレス指定
と、
mov rax,[rip + (addr - offset label1)] ;相対アドレス指定
label1:
が rax に入る値が同じになるハズ。
元々の、masm の syntax 的には、
mov rax,[addr] ;絶対アドレス指定
と、
mov rax,[rip + (addr - offset label1)] ;相対アドレス指定
label1:
が rax に入る値が同じになるハズ。
276デフォルトの名無しさん
2018/09/29(土) 12:40:11.70ID:1LSQxS0k >>274
ちなみに、x86(IA32)モードでは、
[addr]
の ModRM のオペランドのマシン語 encode と全く同じ encode が、
x64(AMD64)では、
[rip + rel32]
になってしまって、しかも後者には、rel32 のための disp32 の4BYTE値が、
ModRM の直後に埋め込まれる仕様になっている。
これは、色々と誤解を招きやすい仕様で、初心者に混乱なく説明するのが難しくなってしまう。
ちなみに、x86(IA32)モードでは、
[addr]
の ModRM のオペランドのマシン語 encode と全く同じ encode が、
x64(AMD64)では、
[rip + rel32]
になってしまって、しかも後者には、rel32 のための disp32 の4BYTE値が、
ModRM の直後に埋め込まれる仕様になっている。
これは、色々と誤解を招きやすい仕様で、初心者に混乱なく説明するのが難しくなってしまう。
277デフォルトの名無しさん
2018/09/29(土) 13:18:43.07ID:31v81hqm >>274
MASMだとx64で
mov rax, hogehoge
こう書くと
mov rax, [hogehoge+rip]
の意味になるよ
マシン語は48 8B 05 xxxxxxxxでRIP相対の32bitDISPの解釈になる
Linuxのgccやgasだと
mov rax, hogehoge
これが32bitの絶対アドレスと解釈される模様
マシン語は48 8b 04 25 xxxxxxxxと
スケールインデックスの基数を持たない32bitDISPになってしまってる
これだとRIP相対にならないのでリンク時にエラーになる
mov rax, hogehoeg[rip]
これだとマシン語は48 8b 05 xxxxxxxxとRIP相対の32bitDISPになる
Linuxのgccやgasで64bit絶対アドレス読み込みや64bit絶対アドレス指定のデータロードは別のニーモニックになる
movabs rax, offset flat: hogehoge
マシン語は48 b8 xxxxxxxxxxxxxxxx
movabs rax, hogehoge
マシン語は48 a1 xxxxxxxxxxxxxxxx
(64bit絶対アドレス指定のデータロードはraxのみ)
MASMだとx64で
mov rax, hogehoge
こう書くと
mov rax, [hogehoge+rip]
の意味になるよ
マシン語は48 8B 05 xxxxxxxxでRIP相対の32bitDISPの解釈になる
Linuxのgccやgasだと
mov rax, hogehoge
これが32bitの絶対アドレスと解釈される模様
マシン語は48 8b 04 25 xxxxxxxxと
スケールインデックスの基数を持たない32bitDISPになってしまってる
これだとRIP相対にならないのでリンク時にエラーになる
mov rax, hogehoeg[rip]
これだとマシン語は48 8b 05 xxxxxxxxとRIP相対の32bitDISPになる
Linuxのgccやgasで64bit絶対アドレス読み込みや64bit絶対アドレス指定のデータロードは別のニーモニックになる
movabs rax, offset flat: hogehoge
マシン語は48 b8 xxxxxxxxxxxxxxxx
movabs rax, hogehoge
マシン語は48 a1 xxxxxxxxxxxxxxxx
(64bit絶対アドレス指定のデータロードはraxのみ)
278デフォルトの名無しさん
2018/09/29(土) 13:25:59.67ID:31v81hqm ちなみにMASMで
mov rax, offset hogehoge
こう書くと
マシン語は48 b8 xxxxxxxxxxxxxxxx
となる
mov rax, offset hogehoge
こう書くと
マシン語は48 b8 xxxxxxxxxxxxxxxx
となる
279デフォルトの名無しさん
2018/09/29(土) 13:37:18.16ID:31v81hqm MASMは実用性を重視した仕様で
gccやgasはより厳密な仕様になってる言えるな
gccやgasはより厳密な仕様になってる言えるな
280デフォルトの名無しさん
2018/09/29(土) 13:55:45.43ID:31v81hqm そもそもMASMのx64版で
mov rax, [hogehoge+rip]
や
mov rax, hogehoge[rip]
こうするとエラーになるよ
mov rax, [hogehoge+rip]
や
mov rax, hogehoge[rip]
こうするとエラーになるよ
281デフォルトの名無しさん
2018/09/29(土) 14:34:50.49ID:1VwJZM7J >>277
>MASMだとx64で
>mov rax, hogehoge
>こう書くと
>mov rax, [hogehoge+rip]
>の意味になるよ
>マシン語は48 8B 05 xxxxxxxxでRIP相対の32bitDISPの解釈になる
言いたいことが間違っているわけではないけど、厳密には、
MASMだとx64で
mov rax, hogehoge
と書くと、
mov rax, [rip + (offset hogehoge - offset label1)]
label1:
の「意味になる」。
>MASMだとx64で
>mov rax, hogehoge
>こう書くと
>mov rax, [hogehoge+rip]
>の意味になるよ
>マシン語は48 8B 05 xxxxxxxxでRIP相対の32bitDISPの解釈になる
言いたいことが間違っているわけではないけど、厳密には、
MASMだとx64で
mov rax, hogehoge
と書くと、
mov rax, [rip + (offset hogehoge - offset label1)]
label1:
の「意味になる」。
282デフォルトの名無しさん
2018/09/29(土) 14:36:51.71ID:1VwJZM7J そもそも、IA32までは、jmp, call 以外ではRIP相対は無かったので、
RIP相対については、masm も gas も、今のところ書式(syntax)的に
無理がある気がする。
RIP相対については、masm も gas も、今のところ書式(syntax)的に
無理がある気がする。
283デフォルトの名無しさん
2018/09/29(土) 14:39:38.93ID:1VwJZM7J つまり、今のところメモリオペランドの syntax に一貫性がなくなってきてしまっていると思う。
284デフォルトの名無しさん
2018/09/29(土) 15:05:27.10ID:31v81hqm285デフォルトの名無しさん
2018/09/29(土) 15:07:28.65ID:1VwJZM7J286デフォルトの名無しさん
2018/09/29(土) 15:08:54.79ID:31v81hqm MASMは実用性を重視して
mov rax, hogehoge
こういう書式
gcc、gasはより厳密に
mov rax, hogehoge[rip]
あくまでそういう決まりごとってこと
書式は違ってくるが
そもそもVisual C++やMASMとgcc、gasでは違うところが多すぎるから問題ない
gccやgasではアセンブラはデフォルトではAT&T記法だしな
mov rax, hogehoge
こういう書式
gcc、gasはより厳密に
mov rax, hogehoge[rip]
あくまでそういう決まりごとってこと
書式は違ってくるが
そもそもVisual C++やMASMとgcc、gasでは違うところが多すぎるから問題ない
gccやgasではアセンブラはデフォルトではAT&T記法だしな
287デフォルトの名無しさん
2018/09/29(土) 15:10:56.60ID:31v81hqm288デフォルトの名無しさん
2018/09/29(土) 15:13:20.76ID:31v81hqm こういう変なのがアスペってやつか
289デフォルトの名無しさん
2018/09/29(土) 15:18:29.23ID:1VwJZM7J >>287
C 言語での、*(&hogehoge) の MASM 版は、意味的には、
[offset hogehoge]
になって、ちょうどそれは、「hogehoge」 の意味に戻るはずなんだけど、
実際に masm でやってみると、変になる。記憶によると、masm では、
[hogehoge]
が hogehoge と書いたのと同じ意味になったはず
(論理的にはそんなはずは無いんだけども)。
C 言語での、*(&hogehoge) の MASM 版は、意味的には、
[offset hogehoge]
になって、ちょうどそれは、「hogehoge」 の意味に戻るはずなんだけど、
実際に masm でやってみると、変になる。記憶によると、masm では、
[hogehoge]
が hogehoge と書いたのと同じ意味になったはず
(論理的にはそんなはずは無いんだけども)。
290デフォルトの名無しさん
2018/09/29(土) 15:19:17.57ID:1VwJZM7J >>288
アスペかも知れんけど、数学は主席みたいな感じだったよ。
アスペかも知れんけど、数学は主席みたいな感じだったよ。
291デフォルトの名無しさん
2018/09/29(土) 15:23:02.46ID:P6L1chXc C言語との対応関係も知らずにアセンブラ語ってたとは驚き
で、また火病って連投してるね
で、また火病って連投してるね
292デフォルトの名無しさん
2018/09/29(土) 15:24:36.40ID:1VwJZM7J こういうのが2ch/5chの問題点なんだよな・・・。
293デフォルトの名無しさん
2018/09/29(土) 15:29:01.40ID:31v81hqm294デフォルトの名無しさん
2018/09/29(土) 15:32:55.38ID:P6L1chXc295デフォルトの名無しさん
2018/09/29(土) 15:37:30.74ID:31v81hqm296デフォルトの名無しさん
2018/09/29(土) 15:38:31.02ID:31v81hqm 実際に試してみればわかることだよ
297デフォルトの名無しさん
2018/09/29(土) 15:41:02.87ID:31v81hqm ID:1VwJZM7Jは論理的にとか書いてるが
実際のアセンブラの仕様を無視して、アセンブラで通らない命令書いてドヤ顔してるやつ
コンピュータなんて論理的におかしい命令とか普通にあるだろ
アスペはそういうのが我慢ならないらしい
実際のアセンブラの仕様を無視して、アセンブラで通らない命令書いてドヤ顔してるやつ
コンピュータなんて論理的におかしい命令とか普通にあるだろ
アスペはそういうのが我慢ならないらしい
298デフォルトの名無しさん
2018/09/29(土) 15:43:55.02ID:P6L1chXc299デフォルトの名無しさん
2018/09/29(土) 15:46:13.22ID:31v81hqm >>298
あなたもx86_64のアセンブラの仕様関して全く理解してないのはわかった
あなたもしたり顔で語るなよ
ここに書かれてる命令を実際にアセンブルしてその結果を見れば誰が正しいことを言ってるかわかるはず
あなたもx86_64のアセンブラの仕様関して全く理解してないのはわかった
あなたもしたり顔で語るなよ
ここに書かれてる命令を実際にアセンブルしてその結果を見れば誰が正しいことを言ってるかわかるはず
300デフォルトの名無しさん
2018/09/29(土) 15:50:43.93ID:31v81hqm301デフォルトの名無しさん
2018/09/29(土) 15:50:52.23ID:P6L1chXc302デフォルトの名無しさん
2018/09/29(土) 15:52:36.05ID:IuTgmxg/ 論理的におかしい命令なんかない
処理されるまでの過程は別にして計算機は命令されたとおりに動く
処理結果がおかしいのはキミラのオツムの問題
そもそもアセンブラなんか
キャッシュミスをできるだけむりやり回避するためにインラインアセンブラ書くとか
非常に明確な理由がないかぎりまず使われることなんかまずない
つまりココではアホ同士がアホなことでもめてる
処理されるまでの過程は別にして計算機は命令されたとおりに動く
処理結果がおかしいのはキミラのオツムの問題
そもそもアセンブラなんか
キャッシュミスをできるだけむりやり回避するためにインラインアセンブラ書くとか
非常に明確な理由がないかぎりまず使われることなんかまずない
つまりココではアホ同士がアホなことでもめてる
303デフォルトの名無しさん
2018/09/29(土) 15:54:58.28ID:31v81hqm >>301
> x64 独特の事情からかんがみて、言いたいことは分かってるつもりだが、
> 一応、MASM の元々の書き方の仕様では、C言語で言うと、
>
> mov rax, hogehoe[rip] ; rax = *(rip + &hogehoge)
> mov rax, hogehoe ; rax = *(&hogehoge)
>
> の「意味」なので、本来は、働きが異なるのでその辺は注意を払う必要がある。
そもそもMASMでは
mov rax, hogehoe[rip]
こんな記述は未サポート
mov rax, hogehoe
これが*(rip + hogehoge)の意味
> x64 独特の事情からかんがみて、言いたいことは分かってるつもりだが、
> 一応、MASM の元々の書き方の仕様では、C言語で言うと、
>
> mov rax, hogehoe[rip] ; rax = *(rip + &hogehoge)
> mov rax, hogehoe ; rax = *(&hogehoge)
>
> の「意味」なので、本来は、働きが異なるのでその辺は注意を払う必要がある。
そもそもMASMでは
mov rax, hogehoe[rip]
こんな記述は未サポート
mov rax, hogehoe
これが*(rip + hogehoge)の意味
304デフォルトの名無しさん
2018/09/29(土) 15:57:13.97ID:31v81hqm >>302
アスペ君は
mov rax, hogehoge
これが*(hogehoge + rip)の意味になるところが気に入らなくて突っ込みいれてるだけ
でも、実際に仕様なのだからしょうがないってこと
アスペ君は
mov rax, hogehoge
これが*(hogehoge + rip)の意味になるところが気に入らなくて突っ込みいれてるだけ
でも、実際に仕様なのだからしょうがないってこと
305デフォルトの名無しさん
2018/09/29(土) 16:01:34.18ID:P6L1chXc >>273みたいなこと書く奴が「理解できてる」はずないだろw
今回も「リンク時にエラーが出る」とか言ってさ
今回も「リンク時にエラーが出る」とか言ってさ
306デフォルトの名無しさん
2018/09/29(土) 16:06:06.66ID:31v81hqm307デフォルトの名無しさん
2018/09/29(土) 16:18:56.60ID:P6L1chXc 32bitではきちんと理解してなくてもなんとかなったってだけなの
x64知らないなら出てこなきゃいいのに
x64知らないなら出てこなきゃいいのに
308デフォルトの名無しさん
2018/09/29(土) 16:24:58.15ID:31v81hqm >>307
x86_64をわかってないのはあなただろ
MASMでは
mov rax, hogehoge
こう書く仕様だっての
gcc、gasでは
mov rax, hogehoge[rip]
こう書くのが仕様
ただそれだけ
マシン語ではどちらも48 8b 05 xxxxxxxxとRIP相対の32bitDISPになる
x86_64をわかってないのはあなただろ
MASMでは
mov rax, hogehoge
こう書く仕様だっての
gcc、gasでは
mov rax, hogehoge[rip]
こう書くのが仕様
ただそれだけ
マシン語ではどちらも48 8b 05 xxxxxxxxとRIP相対の32bitDISPになる
309デフォルトの名無しさん
2018/09/29(土) 16:32:57.40ID:31v81hqm offsetを使ったものも
MASMでは
mov rax, offset hogehoge
これでマシン語は48 b8 xxxxxxxxxxxxxxxxと64bit絶対アドレスになる
gcc、gasでは
movabs rax, offset flat: hogehoge
これでマシン語は48 b8 xxxxxxxxxxxxxxxxと64bit絶対アドレスになる
leaを使うと
MASMでは
lea rax, hogehoge
これでマシン語は48 8d 05 xxxxxxxxとRIP相対32bitDISPになる
gcc、gasだと
lea rax, hogehoge[rip]
これでマシン語は48 8d 05 xxxxxxxxとRIP相対32bitDISPになる
MASMでは
mov rax, offset hogehoge
これでマシン語は48 b8 xxxxxxxxxxxxxxxxと64bit絶対アドレスになる
gcc、gasでは
movabs rax, offset flat: hogehoge
これでマシン語は48 b8 xxxxxxxxxxxxxxxxと64bit絶対アドレスになる
leaを使うと
MASMでは
lea rax, hogehoge
これでマシン語は48 8d 05 xxxxxxxxとRIP相対32bitDISPになる
gcc、gasだと
lea rax, hogehoge[rip]
これでマシン語は48 8d 05 xxxxxxxxとRIP相対32bitDISPになる
310デフォルトの名無しさん
2018/09/29(土) 16:43:03.59ID:31v81hqm x86_64のRIP相対アドレッシングは歴史的には
32bitの時の32bit絶対アドレッシングの仕様を変更してRIP相対をねじ込んだ形だからね
アセンブラの記述的に、論理的におかしくてもしょうがないんだよ
論理的なものよりも実用性を重視したのがMASM
より論理的に厳密にしたのがgasということだろうな
32bitの時の32bit絶対アドレッシングの仕様を変更してRIP相対をねじ込んだ形だからね
アセンブラの記述的に、論理的におかしくてもしょうがないんだよ
論理的なものよりも実用性を重視したのがMASM
より論理的に厳密にしたのがgasということだろうな
311デフォルトの名無しさん
2018/09/29(土) 17:11:34.41ID:kF9GSkBg ちょっと質問なんだけど
dataセクションは32bitアドレス内にないとアクセスできないってこと?
extern int aaa[10];
int bbb (int i) {return aaa[i];}
このコードがこんな感じになってたんだけど
00000000004011a0 <bbb>:
4011a0: 48 63 ff movslq %edi,%rdi
4011a3: 8b 04 bd 40 40 40 00 mov 0x404040(,%rdi,4),%eax
4011aa: c3 retq
aaaがdataセクションの0x404040にあったからこうやってアクセスできたけど
32bit超えてたらこの命令は翻訳できない?
dataセクションは32bitアドレス内にないとアクセスできないってこと?
extern int aaa[10];
int bbb (int i) {return aaa[i];}
このコードがこんな感じになってたんだけど
00000000004011a0 <bbb>:
4011a0: 48 63 ff movslq %edi,%rdi
4011a3: 8b 04 bd 40 40 40 00 mov 0x404040(,%rdi,4),%eax
4011aa: c3 retq
aaaがdataセクションの0x404040にあったからこうやってアクセスできたけど
32bit超えてたらこの命令は翻訳できない?
312デフォルトの名無しさん
2018/09/29(土) 17:23:41.07ID:31v81hqm >>311
アセンブラのみではそういうことはないけど、C言語とリンクする場合はそうなるね
64bitでも通常はグローバル変数などのシンボルやジャンプ先のラベルは32bitを前提としてコンパイルされている
x86_64だとRIP相対の32bitDISPで届かないところにはアクセスできない
他のCPUでも似たようなもの
Windowsだと回避方法はない
LinuxだとHPCなどで-mcmodel=mediumを指定することで回避できる方法はあるけどね
アセンブラのみではそういうことはないけど、C言語とリンクする場合はそうなるね
64bitでも通常はグローバル変数などのシンボルやジャンプ先のラベルは32bitを前提としてコンパイルされている
x86_64だとRIP相対の32bitDISPで届かないところにはアクセスできない
他のCPUでも似たようなもの
Windowsだと回避方法はない
LinuxだとHPCなどで-mcmodel=mediumを指定することで回避できる方法はあるけどね
313デフォルトの名無しさん
2018/09/29(土) 17:34:12.56ID:mdNhb+fJ >>290
首席のことか
首席のことか
314デフォルトの名無しさん
2018/09/29(土) 17:35:24.77ID:31v81hqm >>311を俺の環境でgccでコンパイルしてみたらこうなった
オブジェクトファイルなのでアドレスは00 00 00 00のまま
gccのバージョンは7.3.0
0000000000000000 <bbb>:
0: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 7 <bbb+0x7>
7: 48 63 ff movslq %edi,%rdi
a: 8b 04 b8 mov (%rax,%rdi,4),%eax
d: c3 retq
オブジェクトファイルなのでアドレスは00 00 00 00のまま
gccのバージョンは7.3.0
0000000000000000 <bbb>:
0: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 7 <bbb+0x7>
7: 48 63 ff movslq %edi,%rdi
a: 8b 04 b8 mov (%rax,%rdi,4),%eax
d: c3 retq
315デフォルトの名無しさん
2018/09/29(土) 17:36:30.80ID:kF9GSkBg ありがとう
>>311のはa.outにしてアドレスが分かるようにした後だったから
>>311のはa.outにしてアドレスが分かるようにした後だったから
316デフォルトの名無しさん
2018/09/29(土) 17:37:16.65ID:31v81hqm AT&Tニーモニックの貼ってしまった
Intelニーモニックはこっち
0000000000000000 <bbb>:
0: 48 8d 05 00 00 00 00 lea rax,[rip+0x0] # 7 <bbb+0x7>
7: 48 63 ff movsxd rdi,edi
a: 8b 04 b8 mov eax,DWORD PTR [rax+rdi*4]
d: c3 ret
Intelニーモニックはこっち
0000000000000000 <bbb>:
0: 48 8d 05 00 00 00 00 lea rax,[rip+0x0] # 7 <bbb+0x7>
7: 48 63 ff movsxd rdi,edi
a: 8b 04 b8 mov eax,DWORD PTR [rax+rdi*4]
d: c3 ret
317デフォルトの名無しさん
2018/09/29(土) 17:42:37.03ID:kF9GSkBg318デフォルトの名無しさん
2018/09/29(土) 18:11:22.67ID:31v81hqm 俺のもLinuxだよ
319デフォルトの名無しさん
2018/09/29(土) 18:29:50.29ID:kF9GSkBg 7.3でも5.3でも>>311のになった
configure 設定: ../gcc-7.3.0/configure --prefix=/usr --libdir=/usr/lib64 --mandir=/usr/man --infodir=/usr/info --enable-shared
--enable-bootstrap --enable-languages=ada,brig,c,c++,fortran,go,lto,objc --enable-threads=posix --enable-checking=release
--enable-objc-gc --with-system-zlib --enable-libstdcxx-dual-abi --with-default-libstdcxx-abi=new --disable-libunwind-exceptions
--enable-__cxa_atexit --enable-libssp --enable-lto --disable-install-libiberty --with-gnu-ld --verbose --with-arch-directory=amd64
--disable-gtktest --disable-multilib --target=x86_64-slackware-linux --build=x86_64-slackware-linux --host=x86_64-slackware-linux
スレッドモデル: posix
gcc バージョン 7.3.0 (GCC)
configure 設定が違うのかな
configure 設定: ../gcc-7.3.0/configure --prefix=/usr --libdir=/usr/lib64 --mandir=/usr/man --infodir=/usr/info --enable-shared
--enable-bootstrap --enable-languages=ada,brig,c,c++,fortran,go,lto,objc --enable-threads=posix --enable-checking=release
--enable-objc-gc --with-system-zlib --enable-libstdcxx-dual-abi --with-default-libstdcxx-abi=new --disable-libunwind-exceptions
--enable-__cxa_atexit --enable-libssp --enable-lto --disable-install-libiberty --with-gnu-ld --verbose --with-arch-directory=amd64
--disable-gtktest --disable-multilib --target=x86_64-slackware-linux --build=x86_64-slackware-linux --host=x86_64-slackware-linux
スレッドモデル: posix
gcc バージョン 7.3.0 (GCC)
configure 設定が違うのかな
320デフォルトの名無しさん
2018/09/29(土) 18:31:39.06ID:1VwJZM7J321デフォルトの名無しさん
2018/09/29(土) 18:37:57.88ID:1VwJZM7J >>320
理解のポイントは、(64BIT)命令ポインタ rip は、CPUが、ModRM
の間接(メモリ)オペランドを解釈する時には、命令の直後の
アドレスを指しているかのようにみなされて、丁度、
rip = offset label1
または、
rip = &label1
であるかのように解釈されるということ。
理解のポイントは、(64BIT)命令ポインタ rip は、CPUが、ModRM
の間接(メモリ)オペランドを解釈する時には、命令の直後の
アドレスを指しているかのようにみなされて、丁度、
rip = offset label1
または、
rip = &label1
であるかのように解釈されるということ。
322デフォルトの名無しさん
2018/09/29(土) 18:52:23.15ID:31v81hqm323デフォルトの名無しさん
2018/09/29(土) 19:02:53.64ID:31v81hqm >>319
自分でビルドしたやつじゃないけど
gcc -vをやると
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-27ubuntu1~18.04'
--with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++
--prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared
--enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie
--with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror
--with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic
--enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release
--build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
自分でビルドしたやつじゃないけど
gcc -vをやると
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-27ubuntu1~18.04'
--with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++
--prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared
--enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie
--with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror
--with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic
--enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release
--build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
324デフォルトの名無しさん
2018/09/29(土) 19:23:24.57ID:kF9GSkBg 分かった-fPICつけると>>314と同じになった
325デフォルトの名無しさん
2018/09/29(土) 19:30:06.39ID:P6L1chXc MASMはデフォルトがrip相対だからな
offset演算子使った段階でアドレスではなくただの数値になってるのが理解できんのか
だから絶対アドレスになんだよ
offset演算子使った段階でアドレスではなくただの数値になってるのが理解できんのか
だから絶対アドレスになんだよ
326デフォルトの名無しさん
2018/09/29(土) 19:42:48.86ID:31v81hqm327デフォルトの名無しさん
2018/09/29(土) 19:54:13.97ID:31v81hqm 変な突っ込みする人がいるから書くが
CPUの命令的にはx86_64で
mov rax, offset hogehoge
これは64bitのimmを読み込むマシン語に変換される
要するにただの64bitの数値を読み込む命令
マシン語は48 b8 xxxxxxxxxxxxxxxx
ただ、アセンブラはちゃんと64bit immの部分が64bitの絶対アドレスということを認識してる
だから再配置された時に64bit絶対アドレスが再配置後のhogehogeのアドレスに置き換わる
CPUの命令的にはx86_64で
mov rax, offset hogehoge
これは64bitのimmを読み込むマシン語に変換される
要するにただの64bitの数値を読み込む命令
マシン語は48 b8 xxxxxxxxxxxxxxxx
ただ、アセンブラはちゃんと64bit immの部分が64bitの絶対アドレスということを認識してる
だから再配置された時に64bit絶対アドレスが再配置後のhogehogeのアドレスに置き換わる
328デフォルトの名無しさん
2018/09/29(土) 20:19:25.44ID:31v81hqm こんなことみんな知ってるとは思うが
実際に64bit絶対アドレスが確定するのはプログラムがメモリ上にロードされる時
このときに、絶対アドレスなどの情報が配置されるアドレスによって正しい値に書き換えられる
実際に64bit絶対アドレスが確定するのはプログラムがメモリ上にロードされる時
このときに、絶対アドレスなどの情報が配置されるアドレスによって正しい値に書き換えられる
329デフォルトの名無しさん
2018/09/29(土) 21:07:16.90ID:P6L1chXc そもそも
lea rax, [hogehoge]
って書いときゃNASMでも通るのに
>data01のアドレスを読み込みたかったら
>mov eax, offset data01
>こうすること
なんて教えようとするのかね?
lea rax, [hogehoge]
って書いときゃNASMでも通るのに
>data01のアドレスを読み込みたかったら
>mov eax, offset data01
>こうすること
なんて教えようとするのかね?
330デフォルトの名無しさん
2018/09/29(土) 21:11:28.97ID:P6L1chXc MASMって
mov eax, [rsp][16]
mov eax, [rsi][rcx]
みたいな変態な表現も通るんだよな
mov eax, [rsp][16]
mov eax, [rsi][rcx]
みたいな変態な表現も通るんだよな
331デフォルトの名無しさん
2018/09/30(日) 00:47:29.69ID:KtGjBt6/ Microsoft (R) Macro Assembler (x64) Version 12.00.40629.0
mov al, hogehoge
mov al, [hogehoge]
mov rax, offset flat:hogehoge ; error A2006:undefined symbol : flat
lea rax, [hogehoge]
lea rax, offset flat:hogehoge ; error A2006:undefined symbol : flat
lea rax, hogehoge
14.00.24210.0でも同じだな
mov al, hogehoge
mov al, [hogehoge]
mov rax, offset flat:hogehoge ; error A2006:undefined symbol : flat
lea rax, [hogehoge]
lea rax, offset flat:hogehoge ; error A2006:undefined symbol : flat
lea rax, hogehoge
14.00.24210.0でも同じだな
332デフォルトの名無しさん
2018/09/30(日) 00:54:08.42ID:KtGjBt6/ clが吐いた.codでは
lea rax, offset flat:hogehoge
みたいな表記になってるけど、ml64は受け付けない
lea rax, offset flat:hogehoge
みたいな表記になってるけど、ml64は受け付けない
333デフォルトの名無しさん
2018/09/30(日) 01:03:38.57ID:KtGjBt6/ mov eax, offset hogehoge
とやってもエラーも出ないんだよね 当然だけど
0000001A 48/ B8 0000000000000000 E mov rax, offset hogehoge
00000024 B8 00000000 E mov eax, offset hogehoge
とやってもエラーも出ないんだよね 当然だけど
0000001A 48/ B8 0000000000000000 E mov rax, offset hogehoge
00000024 B8 00000000 E mov eax, offset hogehoge
334236
2018/09/30(日) 01:18:13.92ID:PppEulsk なんか説明が不適切だったせいで偉いことになってしまった・・・すまん
とりあえずAMD64のプログラミングマニュアルとIA32/EM64Tの日本語プログラミングマニュアルはダウンロードしてあります
やりたいことは演算ではなくて特殊?な例外処理です。C風に書くと
unsigned int *a;
unsigned int b;
&a = 0x00001000; // アドレスをセット
*a = 0x00888888; // 0x00001000へ値を書き込み
b = *(&a + 1); // 0x00001004の値を読み出し。読み出される値は0x00001000の値に0x0100を加算した物
// bの中身は0x00888988
みたいな感じかな。メモリの読み書き動作に任意の処理を挟みたいです。自分なりにこのような動作をさせる方法を考えた結果
・該当する仮想アドレスにメモリを割り当てない
・アクセスすると発生するページフォールトをハンドリングする
・ハンドラ中で値の処理とアクセス元のコードが行うつもりだった読み書き動作もする
・ページフォールトを発生させた次の命令から実行を再開する
となったのですがこれらを高級言語のみで実装するのは無理そうな気がするのでアセンブラを読み書きできる必要があるかなと・・・
各OSごとの例外処理がらみの情報も必要ですがこの辺もなかなか見つけられないです
とりあえずAMD64のプログラミングマニュアルとIA32/EM64Tの日本語プログラミングマニュアルはダウンロードしてあります
やりたいことは演算ではなくて特殊?な例外処理です。C風に書くと
unsigned int *a;
unsigned int b;
&a = 0x00001000; // アドレスをセット
*a = 0x00888888; // 0x00001000へ値を書き込み
b = *(&a + 1); // 0x00001004の値を読み出し。読み出される値は0x00001000の値に0x0100を加算した物
// bの中身は0x00888988
みたいな感じかな。メモリの読み書き動作に任意の処理を挟みたいです。自分なりにこのような動作をさせる方法を考えた結果
・該当する仮想アドレスにメモリを割り当てない
・アクセスすると発生するページフォールトをハンドリングする
・ハンドラ中で値の処理とアクセス元のコードが行うつもりだった読み書き動作もする
・ページフォールトを発生させた次の命令から実行を再開する
となったのですがこれらを高級言語のみで実装するのは無理そうな気がするのでアセンブラを読み書きできる必要があるかなと・・・
各OSごとの例外処理がらみの情報も必要ですがこの辺もなかなか見つけられないです
335デフォルトの名無しさん
2018/09/30(日) 04:51:47.08ID:fqhkGGw5 >>322
64bitのcl.exeが吐き出すアセンブラ出力はml64.exeでそのままではアセンブル通らないよ
何箇所か、修正が必要になる
ちなみに32bitのcl.exeが吐き出すアセンブラ出力はそのまま32bitのml.exeでアセンブルできる
>>333
mov eax, offset hogehoge
これをx64用のml64.exeでアセンブルしてもエラーは起きないが
リンク時にこのエラーが出るよ
error LNK2017: 'ADDR32' relocation to
'hogehoge' invalid without /LARGEADDRESSAWARE:NO
LINK : fatal error LNK1165: link failed because of fixup errors
64bitのアドレスを32bit絶対アドレスに切り詰めてるのだから当たり前だけど
mov rax, offset hogehoge
これは全く問題ない
アセンブルもリンクも正常に行われるし、正常にプログラムを実行できる
64bitのcl.exeが吐き出すアセンブラ出力はml64.exeでそのままではアセンブル通らないよ
何箇所か、修正が必要になる
ちなみに32bitのcl.exeが吐き出すアセンブラ出力はそのまま32bitのml.exeでアセンブルできる
>>333
mov eax, offset hogehoge
これをx64用のml64.exeでアセンブルしてもエラーは起きないが
リンク時にこのエラーが出るよ
error LNK2017: 'ADDR32' relocation to
'hogehoge' invalid without /LARGEADDRESSAWARE:NO
LINK : fatal error LNK1165: link failed because of fixup errors
64bitのアドレスを32bit絶対アドレスに切り詰めてるのだから当たり前だけど
mov rax, offset hogehoge
これは全く問題ない
アセンブルもリンクも正常に行われるし、正常にプログラムを実行できる
336デフォルトの名無しさん
2018/09/30(日) 17:26:28.46ID:KtGjBt6/ >>335
NASM(bits64, default rel)だとエラーになるよ
mov rax, offset hogehoge ; error: comma, colon, decorator or end of line expected after operand
lea rax, hogehoge ; error: invalid combination of opcode and operands
lea rax, [hogehoge] ⇒ 488D05
mov al, hogehoge ⇒ B0
にアセンブルされたりもするけど
MASMでもlea rax, [hogehoge]やmov al, [hogehoge]はNASMと同じマシン語になるはず
Windows 64bitはrip相対使ってるのに、MASMで簡単に絶対アドレスが登場するのがおかしいと思わないのかね
NASM(bits64, default rel)だとエラーになるよ
mov rax, offset hogehoge ; error: comma, colon, decorator or end of line expected after operand
lea rax, hogehoge ; error: invalid combination of opcode and operands
lea rax, [hogehoge] ⇒ 488D05
mov al, hogehoge ⇒ B0
にアセンブルされたりもするけど
MASMでもlea rax, [hogehoge]やmov al, [hogehoge]はNASMと同じマシン語になるはず
Windows 64bitはrip相対使ってるのに、MASMで簡単に絶対アドレスが登場するのがおかしいと思わないのかね
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- トランプ大統領「米中がうまくやろうとしているのに、邪魔しないでくれ」 高市首相に厳しい口調でくぎを刺していた [Hitzeschleier★]
- こども家庭庁、2026年から“独身税”を開始、年収200万なら年4200円、年収400万なら年7800円 ★4 [お断り★]
- 【速報】宮川大輔&ケンコバの福岡ライブ 開演1時間前に急きょ中止「諸般の都合により」 [jinjin★]
- B’z東京ドーム公演で後ろの客が大熱唱…「B’zの歌声に集中できない」注意すると笑いながら反論されモヤモヤ [muffin★]
- なぜリベラルは人気がないのか 斎藤幸平さんが指し示す未来への道筋:朝日新聞 ★5 [少考さん★]
- 山里亮太、フィリピンに子ども食堂を建設 「偽善者」「日本の子どもを助けるべき」の声があっても活動を続ける理由 [Anonymous★]
- ネトウヨ「私達日本人は『南京大虐殺』を深く反省しています。ごめんなさい」 [165981677]
- 【実況】博衣こよりのえちえちボンバーマン大会🧪
- 【速報】伊東市長選、田久保氏が敗北確実wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww [812874503]
- 山尾志桜里さん、辻元清美氏が高市早苗の台湾有事の答弁資料を出したことに対し怒りが有頂天に「官僚の作った答弁を読めというのか!!!」 [597533159]
- 人気漫画家、絶望「どれだけガンダムが反戦を訴えてもゴジラやジブリがメッセージ出しても届かない、もうどうしたらいいの…?」 [339712612]
- なんGで毎日のように立ってる→🏡これなんなん❓
