ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 03:37

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




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - マシン語について
作成者 メッセージ
  記事の件名:  Re: マシン語について  引用付きで返信する
ありがとうございます!PCのビット数による解釈の違いなんですね。
ODAというサイトで逆アセンブルするときちんとしたコードになりました。
投稿記事 Posted: 2014年7月26日(土) 11:51
  記事の件名:  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
ではDOSアセンブラを使うとキーボードが英語の配列になるし、使えないのでしょうか?
私は 64 ビット版 Windows 7 しか持っていないので正確なことはわかりませんが、推測するに 32 ビットの cmd.exe から 16 ビットの command.com が蹴られたのかな?と思います。
不正解とはいえ一応それっぽいコード吐いていますので、動作はするのでは?
投稿記事 Posted: 2014年7月25日(金) 03:10
  記事の件名:  Re: マシン語について  引用付きで返信する
質問者です。
DOSアセンブラの逆アセンブルが間違っているようです。。。。。。(泣)
Windows7 32bit
ではDOSアセンブラを使うとキーボードが英語の配列になるし、使えないのでしょうか?
投稿記事 Posted: 2014年7月24日(木) 21:28
  記事の件名:  マシン語について  引用付きで返信する
現在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)
投稿記事 Posted: 2014年7月24日(木) 13:27

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


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