Seite 2 von 2

Re: Assembler: Vergleiche & Sprünge

Verfasst: So Jul 06, 2014 11:29 pm
von nufan
Architekt hat geschrieben:Gibt es da noch eine "schönere" / "bessere" Variante? Oder lieber den Stack vermeiden (sprich kein push) und Register verwenden?
Ich würde dein esp innerhalb deiner Funktion nur ganz am Beginn (sub) und ganz am Ende (add) ändern und dazwischen mit Offsets arbeiten.
Natürlich ist es aber besser mit Registern zu arbeiten, sofern es möglich ist.

Re: Assembler: Vergleiche & Sprünge

Verfasst: Mo Jul 07, 2014 5:18 pm
von Architekt
Ich habe direkt noch eine, wie ich denke, letzte Frage:
Wie würde sich am besten so etwas wie:

Code: Alles auswählen

if (1 == 1 && 2 == 2)
in Assembler realisieren lassen? Ich verstehe den 'andl' Operator nicht ganz. :oops:

Die erste Bedingung würde ich wie folgt angehen:

Code: Alles auswählen

movl $1, %eax
movl $1, %ebx
cmpl %eax, %ebx
Doch nun weiß ich nicht so recht weiter. Muss ich das ganze wie folgt erweitern?

Code: Alles auswählen

movl $1, %eax
movl $1, %ebx
cmpl %eax, %ebx
pushl %eax
movl $2, %eax
movl $2, %ebx
andl %eax, %ebx
Mich verwirrt, wie ich mit den zwei Operanden umgehen soll.

Re: Assembler: Vergleiche & Sprünge

Verfasst: Mo Jul 07, 2014 6:08 pm
von oenone
Architekt hat geschrieben:Ich habe direkt noch eine, wie ich denke, letzte Frage:
Wie würde sich am besten so etwas wie:

Code: Alles auswählen

if (1 == 1 && 2 == 2)
in Assembler realisieren lassen?
Das wird üblicherweise in zwei Vergleiche aufgespalten, so wie

Code: Alles auswählen

if (1 == 1) {
  if (2 == 2) {
    ...
  }
}
In Assembler dann etwa so:

Code: Alles auswählen

movl $1, %eax
movl $1 %ebx
cmpl %eax, %ebx
jne end
movl $2, %eax
movl $2, %ebx
cmpl %eax, %ebx
jne end
...
end:

Edit: Beispiel:

Code: Alles auswählen

main() {
int x,y;
if (x == 1 && y == 2)
  x = y;
}
kompiliert mit gcc -S foo.c
Inhalt foo.S:

Code: Alles auswählen

...
        cmpl    $1, 12(%esp) <--------- x == 1
        jne     L3
        cmpl    $2, 8(%esp) <--------- y == 2
        jne     L3
        movl    8(%esp), %eax  <------------ x = y
        movl    %eax, 12(%esp) <------------ " " "
L3:
        leave

Re: Assembler: Vergleiche & Sprünge

Verfasst: Mo Jul 07, 2014 6:42 pm
von Architekt
Dann ist für mein Vorhaben also and, or und xor völlig uninteressant? :?

Re: Assembler: Vergleiche & Sprünge

Verfasst: Mo Jul 07, 2014 7:06 pm
von oenone
Architekt hat geschrieben:Dann ist für mein Vorhaben also and, or und xor völlig uninteressant? :?
And, Or und Xor sind für Assembler eher als Bit-Verknüpfungen und nicht als logische Verknüpfungen geeignet.