通过堆栈以汇编语言输入函数

putch function in assembly language through stack

我正在用汇编语言编写一个程序,我试图通过将字符压入堆栈来在控制台上显示该字符。我正在使用中断 21H 的服务号 2 来打印字符。

当我 运行 程序时,字符显示在控制台上,但问题是它在控制台上显示无限次。我没有使用任何循环,所以不知道为什么它会在控制台上无限次打印。

需要帮助来解决问题。

我用的是emu8086

.model small
.data
st1 db "A",'$' 
.code
main proc
    mov AX,@data
    mov DS, AX

    mov AX, offset st1
    push AX

    call putch

    putch proc near
        mov BP,SP 
        mov DX,[BP+2]
        mov AH,2
        INT 21H
        ret
    putch endp 

    mov AH,4CH
    INT 21H

end main 

下一张图片说明了问题:

  • 当你调用putch时程序跳转为红色箭头。
  • putch完成时returns到调用绿色箭头。
  • 然后程序继续(蓝色箭头)并执行下一行,再次是 putch(这是一个循环)。

解决方案是移动到完成程序的块上方。另一个问题是你的程序需要一个堆栈。最后,@MargaretBloom 是对的(像往常一样),您的代码正在推送字符串的地址,但是您使用 int 21h ah=2 来显示字符,因此有两个选项:#1 压入字符并用 ah=2 显示,或者 #2 压入地址并用 ah=9 显示 :

#1

.model small
.stack 100h              ;◄■■ STACK!!!
.data
st1 db "A",'$' 
.code
main proc
    mov AX,@data
    mov DS, AX

    xor ax, ax           ;◄■■ CLEAR AX.
    mov AL, st1          ;◄■■ CHAR IN AX.
    push AX              ;◄■■ PUSH THE CHAR.

    call putch

    mov AH,4CH           ;◄■■ FINISH PROGRAM HERE.
    INT 21H

    putch proc near
        mov BP,SP 
        mov DX,[BP+2]    ;◄■■ THE CHAR.
        mov AH,2         ;◄■■ 2 = DISPLAY ONE CHAR.
        INT 21H
        ret
    putch endp 

end main 

#2

.model small
.stack 100h              ;◄■■ STACK!!!
.data
st1 db "A",'$' 
.code
main proc
    mov AX,@data
    mov DS, AX

    mov AX, offset st1   ;◄■■ GET THE ADDRESS.
    push AX              ;◄■■ PUSH THE ADDRESS.

    call putch

    mov AH,4CH         
    INT 21H

    putch proc near
        mov BP,SP 
        mov DX,[BP+2]    ;◄■■ GET THE ADDRESS.
        mov AH,9         ;◄■■ 9 = DISPLAY STRING '$' TERMINATED.
        INT 21H
        ret
    putch endp 

end main