[汇编语言实现各个进制的转换]

 二进制转十进制

        1.写这个的时候我在想 为什么一定要用 bx ax不是16位数?为什么不能用 mov bl,10 余数存AH,商存AL,PUSH AL 后来调试的时候发现 PUSH POP 只能作字或者双字操作 PUSH AL 是字节操作 这个是不允许的

        2.没有写 MOV DX,0 这一句的话会报除数错误,divide error ,虽然不太清楚为什么,但是直觉告诉我要注意恢复 初始化等

DATAS SEGMENT
    ;此处输入数据段代码  
    num dw 1001100110110110B
    count dw 16
DATAS ENDS

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

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
    mov ax,num     ;初始化 ax是需要转换的数字
    mov cx,0       ;cx存放转换为十进制数之后的位数
    mov bx,10      ;bx存放除数

legal1:
	mov dx,0
    div bx         ;dx 存余数 ax 存商
    push dx        ;把余数压入栈中
    inc cx
    cmp al,0
    jnz legal1
	
legal2:
	pop dx
	add dx,30h
	mov ah,2
	int 21h
	loop legal2   
    
    MOV AH,4CH
    INT 21H
    
CODES ENDS
    END START

如果是 从键盘输入数据 则把 mov ax,num 替换成下列代码

       写这个的时候,一开始在move子程序的时候,我是jmp input 会导致一直不结束程序,不是回到input 而是回到 loop input 因为只有 loop 这个指令才对cx做减一操作 

    mov cx,count  ;输入几位
    mov bx,0
input:    
    mov ah,1  ;从键盘输入数据 存放在 al 中
    int 21h
    sub al,30h
    shl bl,1
    add bl,al
    cmp cx,9
    jz move
back:loop input

move proc
	mov bh,bl
	mov bl,0
	jmp back
	ret
move endp

    mov ax,bx  ;完成输入之后结果存放在bx中 再把它移到ax中

二进制转16进制 

思路跟上面是一样的不过是把 除10变成除16 还有ascii码的转换 大于9的还要加 7h 

DATAS SEGMENT
    ;此处输入数据段代码  
    num dw 1001100110110110B
    count dw 16
DATAS ENDS

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

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
    mov ax,num
    mov cx,0
    mov bx,16

legal1:
	mov dx,0
    div bx ;dx 存余数 ax 存商
    push dx
    inc cx
    cmp al,0
    jnz legal1
	
legal2:
	pop dx
	add dx,30h
	cmp dx,'9'
	jle continue
	add dx,7h

continue:
	mov ah,2
	int 21h
	loop legal2   
    
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

另外一种思路就是移位操作 因为二进制到十六进制 有BCD码的思路

DATAS SEGMENT
    ;此处输入数据段代码  
    num dw 1001100110110110B
DATAS ENDS

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

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
    mov bx,num
    mov ch,4
    
rotate:
	mov cl,4
	rol bx,cl
	mov al,bl
	and al,0fh
	add al,30h
	cmp al,'9'
	jle print
	add al,7h

print:
	mov dl,al
	mov ah,2h
	int 21h
	dec ch
	jnz rotate 
    
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

十进制转二进制 

DATAS SEGMENT
    ;此处输入数据段代码  
    num dw 1234
DATAS ENDS

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

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
    mov ax,num
    mov bx,2
	mov cx,0
	
convert:
    mov dx,0
    div bx
    push dx
    inc cx
    cmp ax,0
    jnz convert

print:
	pop dx
	add dx,30h
	mov ah,2
	int 21h
    loop print
    
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

十进制转十六进制 

DATAS SEGMENT
    ;此处输入数据段代码  
    num dw 1234
DATAS ENDS

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

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
    mov ax,num
    mov bx,16
	mov cx,0
	
convert:
    mov dx,0
    div bx
    push dx
    inc cx
    cmp ax,0
    jnz convert

print:
	pop dx
	add dx,30h
	cmp dx,'9'
	jle continue
	add dx,7h
continue:
	mov ah,2
	int 21h
    loop print
    
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

如果是键盘输入的话,可能就有各种合法范围的限制,主要是合法条件的判断和跳转。

十六进制转十进制 

CODE SEGMENT
		ASSME CS:CODE
MOV BX,0
MOV CH,4
MOV CL,4
INPUT:
		SHL BX,CL
		MOV AH,1
		INT 21H
		CMP AL,39H
		JA AF
		AND AL,0FH
		JMP BINARY
AF:  	
AND AL,0FH
		ADD AL,7
BINARY: 
		OR BL,AL
		DEC CH
		JNE INPUT
DISPN:
		MOV CX,16
DISP:
		MOV DL,0
		ROL BX,1
		RCL DL,1
		OR DL,30H
		MOV AH,02
		INT 21H
		LOOP DISP
		RET
CODE ENDS
		END

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值