Я не понимаю, что делает этот ассемблерный код.
imul -0x8(%rsp, %rbx, 4), %eax
cmp %eax, -0x4(%rsp, %rbx, 4)
Я понимаю, что делают инструкции imul и cmp, но не понимаю, что означают -0x4 (% rsp,% rbx, 4) и -0x8 (% rsp,% rbx, 4). При необходимости я могу предоставить больше контекста, но на самом деле мне нужен просто дословный перевод этих двух строк. Что хранится в% eax в первой строке? Произведение% rbx * 4 и% rsp - 8?
То, что хранится в %eax
, является продуктом -0x8(%rsp, %rbx, 4)
и %eax
.
А -0x8(%rsp, %rbx, 4)
- это содержимое ячейки памяти %rsp + 4*%rbx - 8
.
Код в вопросе выглядит как 64-битный код. Но размер операнда здесь почему-то 32-битный (по умолчанию?). Указывает ли место в памяти на 32-битный операнд, потому что указан% eax вместо% rax?
@ E.vanPutten: У меня нет опыта написания 64-битного ассемблерного кода x86. Но я предполагаю, что адреса 64-битные, а операнды (в этой инструкции) 32-битные. Так же, как вы можете выполнять 8- или 16-битное умножение в 32-битном режиме.
Да, вполне логично, что адреса памяти 64-битные. В противном случае эти расчеты смещения могут привести к циклическим искажениям. Я так понимаю, что размер операнда по умолчанию - 32-битный, и что все будет улучшено, только если вы упомянете 64-битный регистр.
@ E.vanPutten: Нет, я думаю, что размер операнда по умолчанию - 64 бита. Но здесь использование %eax
вместо %rax
указывает на 32-битную арифметическую операцию. (Вычисления адресов всегда 64-битные.)
Раздел «Режимы работы» в en.wikipedia.org/wiki/X86-64 говорит, что он 32-битный. Не знаю почему, возможно, чтобы упростить перенос устаревшего программного обеспечения.
Какой ужасный беспорядок!
imul -0x8(%rsp, %rbx, 4), %eax
под капотом принимает 32-битное значение по адресу памяти -0x8(%rsp, %rbx, 4
, умножает его на EAX. Внутренний результат вдвое превышает ширину исходного операнда. Младшие 32 бита результата будут помещены в EAX (CF будет установлен соответственно), а верхние 32 бита RAX будут автоматически перезаписаны нулями (поскольку ЦП в 64-битном режиме ноль расширяет любой 32-битный регистр назначения через весь 64-битный регистр (в данном случае RAX)
В 64-битном режиме размер операции инструкции по умолчанию составляет 32 бита. Это может быть отменено префиксом REX.W
-0x8(%rsp, %rbx, 4)
- это операнд памяти. В синтаксисе AT&T это смещение (основание, индекс, масштаб), где вычислением является смещение + основание + индекс * масштаб. База и индекс должны быть регистрами, масштаб - это значение 1,2,4,8, а смещение может достигать 32-битного значения со знаком.