汇编十进制输入输出详解,各种进制输入输出

Posted Afololer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编十进制输入输出详解,各种进制输入输出相关的知识,希望对你有一定的参考价值。

注意:

输入的是ascll码,'0’对应的是30H,减去30在寄存器存的才是0,如果输入不在范围内,不增加到寄存器

获取输入’0’,30H之后的处理

  1. 减去30H,如果是A~Z则减去55,因为’A’为41H,即65
  2. 每次接收新一位数时,前面的数都应乘相应进制
  3. 再加上新一位的数
  4. 没有接收到回车时,2、3循环

十六进制输入十进制输出(输入存在bx寄存器)

DATAS SEGMENT
    ;此处输入数据段代码  
    num db 65,48,48,48,10
    crlf db 10,13,'$' ;换行
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
main proc
START:
    MOV AX,DATAS
    MOV DS,AX
    call Hin ;十六进制输入 A000
    call crl
    call output ;十进制输出
    MOV AH,4CH
    INT 21H
    ret
main endp

Hin proc
    mov bx,0
    mov ax,0
    mov dl,16
    mov si,0
L1:
    mov cl,4
    
    mov al,num[si]
    inc si
    cmp al,10
    jz ou
    cmp al,30H
    JB ou
    cmp al,39H
    JA char
    sub al,30H
    rol bx,cl
    add bx,ax
    JMP L1
char:
    cmp al,41H
    JB ou
    cmp al,46H
    JA ou
      sub al,55
         rol bx,cl
    add bx,ax
    JMP L1 
ou:
    ret
Hin endp

crl proc
    push dx
    push ax
    lea dx,crlf
    mov AH,9
    int 21H
    pop ax
    pop dx
    ret

crl endp 

output proc
             mov   cx, 10000d
         call  dec_div
         mov   cx, 1000d
         call  dec_div
         mov   cx, 100d
         call  dec_div
         mov   cx, 10d
         call  dec_div
         mov   cx, 1d
         call  dec_div
    ret
output endp

dec_div proc
    mov   ax, bx
         mov   dx, 0
         div   cx
         mov   bx, dx
         mov   dl, al
         add   dl, 30h
         mov   ah, 2
         int   21h
         ret

dec_div endp
CODES ENDS
    END START

十进制输入输出(难点)

  • 留的空间不能是5,否则无法输入空格
  • 要用ax进行乘10,否则只能算0~255,此时每次输入ah要清零,因为是两个数连着输入的
  • 数存在bx,因为ax经常变
  • 不能用dx做临时的寄存器,因为ax进行mul操作后dx会清零
DATAS SEGMENT
    ;此处输入数据段代码  
     num db 6,?,6 dup(?)
         ;num db 49,5,51,48,48,48,48,10
        N dw 10
    crlf db 10,13,'$'
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
main proc
START:
    MOV AX,DATAS
    MOV DS,AX
    call Oin
    call crl
    call output
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H
    ret
main endp

Oin proc
    lea dx,num
    mov ah,10
    int 21h
    mov cl,num+1
    mov si,2
L1:
    mov ax,word ptr num[si]
    mov ah,0
    add si,1
    cmp ax,10
    JZ ou
    cmp ax,30h
    Jb L1
    cmp ax,39h
    ja L1
    sub ax,30H ;
    push ax
    xchg ax,bx
    mul N ;不能mov si,10 mul si,会当成16位乘
    xchg ax,bx
    pop ax
    add bx,ax

    jmp L1
ou:
    ret
Oin endp

crl proc
    push dx
    push ax
    lea dx,crlf
    mov AH,9
    int 21H
    pop ax
    pop dx
    ret

crl endp 

output proc
             mov   cx, 10000d
         call  dec_div
         mov   cx, 1000d
         call  dec_div
         mov   cx, 100d
         call  dec_div
         mov   cx, 10d
         call  dec_div
         mov   cx, 1d
         call  dec_div
    ret
output endp

dec_div proc
    mov   ax, bx
         mov   dx, 0
         div   cx
         mov   bx, dx
         mov   dl, al
         add   dl, 30h
         mov   ah, 2
         int   21h
         ret

dec_div endp
CODES ENDS
    END START

二进制输入

 KEY	PROC	NEAR
		PUSH		AX
		XOR		DX,DX
  L1: 	MOV		AH,1
      	INT		21H
      	CMP 		AL,0DH
      	JZ		BACK
       	CMP		AL,30H
       	JB		L1
       	CMP		AL,31H
       	JA		L1
       	AND		AX,1
		SHL		DX,1
       	ADD		DX,AX
       	JMP		L1
BACK:		POP		AX
		RET
KEY		ENDP 

以上是关于汇编十进制输入输出详解,各种进制输入输出的主要内容,如果未能解决你的问题,请参考以下文章

进制转换(暑假每日一题 44)

x86汇编语言实践

九度oj 题目1513:二进制中1的个数

1218. 补数

8086汇编将十进制数转换为八进制数(输入范围:0~2559,含提示信息)

8086汇编将十进制数转换为八进制数(输入范围:0~2559,含提示信息)