二进制转十进制
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