【问题标题】:how can i input 2 digit number in assembly emu8086如何在汇编emu8086中输入2位数字
【发布时间】:2016-10-15 14:13:30
【问题描述】:
mov ah,01h
int 21h

我知道这是您输入一位数字或字符的方式,但我如何输入例如数字 38。 谢谢

【问题讨论】:

  • 读取两位数字并从中制作一个数字。
  • 你的意思是我应该把上面的代码写两次?
  • 这是一个选项。然后将你读到的两个数字组合成一个数字。
  • 考虑使用函数0Ah而不是01h

标签: assembly emu8086


【解决方案1】:

这应该适合你:

.model small
.data
.code

mov ax, @data
mov ds, ax 

mov dl, 10  
mov bl, 0         

scanNum:

      mov ah, 01h
      int 21h

      cmp al, 13   ; Check if user pressed ENTER KEY
      je  exit 

      mov ah, 0  
      sub al, 48   ; ASCII to DECIMAL

      mov cl, al
      mov al, bl   ; Store the previous value in AL

      mul dl       ; multiply the previous value with 10

      add al, cl   ; previous value + new value ( after previous value is multiplyed with 10 )
      mov bl, al

      jmp scanNum    

exit:

      mov ah, 04ch   
      int 21h

 end

【讨论】:

  • 如果您要循环获取任意位数,那么获得 16 位结果会更有意义,这样您就可以处理高达 65535 的输入。您必须更改您的函数将10 保留在其他位置,因为mul dx 写入DX:AX。 (或者使用 shift 和 add 而不是 mul,这样您就可以将 AX 和 DX 留给 int 21h 调用。)
【解决方案2】:
.MODEL SMALL
 .STACK 100H

 .DATA
    PROMPT_1  DB  'Enter the First digit : $'
    PROMPT_2  DB  'Enter the Second digit : $'
    PROMPT_3  DB  'Sum of First and Second digit : $'

 .CODE
   MAIN PROC
     MOV AX, @DATA                ; initialize DS
     MOV DS, AX

     LEA DX, PROMPT_1             ; load and display the PROMPT_1
     MOV AH, 9
     INT 21H

     MOV AH, 1                    ; read a character\\digit
     INT 21H

     MOV BL, AL                   ; save First digit in BL in ASCII code
     SUB BL, 30H

     MOV AH, 2                    ; carriage return
     MOV DL, 0DH
     INT 21H

     MOV DL, 0AH                  ; line feed
     INT 21H

     LEA DX, PROMPT_2             ; load and display the PROMPT_2
     MOV AH, 9
     INT 21H

     MOV AH, 1                    ; read a character
     INT 21H

     MOV BH, AL                   ; save Second digit in BH in ASCII CODE
     SUB BH, 30H

     MOV AH, 2                    ; carriage return
     MOV DL, 0DH
     INT 21H

     MOV DL, 0AH                  ; line feed
     INT 21H

     LEA DX, PROMPT_3             ; load and display the PROMPT_3
     MOV AH, 9
     INT 21H

     ADD BL, BH                   ; add First and Second digit
     ADD BL, 30H                  ; convert ASCII to DECIMAL code

     MOV AH, 2                    ; display the character
     MOV DL, BL     
     INT 21H

     MOV AH, 4CH                  ; return control to DOS
     INT 21H
   MAIN ENDP
 END MAIN

【讨论】:

  • 这两个独立的 1 位数字相加;它不会读取 2 位数字并将其转换为 0..99 的整数与 digit1 * 10 + digit2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多