为什么其他角色没有出现?



我有一个函数print,它在寄存器dl中获取字节,并将其作为字符打印到控制台。我将一些字节放入内存,然后从内存点移动到dl并调用print函数,但第二次调用它时,它不会打印字符(第一次运行良好(。我使用的是Windows10,并组装到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
如果不降低stackpointer,则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

相关内容

最新更新