Я ссылаюсь Этот ответ «pushq» можно заменить на «subq и movq», «popq» можно заменить на «movq и addq».
Но «PUSH ESP» и «POP ESP» являются особым случаем. Ссылка Этот ответ .
Но результат не "0"
pushq% rsp ; толкает значение регистра ESP в том виде, в каком оно существовало до выполнения инструкции.
popq% rsp ; увеличивает указатель стека (ESP) до того, как данные из старой вершины стека будут записаны в место назначения.
pushq% rdx ; Уменьшает указатель стека, а затем сохраняет исходный операнд на вершине стека.
popq% rdx ; Загружает значение из верхней части стека в местоположение, указанное с помощью операнда-получателя (или явного кода операции), а затем увеличивает указатель стека.
rax =
rdx =
0x28 | 0x12 |
0x30 | 0x34 | <--- rsp
0x38 | 0x56 |
0x40 | 0x78 |
0x48 | 0x9A |
movq %rsp, %rax
rax = 0x30
rdx =
0x28 | 0x12 |
0x30 | 0x34 | <--- rsp
0x38 | 0x56 |
0x40 | 0x78 |
0x48 | 0x9A |
pushq %rsp ;store, using rsp as the address, then subtract 8 from rsp
rax = 0x30
rdx =
0x28 | 0x12 | <--- rsp
0x30 | 0x30 |
0x38 | 0x56 |
0x40 | 0x78 |
0x48 | 0x9A |
popq %rdx ;load, using rsp as the address, then add 8 to the rsp
rax = 0x30
rdx = 0x30
0x28 | 0x12 | <--- rsp
0x30 | 0x30 |
0x38 | 0x56 |
0x40 | 0x78 |
0x48 | 0x9A |
subq %rdx, %rax ;Return 0
rax = 0x00
rdx = 0x30
0x28 | 0x12 |
0x30 | 0x30 | <--- rsp
0x38 | 0x56 |
0x40 | 0x78 |
0x48 | 0x9A |