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

注意:

输入的是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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值