2010-04-13 49 views
7

我是第一次嘗試組裝的新手程序員。對不起,如果這是一個令人難以置信的跛腳問題。x86彙編中的操作數大小衝突?

我有一個字符存儲在EAX寄存器中,但我需要將它移動到我的DL寄存器。當我嘗試:mov dl,eax我得到一個錯誤C2443:操作數大小衝突。我知道eax寄存器是32位的,而dl是8位的...我是在做什麼?我該如何解決這個問題。

回答

6

嘗試

xor edx,edx 
mov dl, al 

吧?第一條指令將edx的「不必要的」高位清零(可選),然後將低8從eax移到edx。

正如其他人所指出的,movzx一步到位。值得一提的是,根據相同的觀點,如果你在al中有的值,你可以使用「movsx edx,al」來填充edx的高位,並使用al的msb的一個副本,從而將簽名al到edx的32位表示。

+0

沒錯。 EAX寄存器是32位寬,而DL只有8位。 您需要將AL移到DL,AL是EAX的子集。 – MPelletier 2010-04-13 00:57:15

+0

xoring edx只是一個不錯的主意:)漂亮而乾淨。 – MPelletier 2010-04-13 00:58:39

+0

我不明白第一條指令。是不是'xor edx,edx'將%edx中的所有位清零? – 2010-04-13 01:11:45

3

如果你只是想訪問EAX的低8位,然後使用人:

mov dl, al 

您可以通過更改訪問的低8位,16位,或每個通用寄存器的32位字母在開始或結束。對於寄存器eax,使用eax意味着使用全部32位,ax是低16位,而al是低8位。 ebx的等價物分別是ebx,bx和bl,依此類推。

請注意,如果修改寄存器的低16位或8位,則高位不變。例如,如果你在eax中加載所有的1,然後將零加載到al中,那麼eax的低8位將是零,而高24位將是1。

mov eax, -1 ; eax is all ones 
mov al, 0 ; higher 24 bits are ones, lower 8 bits are zeros 
+0

將al移入dl是基本情況。零填充或簽名擴展可能是必要的,也可能不是必須的,因爲在選擇手工編碼的裝配時,您是 - 或者應該 - 在最低限度的,純粹的解決方案之後:「很高興擁有」是一種昂貴的奢侈品,並且自然被排除在外。 – 2013-09-02 08:48:47

11

你想要的可能是:

movzx edx, al 

這將複製到人d1和EDX的補零休息。這條單指令相當於這兩條指令:

xor edx, edx 
mov dl, al 
+3

我更喜歡這個。 movzx負責所有的尾隨位。耶爲一些抽象! (我的熱情應該背叛我缺乏組裝經驗)。 – MPelletier 2010-04-13 17:25:51