цикл while на ассемблере - PullRequest
       1

цикл while на ассемблере

3 голосов
/ 21 сентября 2011

В C ++ есть такой код:

#include <iostream>

int main(){
  int a = 4;
  while(a--){
    std::cout << (a + 1) << '\n';
  }
  return 0;
}

и соответствующий код основной функции в коде сборки, создаваемом g ++:

.globl main
    .type   main, @function
main:
.LFB957:
    .cfi_startproc
    .cfi_personality 0x0,__gxx_personality_v0
    pushl   %ebp
    .cfi_def_cfa_offset 8
    movl    %esp, %ebp
    .cfi_offset 5, -8
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $32, %esp
    movl    $4, 28(%esp)    # int a = 4;
    jmp .L2
.L3:
    movl    28(%esp), %eax     # std::cout << (a + 1) << '\n';
    addl    $1, %eax
    movl    %eax, 4(%esp)
    movl    $_ZSt4cout, (%esp)
    call    _ZNSolsEi
    movl    $10, 4(%esp)
    movl    %eax, (%esp)
    call    _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c
.L2:
    cmpl    $0, 28(%esp)
    setne   %al
    subl    $1, 28(%esp)    # a = a - 1
    testb   %al, %al
    jne .L3
    movl    $0, %eax
    leave
    ret
    .cfi_endproc
.LFE957:
    .size   main, .-main

Какие используются инструкции setne и testb в следующихфрагмент для?

 .L2:
        cmpl    $0, 28(%esp)
        setne   %al
        subl    $1, 28(%esp)    # a = a - 1
        testb   %al, %al
        jne .L3

Неужели не может быть так просто проверить в цикле while, не является ли а нулем, и прыгнуть?

Ответы [ 3 ]

5 голосов
/ 21 сентября 2011

Условие while формально эквивалентно:

while ( a -- != 0 )

(Пропуск сравнения - это законное запутывание.)

Компилятор генерирует код для сравнения a с 0, сохраните результаты в регистре al, затем уменьшите a, а затем проверьте сохраненные результаты.

1 голос
/ 21 сентября 2011

Поскольку a-- означает

tmpval=a;
a=a-1;
return tmpval;

, поэтому компилятору необходимо сохранить предыдущее значение a.В этой программе часть тела while будет выполняться при a = 0 (после a--, поэтому будет печататься 1).

0 голосов
/ 21 сентября 2011

Прошло много времени с тех пор, как я создал ассемблер, но я бы предположил, что это некоторая оптимизация, чтобы сохранить конвейеры занятыми / оптимизировать использование регистров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...