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

问题描述

我有一个函数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

解决方法

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