У меня есть несколько вопросов о памяти и регистры в сборке X86:Доступ и перемещение байт в X86 сборке
У меня есть строка
"abcdefgh"
и зарегистрировать%eax
содержит указатель на строку. Теперь я используюmovl (%eax), %edx
, чтобы захватить первые четыре байта строки в%edx
. Как они хранятся в регистре? Является ли символd
в регистре%dl
, или это символa
?При использовании
movb %eax, %dl
, например, из байтов%eax
оно действительно перемещается? Один в%al
или наоборот? Возможно ли это сделать? Или я должен использовать указатель вроде этого -movb (%eax), %dh
- взять первый байт, на который указывает указатель?
Если вы хотите скопировать младший байт '% 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. –
Подождите, так что если EAX указывает на строку '' abcd'', то использует 'movb (% eax),% cl' move' a' или 'd' to'% cl'? – Sunspawn
Ответ m0skit0 верен: загрузка байта с указателя на начало строки будет загружать первый байт: '' a'' Более интересен тот факт, что загрузка 32b с одного и того же адреса в '% ecx' будет по-прежнему загружаться '' a'' в '% cl', напротив того, что вы получили бы на машине большого конца. Мой комментарий был в ответ на регистр регистра, который переместил часть вашего вопроса, где вы копируете байт '% eax', а не разыгрываете его. –