Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

bx - ein "gemeinsamer" wert von bh und bl ?

5 views
Skip to first unread message

Manuel Ems

unread,
May 11, 2006, 3:42:35 PM5/11/06
to
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

unread,
May 11, 2006, 4:01:48 PM5/11/06
to
Manuel Ems schrieb:
> [...]

> (hier noch der gesamte code):
> .text
> .global _start
> _start:
>
> movb $0x02, %bl
> movb $0x04, %bh
>
> push %bx
> call sys
>
> 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 <slrne144u...@krell.zikzak.de>

Alexander Bartolich

unread,
May 11, 2006, 4:02:41 PM5/11/06
to
Manuel Ems schrieb:
> [...]

> (hier noch der gesamte code):
> .text
> .global _start
> _start:
>
> movb $0x02, %bl
> movb $0x04, %bh
>
> push %bx
> call sys
>
> 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).

Jan Bruns

unread,
May 11, 2006, 7:47:06 PM5/11/06
to

"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

unread,
May 12, 2006, 1:15:56 PM5/12/06
to
oh man, ich habe auch einen mehr als bescheuerten fehler gemacht, das
erklaert warum es nicht funktionierte:

> 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

unread,
May 12, 2006, 3:45:19 PM5/12/06
to
Manuel Ems schrieb:
> [...]

> 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.

> 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.

Manuel Ems

unread,
May 13, 2006, 11:07:30 AM5/13/06
to
Am Fri, 12 May 2006 22:45:19 +0200 schrieb 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

0 new messages