如何在堆栈中动态放置(推送)输入值并弹出并放入某个寄存器中进行显示

时间:2014-01-09 06:21:53

标签: assembly

我正在尝试使用堆栈程序通过用户执行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

2 个答案:

答案 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中起作用,但编写这样的代码通常是个坏主意。最好分配一个缓冲区(静态或动态)来保存数据。