Что означают эти строки кода в сборке x86?

Я не понимаю, что делает этот ассемблерный код.

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?

-0x8(%rsp, %rbx, 4) - это операнд памяти. В синтаксисе AT&T это смещение (основание, индекс, масштаб), где вычислением является смещение + основание + индекс * масштаб. База и индекс должны быть регистрами, масштаб - это значение 1,2,4,8, а смещение может достигать 32-битного значения со знаком.
Michael Petch 25.10.2018 22:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
298
1

Ответы 1

То, что хранится в %eax, является продуктом -0x8(%rsp, %rbx, 4) и %eax.

А -0x8(%rsp, %rbx, 4) - это содержимое ячейки памяти %rsp + 4*%rbx - 8.

Код в вопросе выглядит как 64-битный код. Но размер операнда здесь почему-то 32-битный (по умолчанию?). Указывает ли место в памяти на 32-битный операнд, потому что указан% eax вместо% rax?

E. van Putten 25.10.2018 22:51

@ E.vanPutten: У меня нет опыта написания 64-битного ассемблерного кода x86. Но я предполагаю, что адреса 64-битные, а операнды (в этой инструкции) 32-битные. Так же, как вы можете выполнять 8- или 16-битное умножение в 32-битном режиме.

TonyK 25.10.2018 22:53

Да, вполне логично, что адреса памяти 64-битные. В противном случае эти расчеты смещения могут привести к циклическим искажениям. Я так понимаю, что размер операнда по умолчанию - 32-битный, и что все будет улучшено, только если вы упомянете 64-битный регистр.

E. van Putten 25.10.2018 23:01

@ E.vanPutten: Нет, я думаю, что размер операнда по умолчанию - 64 бита. Но здесь использование %eax вместо %rax указывает на 32-битную арифметическую операцию. (Вычисления адресов всегда 64-битные.)

TonyK 25.10.2018 23:05

Раздел «Режимы работы» в en.wikipedia.org/wiki/X86-64 говорит, что он 32-битный. Не знаю почему, возможно, чтобы упростить перенос устаревшего программного обеспечения.

E. van Putten 25.10.2018 23:14

Какой ужасный беспорядок!

TonyK 25.10.2018 23:34
imul -0x8(%rsp, %rbx, 4), %eax под капотом принимает 32-битное значение по адресу памяти -0x8(%rsp, %rbx, 4, умножает его на EAX. Внутренний результат вдвое превышает ширину исходного операнда. Младшие 32 бита результата будут помещены в EAX (CF будет установлен соответственно), а верхние 32 бита RAX будут автоматически перезаписаны нулями (поскольку ЦП в 64-битном режиме ноль расширяет любой 32-битный регистр назначения через весь 64-битный регистр (в данном случае RAX)
Michael Petch 25.10.2018 23:51

В 64-битном режиме размер операции инструкции по умолчанию составляет 32 бита. Это может быть отменено префиксом REX.W

Michael Petch 25.10.2018 23:54

Другие вопросы по теме