Wpis z mikrobloga

Mam taki prosty programik:

#include

int main()
{
int a = 3;
int b = 5;

if (a == b)
{
printf("Terefere\n");
}

return 0;
}

Assembly z tego kodu w okolicach w/w ifa wygląda mniej więcej tak(IDA FREEWARE, kod uproszczony przeze mnie, nie zadziała po wklejeniu):
//.....
mov eax, 3
cmp eax, 5
jnz locaddress123
call printf //wyświetlenie napisu

loc
address123: //zakończenie pracy programu
retq
//....

Jeżeli dobrze rozumiem to w przypadku kiedy porównanie zwróciłoby TRUE, to flaga ZF ustawiona zostałaby na 1.
W tym przypadku flaga ZF będzie miała wartość 0.

Jak to się ma do instrukcji JNZ?
Skoro definicja mówi: "jump, if not zero" to skok nastąpi w momencie kiedy porównanie będzie prawidłowe? Czyli kiedy dwie liczby będą równe. A skoro nastąpi skok to nie wykona się instrukcja "printf". Trochę to dziwne :/
Zwłaszcza, że kłóci się to z tożsamą instrukcją JNE "jump, if not equal", która w swojej treści jest jasna.

#programowanie #assembler
  • 4
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@bielu000: zero flag ma wartość true kiedy wynikiem odejmowania jest 0, jak sama nazwa wskazuje. Porównanie to tak napwrawdę odejmowanie (żeby dało się stwierdzić, która liczba jest większa, a nie tylko czy są równe).

Kompilator odwrócił sobie ifa, bo tak jest optymalniej (spróbuj napisać assemblera bez odwracania ifa, to zobaczysz czemu - będziesz potrzebował 2 skoków :) ).
  • Odpowiedz