Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么';没有其他字符出现吗?_Assembly_Nasm - Fatal编程技术网

Assembly 为什么';没有其他字符出现吗?

Assembly 为什么';没有其他字符出现吗?,assembly,nasm,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

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

调用print指令覆盖字符!您需要调整RSP

如果不降低堆栈指针,CPU将把
调用
指令中的返回地址放在您写入字符的地方

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