Вместо этого, потому что размер для каждого сегмента стека составляет 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-интерфейсы ОС.