2016-05-24 6 views
0

Quellcode zusammengestellt:Die Regel der jne in Code von klirren

int main(int argc, const char * argv[]) { 

do { 
    printf("heihei"); 
}while (1 < 2); 

return 0;} 

Zusammengestellt:

LBB0_1:         ## =>This Inner Loop Header: Depth=1 
leaq L_.str(%rip), %rdi 
movb $0, %al 
callq _printf 
movl %eax, -20(%rbp)   ## 4-byte Spill 

movb $1, %al 
testb $1, %al 
jne LBB0_1 
jmp LBB0_3 
LBB0_3: 

Offensichtlich ist dies do-while-Schleife ist unendlich. Meiner Meinung nach würde testb $ 1,% al ZF auf 1 setzen. Da jne nur springt, wenn ZF 0 ist (jne: Sprungoption: ~ ZF), wie kommt es, dass der Fluss zurück zu LBB0_1 springt?

Btw, haben Sie eine Empfehlung für Bücher zum Lernen Clang generiert Assembler-Code und alle anderen verwandten Inhalten? (Speziell von Objective-C-Code)

+0

Welchen Unterschied macht der Compiler? Offensichtlich werden verschiedene Compiler (und Optionen) anderen Code erzeugen, aber am Ende des Tages ist es eine Frage des Verständnisses des Assemblers. – trojanfoe

Antwort

1

WW

Die Beschreibung der test Anweisung:

TEST - Logische Vergleichen

Berechnet die bitweise logische UND-Verknüpfung ersten Operanden (Operand Quelle 1) und der zweite Operand (Operand Quelle 2) und setzt die Statusflags SF, ZF und PF entsprechend dem Ergebnis. Das Ergebnis wird dann verworfen.

In diesem Fall jne ist auch mit . Die Anweisung wird oft für einen Null-Wert zu testen, so dass Sie Dinge wie sehen:

testb %al, %al 
jz  somewhere 

Um Ihre andere Frage, was Sie suchen, ist die GAS (Gnu Assembler) Syntax und Sie können eine Welt finden Informationen im Internet, aber überprüfen Sie den Wikibooks Link.