Assembler: Vergleiche & Sprünge

Pascal, Basic und andere nicht aufgelistete
nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Assembler: Vergleiche & Sprünge

Beitrag von nufan » So Jul 06, 2014 11:29 pm

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.

Benutzeravatar
Architekt
Beiträge: 172
Registriert: Sa Mai 24, 2014 12:04 pm

Re: Assembler: Vergleiche & Sprünge

Beitrag von Architekt » Mo Jul 07, 2014 5:18 pm

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.

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Assembler: Vergleiche & Sprünge

Beitrag von oenone » Mo Jul 07, 2014 6:08 pm

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

Benutzeravatar
Architekt
Beiträge: 172
Registriert: Sa Mai 24, 2014 12:04 pm

Re: Assembler: Vergleiche & Sprünge

Beitrag von Architekt » Mo Jul 07, 2014 6:42 pm

Dann ist für mein Vorhaben also and, or und xor völlig uninteressant? :?

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Assembler: Vergleiche & Sprünge

Beitrag von oenone » Mo Jul 07, 2014 7:06 pm

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.

Antworten