如何接受带有大(多位)数字的输入

时间:2016-09-02 16:06:58

标签: assembly x86 dos x86-16

如何接受大量输入然后比较它,例如

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

2 个答案:

答案 0 :(得分:1)

如果您需要接受多个数字的数字,则需要执行两个步骤:

  1. 将数字接受为字符串,而不是单个字符。
  2. 使用过程将字符串转换为数字。
  3. 这是你接受字符串的方式:

    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!这是故意的吗?