如何接受大量输入然后比较它,例如
mov ah,01h
int 21h
我想接受多个字符并将该号码移动到al以访问端口闪烁由用户示例的输入引导,用户想要键入32但是单个字符是
mov bl,al
delay:
mov ctr,'0'
mov al,bl
mov cx,100
skip:
x:
mov al,00000000b
mov dx,378h
out dx,al
loop x
Z: mov al,bl
mov dx,378h
out dx,al
loop z
inc ctr
Cmp ctr,'8'
Je exit
jmp skip
Exit :
Mov ah,4ch
int 21h
End start
答案 0 :(得分:1)
如果您需要接受多个数字的数字,则需要执行两个步骤:
这是你接受字符串的方式:
mov ah, 0ah
mov dx, the_string
int 21h
变量the_string
需要以下特定格式:
the_string db 26 ;MAX NUMBER OF CHARACTERS ALLOWED (25).
db ? ;LENGTH (NUMBER OF CHARACTERS ENTERED BY USER).
db 26 dup (?) ;CHARACTERS ENTERED BY USER (END WITH 0AH).
注意三个部分:第一个字节表示允许的最大字符数(加上一个因为末尾的ENTER键),第二个字节将存储输入字符串的长度,第三个字节是数组chars(以ENTER键='0ah'结束)。
一旦接受了字符串,就必须将其转换为具有已知算法的数字:从右到左处理字符乘以10的幂。我们将此过程称为“string2number”。
过程“string2number”接受一个参数:register SI
指向字符串变量(具有三个部分的变量)。该号码在寄存器BX
中返回。如果数字很小,则可能适合BL
。这个程序对你未来的程序非常有用。
接下来是您的代码,其中包含更改和过程“string2number”:
.model small
.stack 100h
.data
str db 4 ;MAX NUMBER OF CHARACTERS ALLOWED (3).
db ? ;LENGTH (NUMBER OF CHARACTERS ENTERED BY USER).
db 4 dup (?) ;CHARACTERS ENTERED BY USER (END WITH 0AH).
ctr db 0
.code
mov ax, @data
mov ds, ax
; mov ah,01h
; int 21h
mov ah, 0ah ;◄■ CAPTURE STRING FROM KEYBOARD.
mov dx, offset str ;◄■ VARIABLE TO STORE THE STRING.
int 21h
mov si, offset str ;◄■ STRING TO CONVERT INTO NUMBER.
call string2number ;◄■ NUMBER WILL RETURN IN BX.
mov al, bl ;◄■ COPY NUMBER INTO AL.
delay:
mov ctr,'0'
mov al,bl
mov cx,100
skip:
x:
mov al,00000000b
mov dx,378h
out dx,al
loop x
Z: mov al,bl
mov dx,378h
out dx,al
loop z
inc ctr
Cmp ctr,'8'
Je exit
jmp skip
Exit :
Mov ah,4ch
int 21h
; End start
;▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
;CONVERT STRING TO NUMBER IN BX.
;SI MUST ENTER POINTING TO THE STRING.
proc string2number
;MAKE SI TO POINT TO THE LEAST SIGNIFICANT DIGIT.
inc si ;POINTS TO THE NUMBER OF CHARACTERS ENTERED.
mov cl, [ si ] ;NUMBER OF CHARACTERS ENTERED.
mov ch, 0 ;CLEAR CH, NOW CX==CL.
add si, cx ;NOW SI POINTS TO LEAST SIGNIFICANT DIGIT.
;CONVERT STRING.
mov bx, 0
mov bp, 1 ;MULTIPLE OF 10 TO MULTIPLY EVERY DIGIT.
repeat:
;CONVERT CHARACTER.
mov al, [ si ] ;CHARACTER TO PROCESS.
sub al, 48 ;CONVERT ASCII CHARACTER TO DIGIT.
mov ah, 0 ;CLEAR AH, NOW AX==AL.
mul bp ;AX*BP = DX:AX.
add bx,ax ;ADD RESULT TO BX.
;INCREASE MULTIPLE OF 10 (1, 10, 100...).
mov ax, bp
mov bp, 10
mul bp ;AX*10 = DX:AX.
mov bp, ax ;NEW MULTIPLE OF 10.
;CHECK IF WE HAVE FINISHED.
dec si ;NEXT DIGIT TO PROCESS.
loop repeat ;COUNTER CX-1, IF NOT ZERO, REPEAT.
ret
endp
答案 1 :(得分:0)
要输入一个2位数的数字,您只需重复输入1个字符2次并合并结果:
mov ah, 01h
int 21h
sub al, '0'
mov bl, al ;1st digits "tens"
mov ah, 01h
int 21h
sub al, '0' ;2nd digit "units"
xchg al, bl
mov ah, 10
mul ah
add al,bl
如果第一个输入是字符" 3"那么AL将保持你的号码32。第二个输入是字符" 2"。
如果不重新初始化CX寄存器,您的Z循环将迭代65536次,因为在X循环结束时,CX寄存器将为0!这是故意的吗?