Бывает ли программный код без операторов ветвления (совсем) может известны какие то программы. Циклы можно, но без ветвления (if). Вопрос конечно теоретический но мне всегда было интересно.

  • cocucka
    link
    fedilink
    arrow-up
    0
    ·
    1 year ago

    Но ТС не в курсе, что этот код в результате исполняет абсолютно идентичные команды.

    int test(int a, int b){
        while (a>b) {
        a = a*b;
        break;
        }
        return a;
    }
    
    int test2(int a, int b){
        if (a>b) {
        a = a*b;
        }
        return a;
    }
    
    test(int, int):
            push    rbp
            mov     rbp, rsp
            mov     DWORD PTR [rbp-4], edi
            mov     DWORD PTR [rbp-8], esi
            nop
            mov     eax, DWORD PTR [rbp-4]
            cmp     eax, DWORD PTR [rbp-8]
            jle     .L3
            mov     eax, DWORD PTR [rbp-4]
            imul    eax, DWORD PTR [rbp-8]
            mov     DWORD PTR [rbp-4], eax
            nop
    .L3:
            mov     eax, DWORD PTR [rbp-4]
            pop     rbp
            ret
    test2(int, int):
            push    rbp
            mov     rbp, rsp
            mov     DWORD PTR [rbp-4], edi
            mov     DWORD PTR [rbp-8], esi
            mov     eax, DWORD PTR [rbp-4]
            cmp     eax, DWORD PTR [rbp-8]
            jle     .L7
            mov     eax, DWORD PTR [rbp-4]
            imul    eax, DWORD PTR [rbp-8]
            mov     DWORD PTR [rbp-4], eax
    .L7:
            mov     eax, DWORD PTR [rbp-4]
            pop     rbp
            ret
    
    • JamesHolden
      link
      fedilink
      arrow-up
      0
      ·
      1 year ago

      Ессесно. А ещё спрашивают, зачем надо учить ассемблер.

    • JamesHolden
      link
      fedilink
      arrow-up
      0
      ·
      1 year ago

      Вот, @Holger, тут ветвление компилятор реализовал через прыжок jle на метку, а в ARM ассемблере прыжка бы не требовалось, там просто суффиксом саму операцию a*b сделали бы условно выполняющейся.