-3

在实地址模式下编写一个完整的程序:

  1. 提示用户从键盘读取 K 和 P 之间的一个大写字母。
  2. 验证输入,如果字符不在范围内,则反复提示用户,直到输入有效字符。
  3. 在每一侧显示 5 个相邻的字母。

例如,如果用户输入字母“M”,则输出将是:HIJKL M NOPQR。我尝试解决它,但我的答案是错误的

include irvine16.inc

.data
M1 byte "Enter one upper case letter between K and P : $"
letter byte 1,?,1

.code
main PROC
  mov ax, @data
  mov ds, ax

L1: mov ah,9 ;display msg m1
  lea dx,M1
  int 21h

mov ah,01h ;read a char
lea dx,letter
int 21h

mov bl,letter
CMP bl,'K'
Jb L1
CMP bl, 'P'
Ja L1


mov cx,5
lea si, letter
L3:
 dec si
loop L3

mov cx,11
lea si, letter
L2: sub si,5
  mov ah,05h
int 21h

LOOP L2



mov ah, 4ch
int 21h

main ENDP
END main
4

2 回答 2

3

这不是int 21h / function 01h 的工作方式。字符返回AL

mov ah,01h ;read a char
int 21h

cmp al,'K'

这段代码没有意义:

mov cx,5
mov  bl  
L3:
dec si 
loop L3

它不会组装,因为mov bl它不是一个有效的指令。即使这样做了,也没有任何意义。


mov ah,05h
int 21h

那不是你想要的功能。要将字符写入标准输出,您应该使用函数 02h并将字符放在DL.

于 2013-05-28T10:32:39.463 回答
0

也许您还应该考虑在中断之前推送有价值的寄存器并在之后将它们弹出。我不太记得所有 21h 函数是如何工作的,但 AFAIR 有些可能会影响例如 cx 寄存器,从而导致不可预测的循环。

于 2013-05-28T11:36:53.150 回答