【发布时间】:2014-02-09 20:07:54
【问题描述】:
是否可以做类似的事情:MOV AX, EBX
如果是,在这种情况下会发生什么?
还会发生什么:MOV EBX、AX?
(使用 NASM,8086 架构)
【问题讨论】:
是否可以做类似的事情:MOV AX, EBX
如果是,在这种情况下会发生什么?
还会发生什么:MOV EBX、AX?
(使用 NASM,8086 架构)
【问题讨论】:
假设 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 有效,但速度较慢。)
使用 mov ax,bx, 将 bx 的低 16 位移动到 ax 中。
使用 movsx ebx,ax 将 ax 移入带符号扩展的 ebx
使用 movzx ebx,ax 将 ax 移入 ebx,将 ebx 的高 16 位归零。
【讨论】:
MOV AX, EBX ...如果这将编译您可能会在 AX 中获得 BX。
MOV EBX, AX 将获得 BX 中的 AX 并在它之前为零...
我现在手头没有汇编程序,但请尝试看看会发生什么...
【讨论】:
mov ax, ebx,那么你的汇编器坏了,你应该买一个新的。