[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 980

    macht 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


Anmelden zum Antworten