ab.com コミュニティ https://www.activebasic.com/forum/ |
|
マシン語について https://www.activebasic.com/forum/viewtopic.php?t=4564 |
ページ 1 / 1 |
作成者: | sssooosss [ 2014年7月24日(木) 13:27 ] |
記事の件名: | マシン語について |
現在AB4でアセンブラを自作しています。 そこで、コチラのサイトに載っていたマシン語のSWAPをDOSアセンブラで逆アセンブルしたらこうなりました。 まったく意味がわかりません。なぜこうなるのでしょうか?私はZ80を少しかじった程度です。 どなたか、ご親切な方、よろしくお願いいたします。 PUSH ebp MOV ebp,esp MOV eax,[ebp+&h8] MOV ecx,[ebx+si] MOV [di+&hFC],ecx MOV edx,[di+&h8] MOV eax,[ebp+&hC] MOV ecx,[ebx+si] MOV [ebp+si],ecx MOV edx,[di+&hC] MOV eax,[ebp+&hFC] MOV [ebp+si],eax MOV esp,ebp POP ebp RET 8 -------------------------------------- 呼び出しの全コード Function SetAsm(Asm As *Byte, Size As Long) As VoidPtr SetAsm=VirtualAlloc(NULL, Size, MEM_COMMIT,PAGE_EXECUTE_READWRITE) memcpy(SetAsm,Asm,Size) EndFunction Sub FreeAsm(Func As VoidPtr) VirtualFree(Func, 0, MEM_DECOMMIT OR MEM_RELEASE) EndSub #N88BASIC Dim Asm[ELM(00000035)]=[&H55, 'PUSH ebp &H8B,&hEC, 'MOV ebp,esp &H8B,&h45,&h8, 'MOV eax,[ebp &H8B,&H08, 'MOV ecx,[ebx+si] &H89,&h4d,&hFC, 'MOV [di,ecx &H8B,&h55,&h8, 'MOV edx,[di &H8B,&h45,&hC, 'MOV eax,[ebp &H8B,&H08, 'MOV ecx,[ebx+si] &H89,&h0A, 'MOV [ebp+si],ecx &H8B,&h55,&hC, 'MOV edx,[di &H8B,&h45,&hFC, 'MOV eax,[ebp &H89,&h02, 'MOV [ebp+si],eax &H8B,&hE5, 'MOV esp,ebp &H5D, 'POP ebp &HC2,8, 'RET 8 &h00] As Byte Dim Swap3 As *Sub(p0 As *Long,p1 As *Long)'プロトタイプ宣言 Swap3 = SetAsm(Asm, ELM(35)) Dim a As Long, b As Long a=666:b=893 Print a;b Swap3(VarPtr(a),VarPtr(b)) Print a;b FreeAsm(Swap3) |
作成者: | sssooosss [ 2014年7月24日(木) 21:28 ] |
記事の件名: | Re: マシン語について |
質問者です。 DOSアセンブラの逆アセンブルが間違っているようです。。。。。。(泣) Windows7 32bit ではDOSアセンブラを使うとキーボードが英語の配列になるし、使えないのでしょうか? |
作成者: | ゲスト [ 2014年7月25日(金) 03:10 ] |
記事の件名: | Re: マシン語について |
16 ビット モードのマシン語で逆アセンブルされているように見えます。(怪しい箇所有り、後述。) 同じマシン語バイト列が、32 ビット モードだと次のように変わります。 コード: PUSH ebp MOV ebp, esp MOV eax, [ebp+&h8] MOV ecx, [eax] MOV [ebp-&h4], ecx MOV edx, [ebp+&h8] MOV eax, [ebp+&hC] MOV ecx, [eax] MOV [edx], ecx MOV edx, [ebp+&hC] MOV eax, [ebp-&h4] MOV [edx], eax MOV esp, ebp POP ebp RET 8これなら説明不要ですよね。 アセンブラ自作とのことなので少々突っ込んだ話をしますと、16 ビット モードと 32 ビット モードでは、命令語の中の ModR/M という部分の解釈が異なります。 ModR/M とは?例えば命令語の最初の 1 バイトが 8B なら MOV 命令。次の 1 バイトが ModR/M です。ModR/M の値によって、レジスタ・レジスタ間転送なのかレジスタ・メモリ間転送なのか、アドレッシングにどのレジスタを使用するのか、ディスプレースメントは有るのか、が指定されます。 今回逆アセンブラが吐いたコードは、なんか滅茶苦茶です。 基本的には 16 ビット モードの ModR/M として解釈されてはいるようですが、MOV eax, [ebp+disp8] に限っては 32 ビット モードで解釈されているのが不思議です。 ちなみに 16 ビット モードで解釈すると MOV eax, [di+disp8] になるはずです。全部 16 ビット モードとして解釈が統一されていれば、まだ理解できなくもなかったのですが…。 しかも、一見 16 ビット モードに見えますが、実はアドレス長は 32 ビット。(間接参照 [ ] の中身が 32 ビット値。)わけわからん。 引用:
Windows7 32bit
私は 64 ビット版 Windows 7 しか持っていないので正確なことはわかりませんが、推測するに 32 ビットの cmd.exe から 16 ビットの command.com が蹴られたのかな?と思います。ではDOSアセンブラを使うとキーボードが英語の配列になるし、使えないのでしょうか? 不正解とはいえ一応それっぽいコード吐いていますので、動作はするのでは? |
作成者: | sssooosss [ 2014年7月26日(土) 11:51 ] |
記事の件名: | Re: マシン語について |
ありがとうございます!PCのビット数による解釈の違いなんですね。 ODAというサイトで逆アセンブルするときちんとしたコードになりました。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |