如何在x86汇编中实现WriteHexByte?基于Irvine32库的十六进制输出问题
x86汇编WriteHexByte功能实现问题修复
现有代码的问题
- 执行顺序错误:将AL赋值为待转换的
94h后直接调用WriteChar,此时输出的是94h对应的ASCII控制字符,而非要求的十六进制字符。 - 半字节拆分逻辑完全错误:仅将AL赋值给DH后对DX、DL做无意义的右移操作,未正确分离AL中的高低4位半字节,也未实现半字节数值到ASCII码的转换逻辑。
- 未遵循
WriteChar调用规则:WriteChar要求将待输出字符存入AL寄存器,你将转换后的结果存放在DH、DL中却未传递到AL,输出结果自然不符合预期。 - 缺少要求的执行步骤:未按要求输出高低半字节字符、换行符(
0Ah)、回车符(0Dh),流程缺失严重。
修正后可运行代码
INCLUDE Irvine32.inc .code WriteHexByte proc ; 入参:AL = 待输出的字节 PUSH DX ; 保存DX寄存器原值 PUSH AX ; 保存AX寄存器原值,避免后续操作覆盖 ; 第一步:拆分高低半字节 MOV DH, AL ; 备份原始字节到DH SHR DH, 4 ; DH右移4位,得到高半字节数值 MOV DL, AL ; 原始字节存到DL AND DL, 0Fh ; DL和0Fh与运算,得到低半字节数值 ; 第二步:高半字节转ASCII CMP DH, 9 JBE DH_TO_DIGIT ADD DH, 37h ; 大于9的情况,转A-F的ASCII JMP DH_CONVERT_DONE DH_TO_DIGIT: ADD DH, 30h ; 小于等于9的情况,转0-9的ASCII DH_CONVERT_DONE: ; 第三步:低半字节转ASCII CMP DL, 9 JBE DL_TO_DIGIT ADD DL, 37h JMP DL_CONVERT_DONE DL_TO_DIGIT: ADD DL, 30h DL_CONVERT_DONE: ; 第四步:按要求顺序输出 MOV AL, DH ; 高半字节ASCII放AL CALL WriteChar ; 输出高半字节字符 MOV AL, DL ; 低半字节ASCII放AL CALL WriteChar ; 输出低半字节字符 MOV AL, 'h' ; 输出十六进制标识h CALL WriteChar MOV AL, 0Ah ; 输出换行符 CALL WriteChar MOV AL, 0Dh ; 输出回车符 CALL WriteChar POP AX ; 恢复寄存器原值 POP DX RET WriteHexByte endp ExerciseTwo proc MOV AL, 94h ; 测试输入 CALL WriteHexByte invoke ExitProcess, 0 ExerciseTwo endp end ExerciseTwo
代码说明
- 单独封装了
WriteHexByte函数,入参为AL寄存器中存储的待输出字节,复用性更强。 - 半字节拆分采用「右移4位取高半字节、与0Fh取低半字节」的标准逻辑。
- 半字节转ASCII时对0-9和A-F做了分支处理,符合十六进制字符的输出规范。
- 严格按照要求的顺序输出高半字节、低半字节、h标识、换行符、回车符,满足所有功能要求。
内容的提问来源于stack exchange,提问作者TheBMAN
相关产品推荐
相关产品推荐

