2015-12-17 5 views
1

У меня есть несколько вопросов о памяти и регистры в сборке X86:Доступ и перемещение байт в X86 сборке

  1. У меня есть строка "abcdefgh" и зарегистрировать %eax содержит указатель на строку. Теперь я использую movl (%eax), %edx, чтобы захватить первые четыре байта строки в %edx. Как они хранятся в регистре? Является ли символ d в регистре %dl, или это символ a?

  2. При использовании movb %eax, %dl, например, из байтов %eax оно действительно перемещается? Один в %al или наоборот? Возможно ли это сделать? Или я должен использовать указатель вроде этого - movb (%eax), %dh - взять первый байт, на который указывает указатель?

+1

Если вы хотите скопировать младший байт '% eax', используйте' mov% al,% dl'. Чтобы переместить второй байт, используйте 'mov% ah,% dl'. Чтобы получить один из двух других байтов, скопируйте/сдвиньте/маску или используйте BMI1 'bextr'. Чтобы расширить, используйте 'movsx' /' movzx' для подписания/нулевого расширения, например 'movsx% al,% edx'. Или 'movsxbl (% eax),% edx' для подписывания - продлить байт из памяти, на который указывает'% eax'. См. Http://stackoverflow.com/questions/34058101/referencing-the-contents-of-a-memory-location-x86-addressing-modes относится к этому, но использует синтаксис Intel. –

+0

Подождите, так что если EAX указывает на строку '' abcd'', то использует 'movb (% eax),% cl' move' a' или 'd' to'% cl'? – Sunspawn

+1

Ответ m0skit0 верен: загрузка байта с указателя на начало строки будет загружать первый байт: '' a'' Более интересен тот факт, что загрузка 32b с одного и того же адреса в '% ecx' будет по-прежнему загружаться '' a'' в '% cl', напротив того, что вы получили бы на машине большого конца. Мой комментарий был в ответ на регистр регистра, который переместил часть вашего вопроса, где вы копируете байт '% eax', а не разыгрываете его. –

ответ

4

Предполагая, что вы используете необычный синтаксис GAS»(источник является первым операндом, назначения является второй один), а не от Intel:

Как они хранятся в реестре? Является ли символ d в регистре% dl , или это символ a?

Поскольку вы получаете доступ к строке, как если бы это было 32-разрядное число, применяется сущность. x86 является малоприемником, поэтому вы получаете младший байт с наименьшим адресом, поэтому DL будет содержать «a» (0x61), а весь EDX будет 0x64636261.

При использовании movb% eax,% dl, например, из числа байтов% eax это действительно перемещается? Один в% al или наоборот? Возможно ли это сделать ?

Это даст синтаксическую ошибку, поскольку операнды имеют разный размер. Вы не можете переместить 32 бита в 8 бит.

Или я должен использовать указатель, как это - MOVB (% EAX),% Dh - взять первый байт указывает указатель на?

Если вы хотите получить доступ к данным, указанным EAX, а не самому EAX, тогда да, это должно сработать.