Суффиксы для ширины
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
.