2013-02-19 61 views
2

此行對我來說並不很清楚的意思(我很新的組件):請覈實AT&T裝配線

movsbl 0xffffffff(%edx,%ebx,1),%eax 

我明白mov,但movsbl是一個新的給我。在使用的foo代替0xffffffff(%edx,%ebx,1)我明白了一個簡單的例子它是這個(不能肯定這是正確的,只是搜索相關主題):

eax = foo&0x800000ff; 

我從來沒有過線大會指-1(0xffffffff),其中的信息是否正好來自%eax?是它的任何存儲在:

[%edx + %ebx -1] 
+0

Eek!彙編! – 2013-02-19 05:20:09

+0

[x86指令含義]的可能重複(http://stackoverflow.com/questions/12327408/x86-instruction-meaning) – 2013-02-19 08:16:43

+0

Bo Persson,它是如何重複的? – asimes 2013-02-20 15:28:30

回答

6
movsbl <%x, %y, 1>, %z 

說,讀取與由第一操作數尋址的存儲器位置的一個字節(x)的,該字節擴展到32位,並把結果存儲在寄存器( Z)。

<%x,%y,1>是通過將x和y的值相加形成的存儲器地址; 1是應用於y的乘數。

+0

您能否解釋一個字節擴展到32位時發生了什麼?它是否用0填充3個最重要的字節?我從不同的解釋中看到它是「符號擴展」。我試圖通過寫入0x800000ff來證明,這是正確的還是不正確的? – asimes 2013-02-19 05:28:43

+0

擴展=從字節擴展到長字。在Intel語法中,該指令的助記符是MOVSX。當int8_t類型的變量需要轉換爲int時,C編譯器可能會使用此指令,該算法會在算術和其他一些操作(如整數提升)上自動發生。該指令寫入目標寄存器的所有32位(或其他),它避免了只寫入寄存器的低8位可能導致的性能損失。 – 2013-02-19 05:32:01

+0

我的意思是什麼被放入3個最重要的字節。我假設最低有效字節是複製的字節,但其他的呢?無論如何,他們都是零? – asimes 2013-02-19 05:35:50

0

如果你用C寫,行會是一個類似於:

#include <stdlib.h> 

int loadByte(char *base, size_t index) 
{ 
    return (int)base[index - 1]; 
} 

編譯這個(關於聯合國* X,64位x86)的結果在下面的目標代碼:

Disassembly of section .text: 

0000000000000000 : 
    0: 0f be 44 37 ff   movsbl 0xffffffffffffffff(%rdi,%rsi,1),%eax 
    5: c3      retq 

如先前所述,movsb裝置移動(負荷)的一個字節,符號擴展到...(所以有movsbw,針對轉化到字/ short,長movsblmovsbq/int和quad/long long)。

你的程序集是32位的(因爲用於尋址的寄存器是32位),否則其含義是相同的。