Проблема понимания того, как получить доступ к памяти из стека - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь научить себя ассемблеру, и у меня возникли сложности с взаимодействием стека и доступа к нему. Я использую 64-разрядную систему x86 и делал простую программу, которая помещает 5 и 2 в стек (в таком порядке), а затем вызывает функцию. Таким образом, если размер слова составляет 2 байта, я смогу получить значение 2, выполнив [esp + 2] учетную запись для обратного адреса. Тем не менее, я получаю 0, потому что, когда я использую edg и шаг за шагом, значение (путем перемещения его в регистр) равно 00000002000000, поэтому я могу получить к нему доступ с помощью [esp + 8], а затем 5 с [esp + 16], что будет означать, что размер слова 4? Значит ли это, что размер слова зависит от системы? Как насчет того, чтобы использовать только регистр? Вместо этого это потому, что размер для каждого сегмента стека составляет 8 байтов в 64-битной системе?

1 Ответ

3 голосов
/ 31 мая 2019

Вместо этого, потому что размер для каждого сегмента стека составляет 8 байтов в 64-битной системе?

Да.

Когда вы нажимаете эти вещи, затем вызываете функцию, это ваш стек:

+-----------------+
|        5        | RSP+0x10
+-----------------+
|        2        | RSP+0x08
+-----------------+
|   Return Addr   | RSP+0x00
+-----------------+

Аналогично, в 32-битной системе вы ищете это для своего стека:

+-----------------+
|        5        | ESP+0x08
+-----------------+
|        2        | ESP+0x04
+-----------------+
|   Return Addr   | ESP+0x00
+-----------------+

Кроме того, помните, что 64-битные регистры начинаются с R (RSP, RAX и т. Д.). Кроме того, в зависимости от вашей операционной системы вы, вероятно, будете неправильно передавать параметры через стек. 64-битные системы используют регистры для первых N параметров, а затем для стека. Регистры различаются в зависимости от того, передаете ли вы целые числа / указатели или число с плавающей запятой. Для ваших целей, с SystemV первые 6 передаются через RDI, RSI, RDX, RCX, R8 и R9 (в этом порядке). 64-битная Windows использует RCX, RDX, R8 и R9 для первых 4 (в этом порядке). Это не важно сейчас, пока вы учитесь, но оно будет становиться все более важным, когда вы начнете вызывать другие модули / API-интерфейсы ОС.

...