You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:24:02