通过堆栈以汇编语言输入函数
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
我正在用汇编语言编写一个程序,我试图通过将字符压入堆栈来在控制台上显示该字符。我正在使用中断 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