На команду JL в x86 влияют другие инструкции между cmp и этим? - PullRequest
1 голос
/ 14 марта 2020

Я пытаюсь реализовать два цикла с отступом, как показано на скриншоте ниже. Отладчик показывает, что r13 равно 0 и r14 равно 9. почему тогда он пропускает инструкцию JL и переходит прямо к инструкции mov r13, 0

Я подозревал, что инструкция in c в за это отвечает середина, но это не имеет никакого смысла, потому что биты флага все еще остаются неизменными

pop r10 ; contains the size of the array 
    pop rax ; address of the array in memory 
    mov r11, rax ; copy of the address from rax now

    mov r12, 0 ; int i 
    mov r13, 0 ; int j 

    dec r10

    i_loop: 
        mov r14, r10
        sub r14, r12
        j_loop:


            mov r8, [r11 + r13 * 8]
            mov r9, [r11 + r13 * 8 + 8]

            cmp r8, r9  
            jg swap

            back: 
            inc r13
            cmp r13, r14

            jl j_loop


        mov r13, 0
        inc r12
        cmp r12, r10
        jl i_loop


1 Ответ

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

Флаги, называемые кодами условий, представляют собой набор 1-битных регистров. Наборы инструкций cmp. Но многие инструкции, кроме cmp, также устанавливают коды условий, а многие другие - нет. Поэтому, когда у вас есть какие-то другие инструкции между сравнением и ответвлением, вы должны проверить ссылку на набор команд, чтобы увидеть, устанавливает ли эта инструкция также коды условий. Вы также должны быть в состоянии проверить, что коды состояния - 1-битные регистры - в отладчике. Вы увидите, что они установлены правильно после cmp, а затем перенастроены после inc.


См. Также { ссылка } re: инструкция in c

и { ссылка } re: для просмотра флагов в gdb - используйте info reg eflags или layout reg

...