如何在带有MASM的x86汇编代码中使用mov si,word [ecx]?

时间:2018-08-29 03:46:08

标签: assembly x86 masm masm32

我在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。我该如何补救并检验我的假设?

1 个答案:

答案 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