Intel x86-64 сборка перехода вопрос вопрос - PullRequest
0 голосов
/ 09 марта 2020

Мне поручено выполнить обратный инжиниринг кода сборки обратно в C -код

    jge    .L4
    movq   $76, -16(%rbp)
    movq   $87, -24(%rbp)
    jmp    .L5

.L4:
    movq   -16(%rbp), %rax
    imulq  -24(%rbp), %rax
    movq   %rax, -40(%rbp)

.L5:
    do more stuff

У меня вопрос после того, как я закончу с инструкциями L4 (оператор if с использованием операций упорядочения), могу ли я go выполнить резервное копирование и выполнить код для перемещения 76 и 87 в ячейки памяти или мне перейти на L5? Также, возможно, инструкции по перемещению 76 и 87 будут в другом выражении?

1 Ответ

3 голосов
/ 09 марта 2020

Нет ничего, что восходит. jge - это не вызов функции, это просто переход, который нигде не сохраняет старое местоположение.

Так что это в основном просто операторы if и else. В псевдокоде это может быть записано как

if (ge) {
    // .L4
    movq   -16(%rbp), %rax
    imulq  -24(%rbp), %rax
    movq   %rax, -40(%rbp)
} else {
    movq   $76, -16(%rbp)
    movq   $87, -24(%rbp)
}
// .L5
do more stuff

. Обратите внимание, что порядок блоков if/else противоположен порядку кода сборки, потому что jge перепрыгивает сразу после следующего блока, когда условие верно.

...