【问题标题】:Printing the values in the AH, AL, BH, and BL registers in assembler?在汇编程序中打印 AH、AL、BH 和 BL 寄存器中的值?
【发布时间】:2012-11-26 17:45:11
【问题描述】:

我想创建一个打印AHALBHBL 寄存器值的过程。我有这个:

prntABHL:
    PUSH    BL
    PUSH    BH
    PUSH    AL
    PUSH    AH
    PUSH    fourNums  ! defined in data as "%d, %d, %d, %d\n"
    PUSH    _PRINTF
    SYS
    ADD SP, 12        ! reset stack
    RET

这会导致PUSH 指令出现四个寄存器错误。我假设是因为 PUSH 需要 16 位值,而 AHAL 是 8 位值。

如果AHALBHBL 寄存器中的值不是 16 位长,如何将它们指定为函数的参数?有没有一种相当直接的方法来解决这个问题?

【问题讨论】:

    标签: assembly x86 x86-16


    【解决方案1】:

    如果您只想将 8 位寄存器的值推送为 16 位值,那么如果您有例如,这很容易。 cx 或任何其他 16 位通用寄存器(cxdxbpsidi)免费使用:

    编辑:movzx 在 386 之前的处理器上不可用。替换为 8088/8086 指令。

    xor   cx, cx
    mov   cl, bl
    push  cx
    mov   cl, bh
    push  cx
    mov   cl, al
    push  cx
    mov   cl, ah
    push  cx
    

    如果您没有可免费使用的 16 位通用寄存器,则必须保存保存值以将其推送到其他地方并从那里将其推送到堆栈。

    【讨论】:

    • 我在执行 MOV CL, BL 的行以及将某些内容移至 CL 的其他行上收到错误消息 Register error。你知道是什么原因造成的吗?它们具有匹配的长度。
    • 你用的是什么汇编程序?
    • 8088/8086 是指令集,286、386、486 等也是。汇编程序是用于 组装源代码到二进制文件(例如.com)。那么您使用的是什么程序(汇编程序)?
    • 不幸的是,我使用的是为教育用途设计的 academic assembler toolkit,而不是为实际开发人员构建的东西。
    • 这不是很有教育意义,因为 286 在公元 1982 年取代了 8088(我当时在那里)。最好从这个千年中学习一些东西,比如 64 位汇编。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多