8086 汇编程序函数 0ah int 21h
8086 assembly program function 0ah int 21h
程序应该接受一个字符和一个奇数(最多 21)。
我的问题是它似乎无法正确接受输入,因为它总是跳转到显示错误部分。我的代码有什么问题?
.model small
.stack
.386
.data
msg db "Input a character and an odd number(max 21): $"
msg1 db 10,13,"ERROR: Input an odd number number after the character", 10, 13, '$'
msg2 db 10,13, "ERROR: Number is not an odd number", 10, 13, '$'
inp db ?,?,?
.code
main proc far
again: mov ax,@data
mov ds, ax
mov ah, 9
lea dx, msg
int 21h
lea dx, inp
mov ah, 0Ah
int 21h
;*********number check******
mov bl, inp+1
or bl, 30h ; add 30h
cmp bl,30h ; '0'
jnge notnum ; <-------PROGRAM ALWAYS GO HERE FOR ANY INPUT I MAKE
cmp bl,39h ; '9'
jnle notnum
mov bl, inp+2
cmp bl, 00h
je numIsOneDigit
or bl, 30h
cmp bl,30h ; '0'
jnge notnum
cmp bl,39h ; '9'
jnle notnum
;***************************
;****if odd number check****
;numIsTwoDigit
mov cl, inp+2
shr cl, 1
jnc notOdd
jmp drawDiamond
numIsOneDigit:
mov ch, inp+1
shr ch, 1
jnc notOdd
jmp drawDiamond
;***************************
;********ERRORS*************
notnum:
mov ah, 9
lea dx, msg1
int 21h
jmp again
notOdd:
mov ah,9
lea dx, msg2
int 21h
jmp again
;************************
drawDiamond:
;some code here
exit:
mov ah, 4ch
int 21h
main endp
end main
测试程序:
inp db ?,?,?
既然你想使用DOS输入功能0Ah你需要提供正确的输入结构。您将此结构定义为只有 3 个未初始化的字节,但 DOS 期望第一个字节保存缓冲区长度,第二个字节保留,因此它可以 return 您实际输入的字符数。
知道最多输入3个字符,正确的结构是:
inp db 4,0,4 dup (0)
它是 4(不是 3),因为 DOS 还会在输入字符串的末尾附加一个回车 return 代码 (13)。这个额外的字节将不包含在您在第二个字节中收到的计数中!
更正此问题后,您还需要更改程序的其余部分!
;*********number check******
mov bl, inp+1
or bl, 30h ; add 30h
cmp bl,30h ; '0'
第一个数字(如果有的话)将在 inp+3。
第二个数字(如果有的话)将在 inp+4。
这些数字已经是字符了,所以我不明白你为什么要写几次or bl, 30h
。
mov bl, inp+2
cmp bl, 00h
je numIsOneDigit
如果此比较想要检查第二个数字是否可用,那么您需要与 13 进行比较(而不是与 0 进行比较)。
程序应该接受一个字符和一个奇数(最多 21)。
我的问题是它似乎无法正确接受输入,因为它总是跳转到显示错误部分。我的代码有什么问题?
.model small
.stack
.386
.data
msg db "Input a character and an odd number(max 21): $"
msg1 db 10,13,"ERROR: Input an odd number number after the character", 10, 13, '$'
msg2 db 10,13, "ERROR: Number is not an odd number", 10, 13, '$'
inp db ?,?,?
.code
main proc far
again: mov ax,@data
mov ds, ax
mov ah, 9
lea dx, msg
int 21h
lea dx, inp
mov ah, 0Ah
int 21h
;*********number check******
mov bl, inp+1
or bl, 30h ; add 30h
cmp bl,30h ; '0'
jnge notnum ; <-------PROGRAM ALWAYS GO HERE FOR ANY INPUT I MAKE
cmp bl,39h ; '9'
jnle notnum
mov bl, inp+2
cmp bl, 00h
je numIsOneDigit
or bl, 30h
cmp bl,30h ; '0'
jnge notnum
cmp bl,39h ; '9'
jnle notnum
;***************************
;****if odd number check****
;numIsTwoDigit
mov cl, inp+2
shr cl, 1
jnc notOdd
jmp drawDiamond
numIsOneDigit:
mov ch, inp+1
shr ch, 1
jnc notOdd
jmp drawDiamond
;***************************
;********ERRORS*************
notnum:
mov ah, 9
lea dx, msg1
int 21h
jmp again
notOdd:
mov ah,9
lea dx, msg2
int 21h
jmp again
;************************
drawDiamond:
;some code here
exit:
mov ah, 4ch
int 21h
main endp
end main
测试程序:
inp db ?,?,?
既然你想使用DOS输入功能0Ah你需要提供正确的输入结构。您将此结构定义为只有 3 个未初始化的字节,但 DOS 期望第一个字节保存缓冲区长度,第二个字节保留,因此它可以 return 您实际输入的字符数。
知道最多输入3个字符,正确的结构是:
inp db 4,0,4 dup (0)
它是 4(不是 3),因为 DOS 还会在输入字符串的末尾附加一个回车 return 代码 (13)。这个额外的字节将不包含在您在第二个字节中收到的计数中!
更正此问题后,您还需要更改程序的其余部分!
;*********number check****** mov bl, inp+1 or bl, 30h ; add 30h cmp bl,30h ; '0'
第一个数字(如果有的话)将在 inp+3。
第二个数字(如果有的话)将在 inp+4。
这些数字已经是字符了,所以我不明白你为什么要写几次or bl, 30h
。
mov bl, inp+2 cmp bl, 00h je numIsOneDigit
如果此比较想要检查第二个数字是否可用,那么您需要与 13 进行比较(而不是与 0 进行比较)。