2016-11-22 4 views
1

アセンブリ言語のプログラムを作成していますが、スタックに文字を押し込んでコンソールに文字を表示しようとしています。私は文字の印刷に割り込み21Hのサービス番号2を使用しています。スタックを介したアセンブリ言語のputch関数

私はプログラムを実行すると、文字がコンソールに表示されますが、コンソールに無限の時間が表示されるという問題があります。私はループを使用していないので、コンソールに無限回印刷されている理由はわかりません。

問題を解明するために必要なヘルプ。

私は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 
+4

'main'の途中に' putch'プロシージャを置かないでください。 – Jester

+0

'putch'は"途中 "ですからです。 'call putch 'の後で、' AH = 4Ch/INT 21'の前です。それ以降に移動してください。また、呼び出し側で 'ret 02h'または' add sp、02h'を使用してください。もう1つのこと:あなたは 'mov ax、OFFSET st1'について確信していますか?' mov al、BYTE PTR [st1] 'であってはいけませんか? –

+0

実際に私はスタックにst1をプッシュしようとしているし、スタックを介して文字を印刷しています。もし私がこのmov al、BYTE PTR [st1]をしたら、ALが8ビットで8ビットをスタックにプッシュできないのでスタックにプッシュすることはできません。 – Yousaf

答えて

1

次の画像は、問題を示しています。あなたはputchを呼び出すと

  • プログラムは赤い矢印のようにジャンプします。
  • putchが終了すると、緑色の矢印としてコールに戻ります。
  • その後、プログラムは続けられ(青い矢印)、次の行であるputchが再び実行されます(これはループです)。

enter image description here

溶液は、プログラムを終了ブロック上に移動させることです。別の問題は、プログラムがスタックを必要とすることです。最後に@MargaretBloomは正しいです(通常通り)。あなたのコードは文字列のアドレスをプッシュしていますが、int 21hah=2を使用しているので、2つのオプションがあります。#1ah=2ah=9伴うまたは、#2プッシュアドレスと表示:

#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 
+3

これは間違っていると悪いことです。:) 'RET'は' CALL'ではなく 'putch'に戻り、2度目はプッシュされた' AX'をリターンアドレスとして使用しようとします。 – Jester

+0

@Jester、なぜパッチに戻るのですか? –

+0

@JoseManuelAbarcaRodríguezRETはCALLの後の次の行に戻ると思います。私のコードでは、CALLの次の行が再びputchになっているので、RETはそれを再びputchに戻します。 – Yousaf

関連する問題