Gute Idee

Hier ist der Code:
(Aber wie gesagt: mit ldyasm-Skript funktioniert es, mit yasm-gcc-Befehlen kommt ein Syntaxfehler in Zeile 4...)
Code: Alles auswählen
.data
intout1:
.string "Eingegebener Wert: %d\n"
intout2:
.string "Das hoechstwertige Bit des eingegebenen Wertes ist %d. Der eingegebene Wert war %d\n"
intout3:
.string "%d\n" # wird egtl. nicht mehr benoetigt...
intout4:
.string "Der eingegebene Wert war eine Null und enthaelt daher keine binaere eins!\n"
.text
.globl main
main:
# Wert(e) fuer die Berechnung:
#movl $13, %eax # 13 = 0b1101
#movl $133, %eax # 133 = 0b10000101 - sollte 7 ergeben
movl $16777349, %eax # 16777349 = 0b0001 0000 0000 0000 0000 1000 0101 - sollte 24 ergeben
#movl $1, %eax # 1 = 0b0001 - sollte 0 ergeben
#movl $-1, %eax # -1 = k.A. - sollte 0 ergeben
#movl $0, %eax # sollte den oberen String ausgeben
# Hier der eigene Code
mov $31, %cl # Zaehlervariable (%cl ist in %ecx enthalten, wird aber fuer den shift benoetigt)
# Vergleich auf 0 um eine Endlosschleife zu umgehen
cmpl $0, %eax
je .L2
.L1:
movl $1, %ebx # Kontrollert eins zum shiften und bitweise Vergleich in %ebx
sall %cl, %ebx # Linksshift von 1 um Zaehlvariable (anfangs 31. sodass %cl = 2^31)
andl %eax, %ebx # Bitweise Verkleich auf Stelle %ecx
cmpl $1, %ebx # Vergleich auf 1 <= %ebx, Sprung bei Erfolg (Terminierungsbedingung):
jge .L3 # Sprung auf Druck und Exit
decl %ecx # Sonst: vermindere Zaehler
jmp .L1 # Springe zurueck zum Algorithmus
.L2:
pushl $intout4 # Bereitstellen und Ausgeben des Strings fuer Wert = 0
call printf
jmp .L4 # Sprung zum Ende, es ist keine Berechnung noetig/moeglich
.L3:
# eingegebenen Wert im %eax ausgeben
pushl %eax # Hier enthaelt %eax den eingegebenen Wert
pushl $intout1
# Ausgeben des hoechstwertigsten Bits:
pushl %eax # Das ist der Wert, den wir eingegeben haben
imull $0, %eax # Ausgaberegister (Akkumulator) nullen
movl %ecx, %eax # Das errechnete hoechste gesetzte Bit verschieben
pushl %eax # Das Ergebnis auf den Stack schieben
pushl $intout2 #
call printf
# Exit
.L4:
movl $1, %eax
int $0x80