Как перейти к предыдущей инструкции - PullRequest
0 голосов
/ 02 августа 2020

Можно ли сделать что-то подобное?

.globl main
main:
    movl     $4,     %eax
    dec     %eax
    jnz    ... # jump back to the previous instruction if not zero
    ret

Если нет, то как правильно сделать что-то подобное? Я предполагаю, что соответствующий C будет примерно таким:

int main() {
    char a = 4;
    while (a-- != 0);
}

Вот то, что я придумал до сих пор, но не уверен, правильный ли это способ сделать это или как это может быть улучшено (например, почему разделы обычно начинаются с точки, например .L1?):

.globl main
main:
    movl     $4,     %eax
DECREMENT:
    dec     %eax
    jnz     DECREMENT
    ret

Ответы [ 2 ]

7 голосов
/ 02 августа 2020

Это именно , для чего нужны ярлыки. Вы можете просто ввести новую метку и использовать ее в качестве цели для инструкции jnz:

.globl main
main:
    movl    $4, %eax
prev:
    dec     %eax
    jnz     prev
    ret

Имейте в виду, что это создает prev как метку для всего файла, то есть она должна быть уникальной. во всем исходном файле. Некоторые ассемблеры также предоставляют метки с цифрами c, которые могут дублироваться. Когда вы их используете, он находит ближайший в указанном направлении:

.globl main
main:
    movl    $4, %eax
1:
    dec     %eax
    jnz     1b        ; closest '1', going backwards (b).
    ret

Это очень удобная функция, которая позволяет вам делать «локализованные» метки, не загрязняя пространство имен меток, и избавляет от необходимости использовать длинные метки, например main_loop_1. Суффикс числовой метки c указывает направление на go при поиске метки, b - назад, f - вперед.

2 голосов
/ 02 августа 2020

Используйте метку:

.globl main
main:
    movl     $4,     %eax
loop:
    dec     %eax
    jnz     loop
    ret
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...