【问题标题】:Assembler Programming - Moving content of 32 bit register to a 16 bit register?汇编程序编程 - 将 32 位寄存器的内容移动到 16 位寄存器?
【发布时间】:2014-02-09 20:07:54
【问题描述】:

是否可以做类似的事情:MOV AX, EBX

如果是,在这种情况下会发生什么?

还会发生什么:MOV EBX、AX?

(使用 NASM,8086 架构)

【问题讨论】:

    标签: assembly mov


    【解决方案1】:

    假设 Intel 语法,其中

    MOV AX, EBX
    

    如果允许,会将 EBX 的内容复制到 AX。

    试试吧。我记得它不支持。但您可以复制任何 16 位组,例如

    MOV AX, BX
    

    然而,相反,扩展位模式,就像假设的

    MOV EBX, AX
    

    如何做到这一点取决于你想要什么。

    如果 AX 表示无符号整数,只需清除 EBX 并复制到下半部分,例如

    XOR EBX, EBX
    MOV BX, AX
    

    但是,如果 AX 表示有符号整数(二进制补码),您需要在整个 16 个高位中复制符号位,这称为 符号扩展

    谷歌搜索“x86 符号扩展”给了我

    MOVS EBX, AX
    

    但我还没有尝试过(也就是说,我还没有尝试过现在,但也许 20 年前,我不知道)。

    简而言之,查阅文档试用

    【讨论】:

    • movsx 进行符号扩展,movzx 进行零扩展。 (xor-zero + merge 有效,但速度较慢。)
    【解决方案2】:

    使用 mov ax,bx, 将 bx 的低 16 位移动到 ax 中。

    使用 movsx ebx,ax 将 ax 移入带符号扩展的 ebx

    使用 movzx ebx,ax 将 ax 移入 ebx,将 ebx 的高 16 位归零。

    【讨论】:

    • "还有 mov ebx,ax 会发生什么?"将是 16 -> 32。
    • 你确定它受支持。
    • 从 386 开始支持 movsx 和 movzx。
    • 我的评论是对您自己的评论的回复。 32>>。你确定支持吗?
    • mov ax,ebx 不是有效指令。它需要是 movsx 或 movzx。
    【解决方案3】:

    MOV AX, EBX ...如果这将编译您可能会在 AX 中获得 BX。

    MOV EBX, AX 将获得 BX 中的 AX 并在它之前为零...

    我现在手头没有汇编程序,但请尝试看看会发生什么...

    【讨论】:

    • 如果你的汇编器支持mov ax, ebx,那么你的汇编器坏了,你应该买一个新的。
    • @Griwes 完全同意 :) !
    猜你喜欢
    • 2014-05-25
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    相关资源
    最近更新 更多