如何使用 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