【问题标题】:how to accept input with a large (multi-digit) number如何接受大(多位)数字的输入
【发布时间】:2016-09-02 16:06:58
【问题描述】:

如何接受大数字的输入然后进行比较

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

【问题讨论】:

  • 是的,我想延迟一下才能看到在连接并行端口时发生了什么,所以我使用 cx,作为 100
  • 老兄,我的回答让你输入你想要的号码。将我的代码复制粘贴到您的编译器中并进行测试。

标签: assembly x86 dos x86-16


【解决方案1】:

要输入一个 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”,第二个输入是字符“2”,这里 AL 将保存您的数字 32。


如果不重新初始化 CX 寄存器,您的 Z 循环将迭代 65536 次,因为在 X 循环结束时,CX 寄存器将为 0!这是故意的吗?

【讨论】:

  • 我想要用户的输入,我想将其作为数字获取,然后将其用作寄存器的值,因此程序将获取它,然后使用它来输出并行端口灯的地址
【解决方案2】:

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

  1. 接受数字作为字符串,而不是单个字符。
  2. 使用过程将字符串转换为数字。

这是你接受字符串的方式:

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    

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 2023-04-04
    • 2014-02-25
    • 2021-12-20
    • 1970-01-01
    • 2021-07-10
    • 2023-04-08
    • 2019-10-24
    相关资源
    最近更新 更多