为啥其他角色没有出现?

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

【讨论】:

以上是关于为啥其他角色没有出现?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的角色没有使用此代码移动?

为啥 SQL Server 不允许我启用混合身份验证模式,以便我可以使用 sa 用户将角色分配给其他用户?

Discord.js 获取所有具有特定角色的成员

个人成长学习讨论小组练习2:角色

为啥 PostgreSQL 将用户和组合并为角色?

为啥“Azure Kubernetes 服务 RBAC 读者”角色允许部署写入