我在x86汇编代码中有一组指令,如下所示:
[0x401240]
mov edx, str.HelloWorld
mov eax, ecx
push esi
|
|
v
[0x401248]
mov si, word [eax]
cmp si, word [edx]
jne 0x40126e
ecx
是程序运行后传递给程序的字符串。我对汇编语言完全陌生,所以我不完全确定这里发生了什么,但是我认为行mov si, word [eax]
的意思是“从eax
中取出两个字节,并将si
设置为相等为此,为了测试这一点,我想编写自己的小脚本以将该操作的结果打印到控制台。因此,使用Internet上的教程,我将它们汇总在一起:
.386
.model flat, stdcall
option casemap :none
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
message db "Hello world!", 0
.code
main:
mov si, word [message]
invoke StdOut, si
invoke ExitProcess, 0
end main
不幸的是,通过\masm32\bin\ml /c /Zd /coff test.asm
运行它会导致test.asm(16): error A2009: syntax error in expression
。我该如何补救并检验我的假设?
答案 0 :(得分:2)
mov si, word [message]
是NASM语法。 MASM中的等效项是
mov si, word ptr [message]
几乎所有用于32位Windows的过程都需要DWORD作为参数。 SI
是一个单词。更改
invoke StdOut, si
到
invoke StdOut, esi
MASM32过程StdOut
需要一个指向以空终止的字符串的指针。使用MOV
可以获取值,而不是指针。使用LEA
获取指针。更改
mov si, word ptr [message]
到
lea esi, [message]
或者,您可以立即加载指针:
mov esi, OFFSET message
您的基本问题的答案是:mov si, word [eax]
将EAX
指向的WORD装入寄存器SI
,它是ESI
的下部。要测试的脚本应如下所示:
INCLUDE \masm32\include\masm32rt.inc
.data
message db "Hello world!", 0
.code
main:
xor esi, esi
mov eax, OFFSET message
mov si, WORD PTR [eax]
printf ("0x%x",esi)
invoke ExitProcess, 0
end main