如何使用 MASM 在我的 x86 汇编代码中使用 mov si, word[ecx]?
How do I use mov si, word[ecx] in my x86 assembly code with MASM?
我有一组 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
相等到那个。为了对此进行测试,我想编写自己的小脚本以将此操作的结果打印到控制台。因此使用互联网上的教程,我将其放在一起:
.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
。我该如何解决这个问题并验证我的假设?
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
我有一组 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
相等到那个。为了对此进行测试,我想编写自己的小脚本以将此操作的结果打印到控制台。因此使用互联网上的教程,我将其放在一起:
.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
。我该如何解决这个问题并验证我的假设?
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