Язык ассемблера, значение двух значений в src или destination - PullRequest
0 голосов
/ 05 октября 2019

Например, в чем разница между

cmpl $0x7, 0x8(%rsp)

и

cmpl $0x7, (%rsp)

Кроме того, в чем разница между cmp и cmpl?

Ответы [ 3 ]

2 голосов
/ 05 октября 2019

Операндом памяти в x86 в синтаксисе AT & T обычно является " смещение ( база , индекс , масштаб )", где offset - это (постоянное) смещение, base - это (базовый) регистр, index - это (индексный) регистр, а scale - этоконстанта 1, 2, 4 или 8. Однако большинство этих полей можно опустить, чтобы получить значение по умолчанию. Нет смещение означает смещение 0. Нет base означает отсутствие базового регистратора. Нет index и scale означает отсутствие индексного регистра.

В ваших конкретных примерах (%rsp) означает %rsp в качестве базового регистра, без смещения и без индекса,0x8(%rsp) означает %rsp в качестве базового регистра и 0x8 (8) в качестве смещения.

2 голосов
/ 05 октября 2019

Суффиксы для ширины

Intel описывает мнемонику инструкции как CMPРуководство по разработке программного обеспечения для архитектуры Intel 64 и IA-32 ), но существует много форм инструкции,например, сравнение 8-, 16-, 32- или 64-разрядных чисел, сравнение непосредственного значения со значением в памяти и т. д.

Некоторые ассемблеры используют суффиксы для различения ширины операнда, используя:

  • b для байта,
  • w для слова (два байта в использовании Intel в этих архитектурах),
  • l для длинного слова (четыребайт) и
  • q для четверного слова (четыре слова, восемь байтов).

Если один из операндов является регистром, ассемблер может вычислить (по крайней мере,теоретически, некоторые ассемблеры могут не иметь этого) ширина от него.

Например, cmp $0x7, %rsp будет 64-битным сравнением, поскольку %rsp называет 64-битный регистр. (%esp - это 32-битный регистр, %sp - это 16-битный регистр.)

Формы операндов

cmpl $0x7, (%rsp) означает 32-битное сравнение непосредственного значения 0x7 с данными в памяти по адресу, содержащемуся в регистре %rsp.

Без суффикса l ширина в этой инструкции неизвестна. 0x7 является непосредственным значением. В отличие от C, для него нет типа по умолчанию.

Аналогично, (%rsp) - это место в памяти без связанного типа. Так что l нужно. (Обратите внимание, что здесь разница: cmp $0x7, %rbp будет сравнивать 7 со значением в %rbp, а cmp $0x7, (%rbp) будет сравнивать 7 со значением в памяти по адресу %rbp.)

8(%rsp) означает адрес, полученный в результате добавления 8 к (%rsp).

Более полная форма: смещение ( base , index , масштаб ), который представляет адрес в base (который является регистром) плюс индекс (другой регистр) раз масштаб (константа 1, 2, 4 или 8) плюс смещение .

Эта форма используется для индексации массивов: предположим, что массив начинается с адреса %rax и имеет элементы шириной 4 байта, и вам нужен элементс индексом в %rbx. Затем вы адресуете этот элемент с помощью (%rax, %rbx, 4). Дополнительное смещение может быть добавлено для ссылки на элементы внутри структур в массиве или для настройки базового адреса массива относительно %rax.

0 голосов
/ 05 октября 2019

Я полагаю, что ответ на ваш вопрос можно найти в этом другом вопросе: Разница между cmpl и cmp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...