問題描述
彙編語言中的putch函數通過堆棧 (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
參考解法
方法 1:
Next image illustrates the problem :
- When you call
putch
the program jumps as the red arrow. - When
putch
finishes it returns to the call as the green arrow. - Then the program continues (blue arrow) and executes the next line, which is
putch
again (that's a loop).
The solution is to move above the block that finishes the program. Another problem is that your program requires a stack. Finally, @MargaretBloom is right (as usual), your code is pushing the address of the string, but you are using int 21h
ah=2
to display the char, so there are two options : #1 push the char and display with ah=2
, or, #2 push the address and display with 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
(by Yousaf、Jose Manuel Abarca Rodríguez)