Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Assembly: NASM tietoa

kayttaja-3842 [29.09.2008 12:04:31]

#

Terve vaan kaikille!

Elikkäs olen tässä pari päivää jo opiskellut tätä NASMIA ja kaikki muu alkaa olee selvää kuin pullamössö, mutta noita moveja en oikein tajua.

elikkäs

Alla näkyy Hello World koodi ja haluaisin selvennystä mov kohtiin. Eli kohdat jossa siiretään dataa mov:lla niin mistä sen tietää mihin noista rekistereistä pitää muistia siirtää?Kun tuossa siiretään esim mov edx,len nniin miksi juuri tuo len siiretään edx eikä esim ecx??? Mistä sen tietää, että mikä data pitää mihinkin siirtää?

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


        mov     edx,len ;third argument: message length
        mov     ecx,msg ;second argument: pointer to message to write
        mov     ebx,1   ;first argument: file handle (stdout)
        mov     eax,4   ;system call number (sys_write)
        int     0x80	;call kernel

;and exit




	mov	ebx,0	;first syscall argument: exit code
        mov     eax,1   ;system call number (sys_exit)
        int     0x80	;call kernel

section .data				;section declaration

msg     db      "Hello, world!",0xa	;our dear string
len     equ     $ - msg               ;length of our dear string

Päärynämies [29.09.2008 13:15:03]

#

Noille järjestelmän keskeytyksille (int 0x80) argumentit välitetään rekisterien avulla. Esimerkissäsi eax:n pitää sisältää halutun systeemikutsun (system call) numeron, ebx:n kirjoitettavan tiedoston, ecx:n osoitin kirjoitettavaan tietoon ja edx:n kirjoitettavien tavujen määrä. Nyt sitten tuo keskeytys katsoo sitten, että haluat tuossa kirjoittaa stdoutiin (ebx) edx:n verran tavuja osoitteesta ecx.

Jos sinulla on kokemusta muista kielistä, niin voit verrata tuota niiden funktioiden kutsuun. Vertaa tuota käyttämääsi keskeytystä vaikkapa C -kielen standardikirjaston fwrite -funktioon [size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream )]. Siinäkin noilla funktion argumenteilla on tietty järjestys tai ns. "omat paikat".

Noista eri sysmteemikutsuista löytyy varmasti lista internetistä, että mikä on mnkäkin numero ja mitä ne tahtovat mihinkin rekistereihin. Google osannee auttaa.

Toivottavasti selvensi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta