初心者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
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で簡単に絶対アドレスが登場するのがおかしいと思わないのかね
337デフォルトの名無しさん
2018/09/30(日) 21:29:51.77ID:KtGjBt6/ >>334
いまいちやりたいことが分からないんだけど、Windowsでアクセス違反をハンドリングするのは
https://docs.microsoft.com/ja-jp/windows/desktop/Memory/reserving-and-committing-memory
が参考になるんじゃないかな
__except()のフィルタ関数でアクセス違反をチェックして、対象範囲のアドレスだったらVirtualAllocで
コミットして__except()にEXCEPTION_CONTINUE_EXECUTION返せば再実行される
対象範囲外のアドレスはEXCEPTION_CONTINUE_SEARCHを返す必要がある
メモリは事前に予約してないと例外から回復できないみたい
構造化例外処理は
http://www.ne.jp/asahi/hishidama/home/tech/vcpp/seh.html
https://msdn.microsoft.com/ja-jp/library/swezty51.aspx
を読んでみて
いまいちやりたいことが分からないんだけど、Windowsでアクセス違反をハンドリングするのは
https://docs.microsoft.com/ja-jp/windows/desktop/Memory/reserving-and-committing-memory
が参考になるんじゃないかな
__except()のフィルタ関数でアクセス違反をチェックして、対象範囲のアドレスだったらVirtualAllocで
コミットして__except()にEXCEPTION_CONTINUE_EXECUTION返せば再実行される
対象範囲外のアドレスはEXCEPTION_CONTINUE_SEARCHを返す必要がある
メモリは事前に予約してないと例外から回復できないみたい
構造化例外処理は
http://www.ne.jp/asahi/hishidama/home/tech/vcpp/seh.html
https://msdn.microsoft.com/ja-jp/library/swezty51.aspx
を読んでみて
338デフォルトの名無しさん
2018/10/01(月) 04:48:19.14ID:gNvpqBnl >>336
LinuxのNASMとMASMは構文違うよ
NASMだと
mov rax, hogehoeg
マシン語は48 b8 xxxxxxxxxxxxxxx
これでraxにアドレスが入る
WindowsのMASMだと
mov rax, hogehoge
マシン語は48 8b 05 xxxxxxxx
hogehogeのメモリの内容がraxにロードされる
MASMの場合、
mov rax, offset hogehoge
これだとマシン語は48 b8 xxxxxxxxxxxxxxxx
これにしないとNASMのmov rax, hogehogeと同じマシン語にならない
LinuxのNASMとMASMは構文違うよ
NASMだと
mov rax, hogehoeg
マシン語は48 b8 xxxxxxxxxxxxxxx
これでraxにアドレスが入る
WindowsのMASMだと
mov rax, hogehoge
マシン語は48 8b 05 xxxxxxxx
hogehogeのメモリの内容がraxにロードされる
MASMの場合、
mov rax, offset hogehoge
これだとマシン語は48 b8 xxxxxxxxxxxxxxxx
これにしないとNASMのmov rax, hogehogeと同じマシン語にならない
339デフォルトの名無しさん
2018/10/01(月) 05:43:56.26ID:gNvpqBnl みんなはじめて読むMASMからやり直しだなw
340デフォルトの名無しさん
2018/10/01(月) 05:51:48.63ID:gNvpqBnl >>336
RIP相対32bitdispだとアクセスできない場合が出てくる
シンボルがRIP相対2GBに制限されるなどはあくまでCコンパイラの制限であって
アセンブラはその制限を受けない
実際にWindowsのEXEファイルは64bit絶対アドレスに対応してて
きちんと再配置してくれるわけだし
RIP相対32bitdispだとアクセスできない場合が出てくる
シンボルがRIP相対2GBに制限されるなどはあくまでCコンパイラの制限であって
アセンブラはその制限を受けない
実際にWindowsのEXEファイルは64bit絶対アドレスに対応してて
きちんと再配置してくれるわけだし
341デフォルトの名無しさん
2018/10/01(月) 06:38:07.64ID:Z1gvrlLR これこそアスペって奴だよな
質問とは関係ないCPU持ち出して勝手に「語り」をはじめたり、32bitでは1バイト短くなるだの
実用的には0.001%程度しか影響なさそうな絶対アドレスの方が速いだの、C/C++とリンクして使うのが
普通なのに「シンボルがRIP相対2GBに制限されるなどはあくまでCコンパイラの制限であってアセンブラはその制限を受けない」とか
初心者そっちのけで有害としか思えないような方法垂れ流したりと、他人の迷惑とか全く考えられないんだから
初心者にはMASMとNASMで同じように使えればそれで十分
完全に同じマシン語になるかどうかなんて知るか
特に絶対アドレスなんてWin64には不要と考えるべき
初期化領域以外の動的確保されたメモリはポインタ経由のアクセスが基本なんだから
質問とは関係ないCPU持ち出して勝手に「語り」をはじめたり、32bitでは1バイト短くなるだの
実用的には0.001%程度しか影響なさそうな絶対アドレスの方が速いだの、C/C++とリンクして使うのが
普通なのに「シンボルがRIP相対2GBに制限されるなどはあくまでCコンパイラの制限であってアセンブラはその制限を受けない」とか
初心者そっちのけで有害としか思えないような方法垂れ流したりと、他人の迷惑とか全く考えられないんだから
初心者にはMASMとNASMで同じように使えればそれで十分
完全に同じマシン語になるかどうかなんて知るか
特に絶対アドレスなんてWin64には不要と考えるべき
初期化領域以外の動的確保されたメモリはポインタ経由のアクセスが基本なんだから
342デフォルトの名無しさん
2018/10/01(月) 06:45:27.19ID:Z1gvrlLR >>334
こういう状態なんで、334は全く悪くないから気にしなくていいよ
アクセス違反を検出して対応するのは、使ってみたいところがあったのでちょうどいい機会だった
一応自分の書いたテストプログラムを上げとくね
https://pastebin.com/b5gZXxCF
こういう状態なんで、334は全く悪くないから気にしなくていいよ
アクセス違反を検出して対応するのは、使ってみたいところがあったのでちょうどいい機会だった
一応自分の書いたテストプログラムを上げとくね
https://pastebin.com/b5gZXxCF
343デフォルトの名無しさん
2018/10/01(月) 06:51:19.23ID:gNvpqBnl344デフォルトの名無しさん
2018/10/01(月) 07:02:13.01ID:gNvpqBnl はじめて読むMASM
79ページ目
データラベルは、マシンご命令のニーモニックのなかで、データを格納す
るメモリを参照するために使用することができます。次の図3−10をみてく
ださい。この図では、違いを対比させるために次節で解説するOFFSET擬似
命令の役割を併せて図解してあります。
この場合、MESSAGEというデータラベルは01C3Hというアドレスに対応
しています。コードラベルの場合は、ラベル名がアドレスそのものと対応し
ていましたが、データラベルの場合にはちょっと違います。このことは重要
ですからよく覚えておいて下さい。
たとえば、SYMDEBのようにアドレスを直接数値で指定する場合、そのア
ドレスのメモリの内容を参照するには、
MOV DX, [01C3H]
のようにアドレスを[]で囲みます。これに対し、アセンブラのソースプロ
グラムでは、
MOV
79ページ目
データラベルは、マシンご命令のニーモニックのなかで、データを格納す
るメモリを参照するために使用することができます。次の図3−10をみてく
ださい。この図では、違いを対比させるために次節で解説するOFFSET擬似
命令の役割を併せて図解してあります。
この場合、MESSAGEというデータラベルは01C3Hというアドレスに対応
しています。コードラベルの場合は、ラベル名がアドレスそのものと対応し
ていましたが、データラベルの場合にはちょっと違います。このことは重要
ですからよく覚えておいて下さい。
たとえば、SYMDEBのようにアドレスを直接数値で指定する場合、そのア
ドレスのメモリの内容を参照するには、
MOV DX, [01C3H]
のようにアドレスを[]で囲みます。これに対し、アセンブラのソースプロ
グラムでは、
MOV
345デフォルトの名無しさん
2018/10/01(月) 07:04:42.69ID:gNvpqBnl はじめて読むMASM
79ページ目
データラベルは、マシンご命令のニーモニックのなかで、データを格納す
るメモリを参照するために使用することができます。次の図3−10をみてく
ださい。この図では、違いを対比させるために次節で解説するOFFSET擬似
命令の役割を併せて図解してあります。
この場合、MESSAGEというデータラベルは01C3Hというアドレスに対応
しています。コードラベルの場合は、ラベル名がアドレスそのものと対応し
ていましたが、データラベルの場合にはちょっと違います。このことは重要
ですからよく覚えておいて下さい。
たとえば、SYMDEBのようにアドレスを直接数値で指定する場合、そのア
ドレスのメモリの内容を参照するには、
MOV DX, [01C3H]
のようにアドレスを[]で囲みます。これに対し、アセンブラのソースプロ
グラムでは、
MOV DX, MESSAGE
とします。このことからわかるように、データラベルはラベルに対応するア
ドレスそのものではなく、そのアドレスが示すメモリの内容を表します。
つまり、データラベルそのものを指定すると、アドレスの値を転送したり演算
したりする命令ではなくて、メモリに対して転送や演算を行う命令になりま
す。もう1度図3−10を見てじっくり確認してください。
こう書かれてる
79ページ目
データラベルは、マシンご命令のニーモニックのなかで、データを格納す
るメモリを参照するために使用することができます。次の図3−10をみてく
ださい。この図では、違いを対比させるために次節で解説するOFFSET擬似
命令の役割を併せて図解してあります。
この場合、MESSAGEというデータラベルは01C3Hというアドレスに対応
しています。コードラベルの場合は、ラベル名がアドレスそのものと対応し
ていましたが、データラベルの場合にはちょっと違います。このことは重要
ですからよく覚えておいて下さい。
たとえば、SYMDEBのようにアドレスを直接数値で指定する場合、そのア
ドレスのメモリの内容を参照するには、
MOV DX, [01C3H]
のようにアドレスを[]で囲みます。これに対し、アセンブラのソースプロ
グラムでは、
MOV DX, MESSAGE
とします。このことからわかるように、データラベルはラベルに対応するア
ドレスそのものではなく、そのアドレスが示すメモリの内容を表します。
つまり、データラベルそのものを指定すると、アドレスの値を転送したり演算
したりする命令ではなくて、メモリに対して転送や演算を行う命令になりま
す。もう1度図3−10を見てじっくり確認してください。
こう書かれてる
346デフォルトの名無しさん
2018/10/01(月) 07:10:06.78ID:gNvpqBnl 82ページ目
3.6
OFFSET演算子とPTR演算子
OFFSET演算子
[書式] OFFSET ラベル名
データラベルをニーモニック中で使用すると、データ部分のアドレスでは
なく、データを格納したメモリの内容を表しますが、そのメモリのアドレス
はどうやって表すのでしょうか。図3−10で図解してあるので解説するまでも
ありませんが、データラベルに対応するアドレスは、次のように表します
OFFSET データラベル
OFFSET演算子は、ラベルに対して使用する演算子です。ラベルの前にこ
の演算子を付けると、ラベルに対応するアドレスを表す値となります。
例題のプログラムでは図3−11の部分で使われています。これは画面に出
力するメッセージが格納されているアドレス値を、データとして定義してい
る例です。
MASMの文法は16bitの頃から一貫してる
みんなはじめて読むMASMからやりなおしだな
3.6
OFFSET演算子とPTR演算子
OFFSET演算子
[書式] OFFSET ラベル名
データラベルをニーモニック中で使用すると、データ部分のアドレスでは
なく、データを格納したメモリの内容を表しますが、そのメモリのアドレス
はどうやって表すのでしょうか。図3−10で図解してあるので解説するまでも
ありませんが、データラベルに対応するアドレスは、次のように表します
OFFSET データラベル
OFFSET演算子は、ラベルに対して使用する演算子です。ラベルの前にこ
の演算子を付けると、ラベルに対応するアドレスを表す値となります。
例題のプログラムでは図3−11の部分で使われています。これは画面に出
力するメッセージが格納されているアドレス値を、データとして定義してい
る例です。
MASMの文法は16bitの頃から一貫してる
みんなはじめて読むMASMからやりなおしだな
347デフォルトの名無しさん
2018/10/01(月) 07:41:22.29ID:Z1gvrlLR >>343
MASMでもmov al,[hogehoge]やlea rax,[hogehoge]が使えて、NASMと「同じ動作」が期待できて、
「根本的に」書き換えなくても疑似命令やマクロとかを書き換えれば移植できるってのがポイントで
NASMはLinux他とWindowsみたいなマルチプラットフォームのプロジェクトでよく使われてるから
あんたみたいなmov al,hogehogeやり方でNASMに移行すると変なバグに悩まされる可能性があんだよ
特にmov al,hogehogeがイミディエイトでアドレスの一部がコードされるのが酷い
SYMDEBで括弧で括るってのはイミディエイトと区別付かないからそうなってるんだろ
これはNASMで括弧で括るのと同じこと
時代遅れになった本の内容なんてどうでもいい
括弧で括らない表記は、8080時代を踏襲してるのか、インラインアセンブラでのCの変数参照と統一感があるってところだろう
これならNASMで異なる動作にならない方が無難
こっちが言いたいのは、初心者に有用なことが書けないなら「出てくんな」ってことだけ
MASMでもmov al,[hogehoge]やlea rax,[hogehoge]が使えて、NASMと「同じ動作」が期待できて、
「根本的に」書き換えなくても疑似命令やマクロとかを書き換えれば移植できるってのがポイントで
NASMはLinux他とWindowsみたいなマルチプラットフォームのプロジェクトでよく使われてるから
あんたみたいなmov al,hogehogeやり方でNASMに移行すると変なバグに悩まされる可能性があんだよ
特にmov al,hogehogeがイミディエイトでアドレスの一部がコードされるのが酷い
SYMDEBで括弧で括るってのはイミディエイトと区別付かないからそうなってるんだろ
これはNASMで括弧で括るのと同じこと
時代遅れになった本の内容なんてどうでもいい
括弧で括らない表記は、8080時代を踏襲してるのか、インラインアセンブラでのCの変数参照と統一感があるってところだろう
これならNASMで異なる動作にならない方が無難
こっちが言いたいのは、初心者に有用なことが書けないなら「出てくんな」ってことだけ
348デフォルトの名無しさん
2018/10/01(月) 07:55:48.93ID:gNvpqBnl349デフォルトの名無しさん
2018/10/01(月) 07:57:49.96ID:gNvpqBnl それにNASMで慣れるとgccでインラインアセンブラを使うときに困る
gccはx86_64でもインラインアセンブラを扱えるのに
NASMの文法はgccのインラインアセンブラでは通用しないぞ
gccはx86_64でもインラインアセンブラを扱えるのに
NASMの文法はgccのインラインアセンブラでは通用しないぞ
350デフォルトの名無しさん
2018/10/01(月) 08:10:48.59ID:gNvpqBnl 多くの人がOFFSET演算子に対する理解がないようだから書いただけなのに
猛烈に反発してくる変な人がいるだけ
gccでは-mcmodel=largeのオプションを付けてコンパイルすると
movabs rax, offset flat: hogehoge
のような表現がよく出てくる
64bit絶対アドレスを扱うには必ず必要になってくる
猛烈に反発してくる変な人がいるだけ
gccでは-mcmodel=largeのオプションを付けてコンパイルすると
movabs rax, offset flat: hogehoge
のような表現がよく出てくる
64bit絶対アドレスを扱うには必ず必要になってくる
351デフォルトの名無しさん
2018/10/01(月) 09:35:33.25ID:Yquio+NL >>341
アセンブラは、かなり細かいことを理解して無いと使いこなせないかもしれないよ。
それが C/C++ などとは違う点。
ちゃんと、リストファイルを見て、Intel の Instruction 表と照らし合わせて
どの命令が出力されているかを確認し、さらに、OBJやEXEファイルを逆アセンブル
してみて、さらにさらに、ローダーが実際にどのようにロードしたかをデバッガ
で確認する、などをちゃんとしないと、うまくいかないかもしれない。
実際、純正の Visual Studio が出したアセンブリソースが、masm で通らない
などという現象が確認されている事からしても、色々と確認作業が必要だと
思う。
自分はアセンブリ経験が豊富だが、上記のような確認作業をかなり積んだから
こそ使えていたと思う。
アセンブラの出力は、バージョンによっても違っていることがあるかも
知れないし、64BITモードでは、同じニモニックでも異なるマシン語を
出力することもありえる。
さらに言うと、アセンブラ自体が非常に困った仕様になってしまっていることもあり得る。
もともと、アセンブリ言語は、初心者が混乱無く使えるようにはなってないという側面もある。
失礼かもしれないけど、他の言語で豊富な経験を積んで、なおかつ、地頭のいい人限定だよね、もともと。
アセンブラは、かなり細かいことを理解して無いと使いこなせないかもしれないよ。
それが C/C++ などとは違う点。
ちゃんと、リストファイルを見て、Intel の Instruction 表と照らし合わせて
どの命令が出力されているかを確認し、さらに、OBJやEXEファイルを逆アセンブル
してみて、さらにさらに、ローダーが実際にどのようにロードしたかをデバッガ
で確認する、などをちゃんとしないと、うまくいかないかもしれない。
実際、純正の Visual Studio が出したアセンブリソースが、masm で通らない
などという現象が確認されている事からしても、色々と確認作業が必要だと
思う。
自分はアセンブリ経験が豊富だが、上記のような確認作業をかなり積んだから
こそ使えていたと思う。
アセンブラの出力は、バージョンによっても違っていることがあるかも
知れないし、64BITモードでは、同じニモニックでも異なるマシン語を
出力することもありえる。
さらに言うと、アセンブラ自体が非常に困った仕様になってしまっていることもあり得る。
もともと、アセンブリ言語は、初心者が混乱無く使えるようにはなってないという側面もある。
失礼かもしれないけど、他の言語で豊富な経験を積んで、なおかつ、地頭のいい人限定だよね、もともと。
352デフォルトの名無しさん
2018/10/01(月) 09:38:14.45ID:Yquio+NL あと、一度実験した内容を正確に覚える記憶力も必要。
本で書かれていることと実際が違っていることは良くある。
本で書かれていることと実際が違っていることは良くある。
353デフォルトの名無しさん
2018/10/01(月) 10:13:48.86ID:Yquio+NL >>334
例外処理については、詳細な文献と実験調査を行ったことがある。
文献だけでは不十分で、コードをフックするような仕組みによって実験しないと分からない。
教えることは出来るが、ここでは馬鹿にされるだけなのですまんが答えられない。
例外処理については、詳細な文献と実験調査を行ったことがある。
文献だけでは不十分で、コードをフックするような仕組みによって実験しないと分からない。
教えることは出来るが、ここでは馬鹿にされるだけなのですまんが答えられない。
354デフォルトの名無しさん
2018/10/01(月) 10:26:50.53ID:8+wJeq75 IDを換えながらレスをつけてるのか
355デフォルトの名無しさん
2018/10/01(月) 23:50:29.17ID:Z1gvrlLR356デフォルトの名無しさん
2018/10/02(火) 07:08:08.55ID:+JdY6jxX >>334
Windowsならちょっとググッただけでいろいろ出てくるぞ
このあたり見てやればできるのでは?
アセンブラは全く関係ないね
構造化例外処理
http://www.ne.jp/asahi/hishidama/home/tech/vcpp/seh.html
GetExceptionCode
https://msdn.microsoft.com/ja-jp/library/cc428942.aspx
Windowsならちょっとググッただけでいろいろ出てくるぞ
このあたり見てやればできるのでは?
アセンブラは全く関係ないね
構造化例外処理
http://www.ne.jp/asahi/hishidama/home/tech/vcpp/seh.html
GetExceptionCode
https://msdn.microsoft.com/ja-jp/library/cc428942.aspx
357デフォルトの名無しさん
2018/10/02(火) 07:14:31.94ID:+JdY6jxX あとこれも
構造化例外処理と UnhandledExceptionFilter
https://www.keicode.com/windows/windows_exception_handling.php
構造化例外処理と UnhandledExceptionFilter
https://www.keicode.com/windows/windows_exception_handling.php
358デフォルトの名無しさん
2018/10/02(火) 07:41:02.78ID:+JdY6jxX359デフォルトの名無しさん
2018/10/02(火) 08:43:48.77ID:+JdY6jxX ただ、例外のハンドリングはできても、処理を続行するのは難しいね
EXCEPTION_CONTINUE_EXECUTION を返すと処理は続行されるけど
例外が発生するところから続行されるからね
例外が発生したところの次の命令から続行されるわけじゃないからね
EXCEPTION_CONTINUE_EXECUTION を返すと処理は続行されるけど
例外が発生するところから続行されるからね
例外が発生したところの次の命令から続行されるわけじゃないからね
360デフォルトの名無しさん
2018/10/02(火) 14:17:43.67ID:kh21zWRr >>359
次の命令からでも、続行する方法あるよ。
次の命令からでも、続行する方法あるよ。
361デフォルトの名無しさん
2018/10/02(火) 18:27:14.93ID:6jgE/r0r アセンブラが難しすぎて読めません
https://gyazo.com/ba3099329df9872df87fa3c35ff13384
これはFPSの弾数周辺のアセンブリなんですが、どういう処理をしてるのか全く分かりません
どういう風に読んでいけば理解できるのか?ヒント下さい
ニーモニックは何となく分かるんですけど・・
https://gyazo.com/ba3099329df9872df87fa3c35ff13384
これはFPSの弾数周辺のアセンブリなんですが、どういう処理をしてるのか全く分かりません
どういう風に読んでいけば理解できるのか?ヒント下さい
ニーモニックは何となく分かるんですけど・・
362236
2018/10/02(火) 23:02:45.96ID:XopDtnD7 ありがとう。やりたいことはメモリマップドI/Oのエミュレーションです。なので呼び出し元のコードはなるべく細工したくありません
例外ハンドラでメモリを確保してしまうと2回目以降や隣接するアドレスのアクセス時に例外が発生しなくなってしまうので避けたいです
あとWindowsで>>334をやろうとした場合0x00001000から8Byteをあける必要がありますが、そのアドレスへデータをロードしないよう
MSVCのリンカへ指示する方法がわかりません
ldやlldなどであればリンカスクリプトで指示できるらしいのですが・・・(OSの候補にLinuxやFreeBSDがいる理由の一つです)
呼び出し元のコードに細工をすれば例外なんてめんどくさい物を使わずにすみますが、エミュレートしないケースの
オーバーヘッドを完全になくせるか心配です。コンパイラの最適化でインライン展開とデッドコード削除が約束されるなら
そっちの方が遙かに楽ですが・・・
例外ハンドラでメモリを確保してしまうと2回目以降や隣接するアドレスのアクセス時に例外が発生しなくなってしまうので避けたいです
あとWindowsで>>334をやろうとした場合0x00001000から8Byteをあける必要がありますが、そのアドレスへデータをロードしないよう
MSVCのリンカへ指示する方法がわかりません
ldやlldなどであればリンカスクリプトで指示できるらしいのですが・・・(OSの候補にLinuxやFreeBSDがいる理由の一つです)
呼び出し元のコードに細工をすれば例外なんてめんどくさい物を使わずにすみますが、エミュレートしないケースの
オーバーヘッドを完全になくせるか心配です。コンパイラの最適化でインライン展開とデッドコード削除が約束されるなら
そっちの方が遙かに楽ですが・・・
363デフォルトの名無しさん
2018/10/03(水) 00:49:48.02ID:/WqVKxM1 >>362
例外機構を使わずに、以下のような方法も場合によっては使える:
1. C++ の演算子の overload を使う方法。
2. Win32のメモリマップド I/O 機能を使う方法。
>あとWindowsで>>334をやろうとした場合0x00001000から8Byteをあける必要がありますが、
>そのアドレスへデータをロードしないよう
>MSVCのリンカへ指示する方法がわかりません
これは、VitualAlloc() で、0x1000 からの 1page(4096 バイト)をアクセス禁止の page に
すると可能。
ただし、8 バイト以外の部分もアクセス禁止になるので、その部分でも、例外ハンドラ
が起動してしまうので、その部分についての処理も例外ハンドラに書くようにする。
例外機構を使わずに、以下のような方法も場合によっては使える:
1. C++ の演算子の overload を使う方法。
2. Win32のメモリマップド I/O 機能を使う方法。
>あとWindowsで>>334をやろうとした場合0x00001000から8Byteをあける必要がありますが、
>そのアドレスへデータをロードしないよう
>MSVCのリンカへ指示する方法がわかりません
これは、VitualAlloc() で、0x1000 からの 1page(4096 バイト)をアクセス禁止の page に
すると可能。
ただし、8 バイト以外の部分もアクセス禁止になるので、その部分でも、例外ハンドラ
が起動してしまうので、その部分についての処理も例外ハンドラに書くようにする。
364デフォルトの名無しさん
2018/10/22(月) 19:17:19.32ID:3rTgJh0a 最近CASLU覚えた後、実際のマイコンのアセンブリ言語覚えたくてルネサスのRL78も覚えたんだけど(PICはCASLU以前から覚えてはいた)、
x86とZ80を合わせたようなニーモニックだけかと思ったらAをR0、XをR1って別名に出来たりAXがRP0に出来たり、GR0、GR1って書くCASLUにニーモニックが似てるんだが。。。
これってもしかして癒着とかじゃあるまいな。
(逆にルネサスがCASLUに寄せた可能性も微レ存)
日本車に使われてるらしいし、自動車は国の基幹産業だし(つまりルネサスのお得意様は日本の自動車メーカー)、あり得なくはない。
x86とZ80を合わせたようなニーモニックだけかと思ったらAをR0、XをR1って別名に出来たりAXがRP0に出来たり、GR0、GR1って書くCASLUにニーモニックが似てるんだが。。。
これってもしかして癒着とかじゃあるまいな。
(逆にルネサスがCASLUに寄せた可能性も微レ存)
日本車に使われてるらしいし、自動車は国の基幹産業だし(つまりルネサスのお得意様は日本の自動車メーカー)、あり得なくはない。
365デフォルトの名無しさん
2018/10/22(月) 19:56:28.08ID:u6NjsIb0 仮想アセンブラでは、LLVM が標準
366デフォルトの名無しさん
2018/10/23(火) 14:50:58.07ID:yFsvvFWj 病院逝け
367デフォルトの名無しさん
2018/10/23(火) 18:22:26.97ID:J6rCDaEz もう少し髪が伸びたらな
368デフォルトの名無しさん
2018/11/26(月) 21:11:44.08ID:gUboiJHI LLVMネタってここで良いんですかね?
369デフォルトの名無しさん
2018/11/30(金) 09:46:12.16ID:+k7v6spR アセンブラの勉強始めていきなり躓いてるのですが、オペランドの記述で
r/m32やimm32やr32やm32って何の略なんですか?
検索しても命令一覧表ばかり引っかかって・・(;´д`)
r/m32やimm32やr32やm32って何の略なんですか?
検索しても命令一覧表ばかり引っかかって・・(;´д`)
370デフォルトの名無しさん
2018/11/30(金) 10:47:42.01ID:FCMY8z7v r32: 32bit幅レジスタ
m32: 32bit幅メモリ
imm32: 32bit幅即値
m32: 32bit幅メモリ
imm32: 32bit幅即値
371デフォルトの名無しさん
2018/11/30(金) 10:53:47.90ID:HF1f08kq 命令の内部フォーマットとアドレッシングモード
https://www.mztn.org/lxasm64/amd05.html
https://www.mztn.org/lxasm64/amd05.html
372デフォルトの名無しさん
2018/11/30(金) 15:33:43.72ID:m3TSK4YL >>367
オシャレ
オシャレ
373デフォルトの名無しさん
2018/11/30(金) 17:07:23.34ID:W1b9qzPZ >>368
知ってても答えたくないかも。
知ってても答えたくないかも。
374デフォルトの名無しさん
2018/11/30(金) 17:26:55.55ID:u043vODt >>365
あれは人間が読むコードじゃない
あれは人間が読むコードじゃない
376デフォルトの名無しさん
2018/12/02(日) 13:54:11.82ID:vFBVENFT LLVM 豆知識。
getelementptr には、似て非なるものが二種類ある。命令タイプと、定数タイプ。
後者は、他の命令のオペランドで用い、括弧でくくるような書き方をする。
仮想レジスタ %n に、整数定数を代入する命令が無い。
それで困った場合は、
%10 = add i32 定数値, 0
などとすると良い。同様にポインタ定数も直接は代入できないが、
%10 = getelementptr TYPE, TYPE * アドレス定数, 0
などとすれbな代入できる。
getelementptr には、似て非なるものが二種類ある。命令タイプと、定数タイプ。
後者は、他の命令のオペランドで用い、括弧でくくるような書き方をする。
仮想レジスタ %n に、整数定数を代入する命令が無い。
それで困った場合は、
%10 = add i32 定数値, 0
などとすると良い。同様にポインタ定数も直接は代入できないが、
%10 = getelementptr TYPE, TYPE * アドレス定数, 0
などとすれbな代入できる。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★12 [蚤の市★]
- 【🐻ニャー】京都府向日市の「クマ目撃情報」は見間違いか 市が映像確認「ネコに似ていた」 [nita★]
- 【芸能】『女芸人No.1決定戦THE W』 粗品が最後にバッサリ「優勝賞金1000万円にしてはレベル低い大会」 [冬月記者★]
- お茶輸出71年ぶり1万トン超 25年、抹茶ブームで急増 [蚤の市★]
- 今年の流行語大賞 『働いて働いて働いてまいります』が受賞で不快感… 過労自殺の遺族らが会見「家族にむち打つような行為だ」 [冬月記者★]
- 【東京】「家族で話題にして」 “世田谷一家殺害から25年 警視庁が呼びかけ [煮卵★]
- 【新潮】専門家『高市政権の物価高対策は逆効果』【経済政策】 [718678614]
- 結婚して家建てた同級生が急に老け込んだんだが何があった!!!!?
- 【悲報】日本人、GoTo価格に慣れすぎて旅行に行かなくなる🛍🙅 [476167917]
- クズ「勉強頑張らなかった奴は一生DQNと一緒に肉体労働しろ」☚勉強頑張れるのも環境と巡り合わせなんだが? [783475554]
- 【悲報】チー牛、チー牛女と付き合えばいいのになぜか付き合わない
- 【高市悲報】女がカバンにつけてる謎マスコット「ラブブ」、4ヶ月で株4兆が蒸発wwwwwwwwwwww [242521385]
