Discussion:
bx - ein "gemeinsamer" wert von bh und bl ?
(zu alt für eine Antwort)
Manuel Ems
2006-05-11 19:42:35 UTC
Permalink
guten tag,
um meine frage verstaendlich zu machen schiebe ich als erstes
ein kleines beispiel ein:

movb $0x02, %bl
movb $0x04, %bh


...wenn ich nun den wert von %bx abfrage ist es '2', also der des
nidierigen bytes von bx, muesste bx aber nicht aus beiden bytes bestehen?
also eine vollkommen neue zahl entstehen lassen weil die bits von 2 (10)
und von 4 (100) hintereinander stehen, sie also zusammengefasst werden?
mache ich etwas falsch? wieso wird das hoehere bit nicht beruecksichtigt?
gbit es evtl einen weg zwei uterschiedliche bytes mit dem gleichen effekt
'zu vereinen'?

wuerde mich ueber eine antwort sehr freuen

lg, manu

(hier noch der gesamte code):
.text
.global _start
_start:

movb $0x02, %bl
movb $0x04, %bh

push %bx
call sys

sys:
int $0x80
ret
Alexander Bartolich
2006-05-11 20:01:48 UTC
Permalink
Post by Manuel Ems
[...]
.text
.global _start
movb $0x02, %bl
movb $0x04, %bh
push %bx
call sys
int $0x80
ret
Für welche Plattform soll denn der Code sein?

ATT-Syntax und "int 0x80" sehen prinzipiell nach Linux aus. Allerdings
werden Argumente dort nicht am Stack, sondern in Registern übergeben.
Und diese Argumente sind größer als 16-bit, d.h. die oberen 16-bit
von ebx sind bei dir undefiniert.

Keine Ahnung, was du mit dem "call sys" bezweckst, aber der einzige
Systemaufruf, beim dein Code Sinn ergibt, ist exit(2).

$ grep exit /usr/src/linux-2.6.13/include/asm-i386/unistd.h
#define __NR_exit 1

Dieser Wert gehört vor dem "int 0x80" nach eax.
--
Ich kenne die Mißverständnisse-FAQ, und sie wird oft mißverstanden.
-- Andreas M. Kirchwitz <***@krell.zikzak.de>
Alexander Bartolich
2006-05-11 20:02:41 UTC
Permalink
Post by Manuel Ems
[...]
.text
.global _start
movb $0x02, %bl
movb $0x04, %bh
push %bx
call sys
int $0x80
ret
Für welche Plattform soll denn der Code sein?

ATT-Syntax und "int 0x80" sehen prinzipiell nach Linux aus. Allerdings
werden Argumente dort nicht am Stack sondern in Registern übergeben.
Und diese Argumente sind größer als 16-bit, d.h. die oberen 16-bit
von ebx sind bei dir undefiniert.

Keine Ahnung, was du mit dem "call sys" bezweckst, aber der einzige
Systemaufruf, bei dem dein Code Sinn ergibt, ist exit(2).

$ grep exit /usr/src/linux-2.6.13/include/asm-i386/unistd.h
#define __NR_exit 1

Dieser Wert gehört vor dem "int 0x80" nach eax.
--
Ich kenne die Mißverständnisse-FAQ, und sie wird oft mißverstanden.
-- Andreas M. Kirchwitz <***@krell.zikzak.de>
Jan Bruns
2006-05-11 23:47:06 UTC
Permalink
Post by Manuel Ems
movb $0x02, %bl
movb $0x04, %bh
...wenn ich nun den wert von %bx abfrage ist es '2',
Also wenn es um x86er geht, muss da mit der Abfrage was verkehrt
laufen. "bx" hat nach den beiden Befehlen auf jeden Fall den Wert
$0402, das hast Du schon richtig verstanden.

Gruss

Jan Bruns
Manuel Ems
2006-05-12 17:15:56 UTC
Permalink
oh man, ich habe auch einen mehr als bescheuerten fehler gemacht, das
Post by Manuel Ems
push %bx
call sys
da muesste noch ein movl $0x01, %eax zwischen, sonst weiss das system ja
nicht welcher call ausgefuehrt werden muss.

alexander, es ging um freebsd, freebsd holt sich die argumente zu den
systemcalls aus dem stack - und haette ich nicht diesen idiotischen fehler
gemacht, haette es sicher auch funktioniert.

hier noch einmal ein code der das bx register auf den inhalt prueft, und
moeglicherweise auch recht aussagekraeftigt zeigt was ich meinte...

aber trotzdem mal danke fuer die hilfe :)

lg, manu

.data
bx_yes: .string "%bx == $0x0402\n"
len1 = . - bx_yes - 1

.text

sys:
int $0x80
ret

.global _start
_start:
movb $0x04, %bh
movb $0x02, %bl

cmp $0x0402, %bx
jne ende

pushl $len1
pushl $bx_yes
pushl $0x01
movl $0x04, %eax
call sys

ende:
pushl $0x00
movl $0x01, %eax
call sys
Alexander Bartolich
2006-05-12 19:45:19 UTC
Permalink
Post by Manuel Ems
[...]
alexander, es ging um freebsd, freebsd holt sich die argumente zu den
systemcalls aus dem stack - und haette ich nicht diesen idiotischen fehler
gemacht, haette es sicher auch funktioniert.
http://user.nj.net/~tms/hello.html

Da fehlt immer noch was.

addl $12, %esp # Clean stack.

Meine Glaskugel meint erstens, dass du nicht mit einen Debugger
arbeitest, sondern aus der Ausgabe (bzw. fehlenden Ausgabe) des
Programms Rückschlüsse auf das Register ebx machst.

Und zweitens, dass du unsystematisch vorgehst, also nicht zuerst
prüfst, ob dein Systemaufruf überhaupt funktioniert.
Post by Manuel Ems
hier noch einmal ein code der das bx register auf den inhalt prueft, und
moeglicherweise auch recht aussagekraeftigt zeigt was ich meinte...
Ok, FreeBSD/i386 habe ich nicht laufen.

Dein Code lässt sich aber auch unter Linux übersetzen und mit gdb
durchsteppen. %bx hat den erwarteten Wert, und dein Sprung wird
nicht ausgeführt.

Dein Problem liegt woanders.
--
Ich kenne die Mißverständnisse-FAQ, und sie wird oft mißverstanden.
-- Andreas M. Kirchwitz <***@krell.zikzak.de>
Manuel Ems
2006-05-13 15:07:30 UTC
Permalink
Post by Alexander Bartolich
Meine Glaskugel meint erstens, dass du nicht mit einen Debugger
arbeitest, sondern aus der Ausgabe (bzw. fehlenden Ausgabe) des
Programms Rückschlüsse auf das Register ebx machst.
hm deine glaskugel hat recht, habe mir vor einiger zeit den gdb mal
angesehn, der ist aber recht ungewohnt und kompliziert, habe mir
gerade mal das ddd frontend installiert, vllt komme ich da so mal ein
bisschen rein, und vllt stolpere ich mal ueber ein brauchbares tutorial..

naja, zu meiner verteildigung muss ich sagen dass mir sonst solche fehler
nicht unterlaufen, als ich am naechsten tag reingeschaut habe hab ich es
sofort gemerkt dass da etwas nicht stimmt, deswegen gehe ich mal davon aus
dass ich einfach zu muede und erschoepft war - wie auch immer, der letzte
code hat aber funktioniert, zu meiner zufriedenheit

Lesen Sie weiter auf narkive:
Loading...