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