[GAS] Erklärung, Register, Parameter.
-
Hi
Ich habe hier mal den Code im INET gefunden:
.data # section declaration msg: .ascii "Hello, world!\n" # our dear string len = . - msg # length of our dear string .text # section declaration # we must export the entry point to the ELF linker or .global _start # loader. They conventionally recognize _start as their # entry point. Use ld -e foo to override the default. _start: # write our string to stdout movl $len,%edx # third argument: message length movl $msg,%ecx # second argument: pointer to message to write movl $1,%ebx # first argument: file handle (stdout) movl $4,%eax # system call number (sys_write) int $0x80 # call kernel # and exit movl $0,%ebx # first argument: exit code movl $1,%eax # system call number (sys_exit) int $0x80 # call kernel
Ich habe hier eine kleine Frage. Es wird sys_write aufgerufen (4 + 0x80). Das ist soweit klar. Was ich nicht verstehe ist die Argumenteübergabe. Also dies hier:
movl $len,%edx # third argument: message length movl $msg,%ecx # second argument: pointer to message to write movl $1,%ebx # first argument: file handle (stdout) movl $4,%eax # system call number (sys_write) int $0x80 # call kernel
hier noch aus der Manpage:
SYNOPSIS #include <unistd.h> ssize_t write(1,2)(int fd, const void *buf, size_t count);
Man übergibt ja die Argumente immer von rechts nach links (also von hinten). Und mir ist unklar wieso:
size_t count das Reg edx benutzt. const void *buf das Reg ecx benutzt und int fd das Reg ebx benutzt.
Soviel ich weiss ist ja CX = Zählregister. AX Akkumulator (oder so), etc. Ich sehe mit anderen Worten keinen Zusammenhang.
Aber was ich auch vermute ist oder sein könnte, dass man einfach bei der links bei ebx beginnt (eax ist der Syscall). und dann einfach weiter fährt: eYx, Y = a, dann b, dann c, dann d, dann e?
Ich glaube, dass weder das Eine noch Andere stimmt.
Danke für Ihre Hilfe
Gruss unix]newbie.
-
Das ist halt einfach so festgelegt und hat überhaupt keinen tieferen Hintergrund.
eax/ebx/ecx/edx enthalten in dieser Reihenfolge Syscall-Nummer, 1., 2. und 3. Argument. Mehr gibt's nicht, iirc.
-
Ok, bin ich froh ,-) Thx.
Da wär noch ne Frage:
msg: .ascii "Hello, world!\n' # our dear string len = . - msg # length of our dear string
len = . - msg
Was geht da genau vor sich? Punkt, Strich? Danke
-
Was $-msg bedeuten kann weiss ich noch, das bedeutet
$ = Actuelle position im speicher z.B 1000
msg: = Label, also auch sone position im speicher z.B 980macht man 1000-980 bekommt man stringlänge
ich vermute genau so ist es gemeint, aber halt blöde AT&T-syntaks
-
Anscheinend wird in AT&T syntaks anstatt $ einfach ein Punkt benutzt
sonst kann ich es nicht erklären
-
unix]newbie schrieb:
len = . - msg
len ist eine Konstante, welche eben für die Länge des Strings msg steht. Mit dem =-Operator werden Konstanten Werte zugewiesen. der Punkt steht hier wohl für die aktuelle Adresse (statt des Punktes wird auch häufig das Dollarzeichen benutzt '$'). len = . - msg bedeutet also in Worten soviel wie: Erzeuge eine Konstante mit dem Namen 'len' und weise ihr den Wert der aktuellen Adresse minus der Adresse von 'msg' zu. Und die aktuelle Adresse minus der Adresse von 'msg' ergibt logischerweise die Länge des String 'msg'.
Und die Länge wird halt gebraucht, da der SystemCall wissen will, wieviele Zeichen er ausgeben muss.
-
Vielen Dank an alle.
Ich glaube, jetzt habe ichs gerafft ;-).Wünsche euch einen schönen Freitag.
Gruss
unix]newbie