ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 22:52

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 
作成者 メッセージ
 記事の件名: マシン語について
投稿記事Posted: 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)


通報する
ページトップ
   
 記事の件名: Re: マシン語について
投稿記事Posted: 2014年7月24日(木) 21:28 
質問者です。
DOSアセンブラの逆アセンブルが間違っているようです。。。。。。(泣)
Windows7 32bit
ではDOSアセンブラを使うとキーボードが英語の配列になるし、使えないのでしょうか?


通報する
ページトップ
   
 記事の件名: Re: マシン語について
投稿記事Posted: 2014年7月25日(金) 03:10 
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
ではDOSアセンブラを使うとキーボードが英語の配列になるし、使えないのでしょうか?
私は 64 ビット版 Windows 7 しか持っていないので正確なことはわかりませんが、推測するに 32 ビットの cmd.exe から 16 ビットの command.com が蹴られたのかな?と思います。
不正解とはいえ一応それっぽいコード吐いていますので、動作はするのでは?


通報する
ページトップ
   
 記事の件名: Re: マシン語について
投稿記事Posted: 2014年7月26日(土) 11:51 
ありがとうございます!PCのビット数による解釈の違いなんですね。
ODAというサイトで逆アセンブルするときちんとしたコードになりました。


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot], DotBot & ゲスト[18人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean