代码之家  ›  专栏  ›  技术社区  ›  tblznbits

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

  •  1
  • tblznbits  · 技术社区  · 6 年前

    我在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 . 我怎样才能纠正这一点并检验我的假设?

    1 回复  |  直到 6 年前
        1
  •  2
  •   rkhb    6 年前

    mov si, word [message] 是NASM语法。MASM中的等价项是

    mov si, word ptr [message]
    

    几乎所有32位Windows的过程都需要DWORDs作为参数。 SI 是一个词。改变

    invoke StdOut, si
    

    invoke StdOut, esi
    

    MASM32程序 StdOut 需要指向以null结尾的字符串的指针。与 MOV LEA 获取指针。改变

    mov si,word ptr[信息]
    

    lea esi, [message]
    

    或者,您可以立即加载指针:

    mov esi, OFFSET message
    

    你根本问题的答案是: mov si, word [eax] 加载所指的单词 EAX 进入登记册 哪一个是下半部 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