mov ax, @data
mov dx, ax
您想在此处初始化DS 段寄存器,但错误地写入了DX。诚实的错字,但您的代码会以这种方式破坏程序段前缀。
我正在尝试从用户那里获取一串被 ENTER 键终止或字符串长度达到 20 的数字
很明显,您需要一个循环来执行此操作,并且 您将需要 2 次测试来决定何时停止!
- 测试
AL中的字符是否为13
- 测试一个计数器(例如
CX)看看它是否达到了20
xor cx, cx ; Empty counter
mov si, offset var1
TheLoop:
mov ah, 01h ; DOS.GetCharacter
int 21h ; -> AL
cmp al, 13
je programend
mov [si], al
inc si
inc cx
cmp cx, 20
jb TheLoop
programend:
但是等等,任务不是说它必须是一串数字吗?您需要确保输入确实是一个数字。
数字“0”到“9”的 ASCII 码是 48 到 57。
xor cx, cx ; Empty counter
mov si, offset var1
TheLoop:
mov ah, 01h ; DOS.GetCharacter
int 21h ; -> AL
cmp al, 13
je programend
cmp al, 48
jb TheLoop ; Not a number
cmp al, 57
ja TheLoop ; Not a number
mov [si], al
inc si
inc cx
cmp cx, 20
jb TheLoop
programend:
不使用单独的计数器并使用汇编器将字符转换为代码的能力:
mov si, offset var1
TheLoop:
mov ah, 01h ; DOS.GetCharacter
int 21h ; -> AL
cmp al, 13
je programend
cmp al, "0"
jb TheLoop ; Not a number
cmp al, "9"
ja TheLoop ; Not a number
mov [si], al
inc si
cmp si, offset var1 + 20
jb TheLoop
programend: