我正在尝试使用堆栈程序通过用户执行4个输入字符串。但我每次都失败了,因为我无法在推动时将价值放在斧头上。我正在做pop,以便我可以保存以前的值并使其显示。对此有任何想法,也请告诉我我在哪里写错了逻辑。在此先感谢以下是代码:
.MODEL tiny
.data
st1 db "Enter string$"
newline db 0D
.code
main proc
mov dx, offset st1
; push bx
MOV si,0
mov di,2
call fun
mov ah,04ch
int 21h
fun proc near
push ax
cmp si,4
je exitt
call gets
pop ax
mov [si],ax
inc si
inc di
inc di
call fun
exitt: ret
fun endp
disp proc near
; mov dx,offset newline
PUSH BP
mov bp,sp
mov dx,[bp+2]
mov ah,9h
int 21h
POP BP
ret
disp endp
gets proc near
PUSH BP
mov bp,sp
mov dx,[bp+DI]
mov ah,0ah
int 21h
POP BP
ret
gets endp
答案 0 :(得分:0)
我相信如果你经历这个,你一定会找到答案。这些幻灯片是我的大学笔记。非常有助于对汇编语言的基本理解:)
https://www.dropbox.com/sh/2p83odizfzi0pvv/i5Etrg68Vf/wk10-Stack.ppt
http://comp323.wordpress.com/
答案 1 :(得分:0)
这些说明顺序错误:
push ax
cmp si,4
je exitt
当si
等于4并且您跳转到exitt
时,您永远不会弹出ax
,因此ax
的保存值仍将在堆栈中{{1因此导致你回到错误的地方。
您应将其更改为:
ret
我注意到您正在使用像cmp si,4
je exitt
push ax
这样的硬编码地址来存储字符串数据。虽然它可能在DOS中起作用,但编写这样的代码通常是个坏主意。最好分配一个缓冲区(静态或动态)来保存数据。