汇编语言 十六进制转换为二进制


今天写了十六进制转换为二进制的汇编语言小程序,感觉挺有逻辑性的,运用条件分支,进行转换,这里把自己的心得分享一下,希望对大家有点小小的启示

由于,代码中已经有了详细注释,在这里我只是说出我写该程序的思路,首先得有一个流程图,比自己的想法用流程图表示出来,之后便可以照着流程图将自己的想法用汇编语言实现出来,在不懂得地方,只需要拿笔比划一下运行过程,想想程序怎么运行,我想会得到你想要的答案!!!(说明一下,如果输入错误程序直接结束,未返回提示信息!!!我自己蠢)

DATAS SEGMENT
    TIP DB 'INPUT THE NUMBER: ',0AH,0DH,'$'
DATAS ENDS

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

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
   	
    MOV DX,OFFSET TIP ;输出提示输入数字标语
    MOV AH,09H
    INT 21H
    
    MOV CH,4 ;记录输入数字次数
    MOV CL,4 ;一次左移位数
    MOV BX,0 ;记录左移之后的数字
    MOV DH,16 ;输出十六位二进制数字控制
   
INPUT:
	MOV AH,1
	INT 21H
	;判断是否在0-9之间
	cmp AL,30H
	JB EXIT ;比0小则退出
	CMP AL,39H
	JA COMPER1 ;比9大则判断与A的大小
	;若进行到下一步则说明这次输入的是0-9之间的数字,转换成二进制
	JMP CHANGE1
COMPER1:
	CMP AL,41H ;判断与A的大小
	JB EXIT ;若小于A则退出
	CMP AL,46H ;判断与F的大小
	JA COMPER2 ;若比F大则判断与a的大小
	JMP CHANGE2 ;进行到这一步则说明输入的是A-F,转换成二进制
COMPER2:
	CMP AL,61H ;判断与a的大小
	JB EXIT ;小于a则退出
	CMP AL,66H ; 判断与f的大小
	JA EXIT ; 大于f则退出
	JMP CHANGE3 ; 进行到这一步说明输入的是a-f,转换成二进制

CHANGE1:
	SUB AL,30H ;转换成0-9
	SHL BX,CL ;左移四位 
	OR BL,AL ; 进行或运算得到四位二进制
	DEC CH ; 输入数字次数自减1
	JZ ENT ; 四位十六进制全部输入完毕则打印,否则继续输入
	JMP INPUT 
CHANGE2:
	SUB AL,37H ;此时AL中是A-F,减去37H是0AH,0BH...0FH
	SHL BX,CL
	OR BL,AL
	DEC CH
	JZ ENT
	JMP INPUT
CHANGE3:
	SUB AL,57H ;此时AL中是a-f,减去57H就是0AH,0BH...0FH
	SHL BX,CL
	OR BL,AL
	DEC CH
	JZ ENT
	JMP INPUT
;所有的CHANGE1,2,3道理都是一样的
ENT:
	MOV DL, 0DH ;0D是回车符的ASCII码.
	MOV AH, 02H ;输出单个字符.
	INT 21H ;输出.
	MOV DL, 0AH ;0A是换行符的ASCII码.
	MOV AH, 02H
	INT 21H 
	;这里0DH,和0AH要一起使用,单独使用会报错
	JMP PRINT
PRINT:
	SHL BX,1 
	JNC L1 ;判断进位,如果是0 跳到了L1
	MOV DL,'1' ;输出1
	MOV AH,02H
	INT 21H
	DEC DH
	JZ EXIT
	JMP PRINT
L1:
	MOV DL,'0' ;输出0
	MOV AH,02H
	INT 21H
	DEC DH 
	JZ EXIT
	JMP PRINT
EXIT:
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

这里是运行的结果截图:
















  • 26
    点赞
  • 149
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是汇编语言实现二进制十六进制转换的示例代码: ``` section .data bin db 10101010b ; 二进制数 hex db 0x2A ; 十六进制数 section .text global _start _start: ; 二进制十六进制 mov al, bin ; 将二进制数存入 al 寄存器 mov bl, 16 ; 将 16 存入 bl 寄存器 div bl ; al 寄存器的值除以 bl 寄存器的值,商存入 ah 寄存器,余数存入 al 寄存器 cmp al, 9 ; 判断余数是否小于等于 9 jbe bin_to_hex ; 如果小于等于 9,跳到 bin_to_hex 标签 add al, 7 ; 如果大于 9,将余数加上 7,得到 A~F 的 ASCII 码 bin_to_hex: add al, 30h ; 将余数换为 ASCII 码 mov [hex], al ; 将 ASCII 码存入 hex 变量中 ; 十六进制二进制 mov al, [hex] ; 将十六进制数存入 al 寄存器 sub al, 30h ; 将 ASCII 码换为数字 cmp al, 9 ; 判断数字是否小于等于 9 jbe hex_to_bin ; 如果小于等于 9,跳到 hex_to_bin 标签 sub al, 7 ; 如果大于 9,将数字减去 7,得到 A~F 的值 hex_to_bin: mov bl, 2 ; 将 2 存入 bl 寄存器 mov cl, 0 ; 将 0 存入 cl 寄存器 mov dl, al ; 将数字存入 dl 寄存器 mov al, 0 ; 将 al 寄存器清零 hex_to_bin_loop: shr dl, 1 ; 将 dl 寄存器右移一位,相当于除以 2 adc al, 0 ; 将进位标志位加到 al 寄存器中 inc cl ; 将 cl 寄存器加一 cmp cl, 8 ; 判断是否已经换了 8 位二进制数 jne hex_to_bin_loop ; 如果没有,跳到 hex_to_bin_loop 标签 mov [bin], al ; 将二进制数存入 bin 变量中 ; 退出程序 mov eax, 1 ; 将系统调用号 1(退出程序)存入 eax 寄存器 xor ebx, ebx ; 将返回值 0 存入 ebx 寄存器 int 0x80 ; 调用系统中断 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值