2015-04-18 97 views
3

我决定学习汇编程序设计语言。我正在使用this。在底部行使它找到一些指令错误,其中之一就是MASM大会将8位寄存器移动到16位寄存器(即mov cx,ch)

mov cx, ch 

我发现了一些类似的问题对SO有关这个主题的解释如何实现呢,但现在我想知道为什么这个操作是被禁止的?

我们假设我在CH中有10d = 00001010b,并且想把它放到CL并同时擦除CH。 mov cx, ch似乎这样做,因为它显示了10D的16位00000000 00001010,并将其分别CH和CL(整个CX)

有什么不妥之处,为什么给教程问找到这种表达错误?

+2

这与其说是被禁止的,更多“不在[所有英特尔操作码的完整列表](http://www.intel。nl/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-2a-manual.pdf)(链接到PDF)“。禁止因为操作码不存在 – usr2564301

+1

我高度怀疑您的困惑之处在于作者为此问题(可能故意)选择了“CH”,“CL”和“CX”寄存器。为了帮助你理解这种不连续性,你可以用'mov dx,ch'得到一个非常类似的错误,这可能会更好地说明错误的原因,只是一个建议;如果不满意就退款 –

回答

5

mov指令用于在相同大小的操作数之间移动。你想要的是,将的8位ch扩展为16位cx。有两种指令用于这一目的:

movzx cx,ch ; zero-extends ch into cx. the upper byte of cx will be filled with zeroes 
movsx cx,ch ; sign-extends ch into cx. the upper byte of cx will be filled with the most significant bit of ch 

在这种特殊情况下完成同样的事情的另一种方法是:

shr cx,8 ; zero-extend 
sar cx,8 ; sign-extend 
2

问题是,您试图将8位寄存器ch的内容移入16位寄存器cx。你不能这样做,因为寄存器大小不同。

所以我猜你会得到一个错误信息,如“操作码和操作数的无效组合”

p.s:交换了上述8和16;声明保持不变。检查例如this overview。如您所见,没有定义不同的寄存器大小组合。这意味着不存在表示mov cx, ch的任何OPcode。

+0

mov [ dest],[src]。我尝试将8b移动到16b。 –

+1

对不起,我交换过了,但是这个语句基本上仍然有效:在mov命令中不能混合16位寄存器和8位寄存器。 – Trinimon

0

只是简单的指令

mov cl,ch ; copy high bits to low 
xor ch,ch ; clear high-bits 

做它在16位编程中很常见,只需要2个时钟周期

使用movezx/movsx需要3个时钟周期。使用

movsx cx,ch 

的字移动字节与小号 IGN扩展和

movzx cx,ch 

将字节字与ž ERO扩展

相关问题