1

我目前正在使用 emu8086 上课,而且我对汇编语言非常陌生。我创建了一个 asm 程序来显示前 14 个字母的字母表。我想知道如何从编译和运行执行的命令提示符中的输入中读取字符。我在想一个循环中的一个循环。到目前为止,这是我的代码:

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 回答