push 和 pop 干扰 ret 指令

Push and pop interfering with ret instruction

我在 x86 汇编中写了一个简单的递归打印函数,但是,我注意到 call print 之后的所有指令都没有执行,在摸索之后,我想如果我删除 push ax, pop ax 一切正常,我对堆栈有什么遗漏吗?

代码如下:

print:
    push ax
    mov ah, 0x0e
    mov al, [bx+si]
    inc si
    cmp al, 0x00
    int 0x10
    jne print
    mov al, 0x0d
    int 0x10
    mov si,0
    pop ax
    ret

一个简单的递归函数,以空字符为基本条件,参数为bx,计数器为SI。

多亏了评论区好心人的帮助,我才找到了迭代的方法。

print:
    push ax
    mov ah, 0x0e
    mov al, [bx+si]
    inc si
    cmp al, 0x00
    int 0x10
    pop ax
    jne print
    push ax
    mov ah, 0x0e
    mov al, 0x0d
    int 0x10
    xor si,si
    pop ax
    ret

非常低效和笨拙,但它确实有效!

编辑:

我使用了 ECM 的提示,这里是一个更有效的实现:

print:
    push ax
    push si
    .loop:
    mov ah, 0x0e
    mov al, [bx+si]
    inc si
    cmp al, 0x00
    int 0x10
    jne .loop
    mov ah, 0x0e
    mov al, 0x0d
    int 0x10
    pop si
    pop ax
    ret

它更清洁、更高效。