PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : assembler: ausgeben einer zahl



sveni
15-01-2007, 12:57
hi zusammen,

ich befasse mich gerade ein bissle mit der assembler programmierung. Ich benutzer dafür nasm & ld unter linux. Hab da ein paar alte bücher und ein paar tutorials aus dem netz.

Das ausgeben von texten ist auch kein problem, z.B. einen string in der variable msg mit der länge len:



mov edx,len ; length of string to print
mov ecx,msg ; pointer to string
mov ebx,1 ; STDOUT
mov eax,4 ; write
int 0x80 ; call kernel

Jetzt möchte ich aber eine einfache zahl ausgaben, welche ich in binär
schreibweise angebe, z.B. 63 = 00111111b mit 8 Bits (1 Byte) dargestellt.

Aber wenn ich nun den vorherigen Code abänder :


mov edx,1 ; length: 1 byte
mov ecx,00111111b ; number
mov ebx,1 ; STDOUT
mov eax,4 ; write
int 0x80 ; call kernel

dann sagt mir nasm, dass ich die zuweisung der binär zahl so nicht vornehmen kann. Kann ich eine binärzahl nicht direkt ausgeben? Muss dass erst mit hilfe der ascii-tabelle umgerechnet werden?

Vermutlich eine einfache frage, aber ich konnte kein beispiel finden in dem eine einfache zahl ausgeben wird.

danke und grüssle
sveni

PS: Warum gebe ich die zahl überhaupt in binär an? Weil ich ein bissle mit dem bit-shiften
experimentieren möchte und mich natürlich interessiert, was sich dabei verändern, z.B. negieren einer zahl ....

OpOs
16-01-2007, 06:46
nee, du kannst nur strings ausgeben...

wie du in deinem eigenen beispiel geschrieben hast, muss du in ecx einen pointer uebergeben, dein binaerwert wird also als pointer interpretiert.

die umwandlung in einen string funzt so:

ich hatte hier (http://www.softgames.de/forum/viewtopic.php?t=3308) schon mal 'nen code gepostet, der int 21h ist das dos aequivalent, du solltest alles recht einfach auf unix und 32bit anpassen koennen...

statt der 10 nimmst du deine entsprechende basis, in deinem fall 2

ContainerDriver
06-11-2007, 22:48
Hallo,

ich hab ein ähnliches Problem.

Hier mal der Code:


section .text
global _start
_start:
mov ebx,5
add ebx,3

mov [ergebnis],ebx
mov ecx,ergebnis

mov edx,4 ;Ausgabe von 4 Bytes

mov ebx,1
mov eax,4
int 80h

mov ebx,0
mov eax,1
int 80h

section .data
ergebnis DD 0
.

strace ./a.out liefert:


florian@leuchtturm1:~/assembler/code$ strace ./a.out
execve("./a.out", ["./a.out"], [/* 35 vars */]) = 0
write(1, "\10\0\0\0", ) = 4
_exit(0) = ?
Process 6965 detached
.

Also da ist die "10" ja, aber warum wird die escaped?

Gruß, Florian

PS: Mir fällt gerade auf, ich war schon seit Ewigkeiten nicht mehr hier im Forum :D

ContainerDriver
07-11-2007, 12:27
So, ich beantworte mal selbst:

write (man 2 write) interpretiert das zweite Argument wohl als char*. Wenn ich jetzt ins A-Register 100 schreibe und 3 addiere, dann bekomme ich als Ausgabe vom Programm oben 'g'. Das 'g' entspricht dem Dezimalwert 103 in der ASCII-Tabelle (http://de.wikipedia.org/wiki/ASCII-Tabelle).

Gruß, Florian