如果您需要接受多于一位的数字,您需要执行两个步骤:
- 接受数字作为字符串,而不是单个字符。
- 使用过程将字符串转换为数字。
这是你接受字符串的方式:
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 键),第二个字节将存储输入字符串的长度,第三个部分是数组字符(以 ENTER 键 = '0ah' 结尾)。
一旦您接受了字符串,就需要使用已知算法将其转换为数字:从右到左处理每个字符乘以 10 的幂。我们将此过程称为“string2number”。
过程“string2number”有一个参数:寄存器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