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
它更清洁、更高效。
我在 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
它更清洁、更高效。