为啥其他角色没有出现?
Posted
技术标签:
【中文标题】为啥其他角色没有出现?【英文标题】:Why doesn't other characters appear?为什么其他角色没有出现? 【发布时间】:2020-08-24 14:48:07 【问题描述】:我有函数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】: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
【讨论】:
以上是关于为啥其他角色没有出现?的主要内容,如果未能解决你的问题,请参考以下文章