2013-02-19 1 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! Ассемблер! –

+0

Возможный дубликат [x86 инструкция смысл] (http://stackoverflow.com/questions/12327408/x86-instruction-meaning) –

+0

Бо Перссон, как это дубликат? – asimes

ответ

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

Говорит, прочитать один байт из ячейки памяти, адресованного первого операнда (х), расширить байт до 32 бит, и сохранить результат в регистре (г).

<% x,% y, 1> - адрес памяти, образованный путем сложения значений x и y; 1 - множитель, применяемый к y.

+0

Не могли бы вы объяснить, что происходит, когда байт расширен до 32 бит? Он заполняет 3 наиболее значимых байта нулями? Я видел из другого объяснения, что это «знак расширяет». Я попытался показать, что, написав 0x800000ff, это правильно/неверно? – asimes

+0

Расширение = расширение от байта до слова. В синтаксисе Intel мнемоника этой команды MOVSX. Компилятор C может использовать эту инструкцию, когда переменная типа int8_t должна быть преобразована в int, что происходит автоматически по арифметике и нескольким другим операциям, таким как цельное продвижение. Инструкция записывает все 32 бита (или что-то другое) из регистра назначения, это позволяет избежать штрафов за производительность, которые могут возникнуть в результате записи только с низкими 8 битами регистра. –

+0

Что я имел в виду, это то, что попадает в 3 самых значительных байта. Я предполагаю, что младший байт - это скопированный байт, но как насчет других? Все ли они нули? – asimes

0

Если вы хотите записать его в C, то линия будет что-то похожее на:

#include <stdlib.h> 

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

Компиляция (на UN * 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, movsbl и movsbq для преобразования в слова/short, долго/int и quad/long long).

Ваша сборка рассчитана на 32 бит (потому что регистры, используемые для адресации, 32 бит), но в остальном смысл одинаков.