为什么没有其他字符出现?

时间:2020-08-24 14:48:07

标签: assembly nasm

我有一个函数print,该函数在寄存器dl处取字节,并将其作为字符输出到控制台。我将一些字节放入内存中,然后从该内存位置移至dl并调用print函数,但是第二次调用该函数时,它不会打印字符(第一次工作正常)。我正在使用Windows 10并组装到64位。

我希望它打印AB,但仅打印A

    push    rbp
    mov     rbp, rsp

    mov     DWORD [rbp-4], 'ABCD'
    mov     DWORD [rbp-8], 'XYZH'


    mov     dl, BYTE [rbp-4]
    call print

    mov     dl, BYTE [rbp-3]
    call print

    mov     eax, 0
    pop     rbp
    ret

以及其中定义的打印功能:

print:
    lea rax, var
    mov BYTE [rax], dl

    sub     rsp, 8+8+8+32
    mov     ecx, -11
    call    GetStdHandle

    mov     rcx, rax
    mov     rdx, var
    mov     r8,  1
    lea     r9,  [rsp-16]
    mov     QWORD [rsp-56], 0
    call    WriteConsoleA


    add     rsp, 8+8+32+8
    ret
在数据部分var

中定义

var: db 0

1 个答案:

答案 0 :(得分:2)

call print指令将覆盖字符!您需要调整RSP
如果不降低堆栈指针,则CPU将把call指令中的返回地址放在您编写字符的位置。

push    rbp
mov     rbp, rsp
sub     rsp, 8

mov     DWORD [rbp-4], 'ABCD'
mov     DWORD [rbp-8], 'XYZH'


mov     dl, BYTE [rbp-4]
call print

mov     dl, BYTE [rbp-3]
call print

mov     eax, 0
mov     rsp, rbp
pop     rbp
ret