putch函数通过堆栈汇编语言

时间:2016-11-22 15:22:28

标签: assembly x86 dos emu8086

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

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

帮助需要找出问题。

我正在使用emu8086。

@RunWith(MockitoJUnitRunner.class)

1 个答案:

答案 0 :(得分:1)

下一张图片说明了问题:

  • 当您致电putch时,程序会跳转为红色箭头。
  • putch完成后,它将以绿色箭头返回呼叫。
  • 然后程序继续(蓝色箭头)并执行下一行,再次putch(这是一个循环)。

enter image description here

解决方案是移动到完成程序的块之上。另一个问题是你的程序需要一个堆栈。最后,@ 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