2015-04-18 91 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擴展

相關問題