Язык ассемблера. Каковы основные различия между байтовыми операциями и текстовыми операциями? - PullRequest
0 голосов
/ 17 сентября 2018

В процессе практики обратного инжиниринга с микрокоррупцией я натолкнулся на инструкции типа mov.b cmp.b. Я посмотрел это онлайн и обнаружил, что они называются «байтовыми операциями». Существует вопрос о переполнении стека относительно различий между mov и mov.b, но, к сожалению, я не мог действительно понять ответ.

Итак, мой вопрос: «Каковы основные различия между байтовыми операциями и операциями со словами?», В частности, в чем разница между mov.b и mov, или cmp и cmp.b. Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Суффикс операции в mov и cmp указывает размер, который будет изменен при работе.Пример: mov $ 2, (% ebx).Будет ли число 2 перемещено в 1 байт в ebx, или число 2 будет перемещено в 4 байта в ebx?Префиксы размера b, w и l служат для этой цели, указывая размеры 1, 2 и 4 байта соответственно.Для более: http://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html

0 голосов
/ 17 сентября 2018

Операция байта работает с одним байтом, операция слова работает со словом данных. Типичные размеры слова составляют 2, 4 или 8 байтов, то есть 16 бит, 32 бита или 64 бита.

Если предположить, что размер слова равен 16 битам, например, если вы записываете байт 0x23 в ячейку памяти 0x1000, то значение памяти по адресу 0x1000 изменяется на 0x23. Если вы напишите слово 0x2342 по адресу 0x1000, то эффект будет зависеть от порядкового номера вашей машины. На машине little-endian , где младший значащий байт сохраняется первым, память по адресу 0x1000 получает значение 0x42, а память по адресу 0x1001 получает значение 0x23. На big endian машинах все наоборот.

То же самое относится ко всем остальным инструкциям.

Многие современные процессоры имеют только арифметические инструкции для данных размером в слово, причем единственными байтовыми инструкциями являются команды специальной загрузки и сохранения. В таких архитектурах данные в одном байте расширяются от нуля или до целого слова при загрузке в регистр, поэтому вы можете работать с ним как с полным словом. Например, 0x80 становится 0x0080 при расширении нуля и 0xff80 при расширении знака.

...