1

私は現在、クラスに emu8086 を使用していますが、アセンブリ言語は初めてです。最初の 14 文字のアルファベットを表示する asm プログラムを作成しました。コンパイルと実行によって実行されたコマンド プロンプトで、入力から char を読み取る方法を知りたいと思っていました。私はループ内のループを考えていました。これまでの私のコードは次のとおりです。

include emu8086.inc

org 100h

 MOV CX, 14                 

 MOV AH, 2                      
 MOV DL, 65


 LOOPA-N:                       
   INT 21H                    

   INC DL
   ;INC CH
  ; CMP CH, 14  

  Loop LoopA-N

  ; JNZ LOOPA-N

 MOV AH, 03H
 INT 10H

 MOV AL, 0AH
  MOV AH, 0EH
  INT 10H

  MOV AL, 0DH
  MOV AH, 0EH
  INT 10H

 PRINTN 'Would you like to continue? '
 PRINTN 'Press c to continue ' 
 PRINTN 'Press r to start over, clear the screen, and print in the reverse order, from Z to A '
 PRINTN 'Press x to exit ' 


 c:
 MOV CX, 12
 MOV AH, 2
 MOV DL, 79
 LOOPO-Z:

 INT 21H
 INC DL

 Loop LOOPO-Z


 call GET_STRING


 mov Dl, 0DH
 INT 21H

 MOV DL, 0AH
 INT 21H

 MOV DH, 02H
 INT 10H

 MOV AH, 4CH                  
 INT 21H

 ret
END
4

1 に答える 1

0

特定のキーが押されるのを待つために、ループ内にループは必要ありません。これを行う方法の例を次に示します (NASM 構文で):

org 0x100

wait_for_input:
  mov dx,msg        ; Display the prompt
  mov ah,9
  int 21h

  mov ah,1          ; READ CHARACTER FROM STANDARD INPUT, WITH ECHO
  int 21h
  cmp al,'c'        ; The character is returned in AL
  je continue
  cmp al,'r'
  je restart
  cmp al,'x'
  je exit
  jmp wait_for_input   ; Try again

continue:
; Do whatever needs to be done here

restart:
; Do whatever needs to be done here

exit:
mov ax,04c00h
int 21h

msg db 13,10,"Press c, r or x: $"

INT 21H必要な場合に備えて、すべての関数のリファレンスを次に示します。そして、ここに の参照がありINT 10Hます。


ところで、プログラムの最後に呼び出す割り込み関数のレジスタの内容について、多くの仮定を立てています。これらの関数で使用されるすべてのレジスタを適切に設定することをお勧めします。これにより、コードが読みやすくなります。

于 2013-09-25T10:43:42.833 に答える