Yksinkertainen juttu varmasti mutta...

ex--pertti

C-kielellä:

#include

int main(void)
{
printf("Hello world!\n");
return 0;
}

Linux Assembly Tutorial:

section .data
hello: db 'Hello world!',10 ; 'Hello world!' plus a linefeed character
helloLen: equ $-hello ; Length of the 'Hello world!' string

section .text
global _start

_start:
mov eax,4 ; The system call for write (sys_write)
mov ebx,1 ; File descriptor 1 - standard output
mov ecx,hello ; Put the offset of hello in ecx
mov edx,helloLen ; helloLen is a constant, so we don't need to say
; mov edx,[helloLen] to get it's actual value
int 80h ; Call the kernel

mov eax,1 ; The system call for exit (sys_exit)
mov ebx,0 ; Exit with return code of 0 (no error)
int 80h

Mutta sitten taas gcc-kääntäjällä C-koodi kääntyy Assemblyksi? ihan eri tavalla

gcc -S hello.c

Saadaan seuraavanlaista koodia

.file "hello.c"
.section .rodata
.LC0:
.string "Hello world!"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
call puts
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.7.2-5) 4.7.2"
.section .note.GNU-stack,"",@progbits

Osaisiko joku selventää miksi GCC kääntää koodin ihan erilaiseksi, toinen koodinpätkä on toki kääntäjän tuottamaa itseään varten, mutta koodi on kuitenkin samalle käyttöjärjestelmälle ja arkkitehtuurille? Miksi se on noin erinäköistä? Tarviiko sen olla?

3

225

    Vastaukset 3

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Turhaako?

      Selitä ensin mihin tarvit tällaista tietoa.

      • ex--pertti

        Yritän opetella Linux Assemblyä ja GCC-kääntäjän toimintaa. Assembly Tutorial on ihan hyvä mutta jos C-kääntäjä ei tuota lähellekään samanlaista koodia niin olisi kiva tietää syy.


    • ex--pertti

      Vastaan itse itselleni, heh

      http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s3

      Jos jotakuta siis kiinnostaa tietää. GCC kääntää tuosta C-koodista AT&T syntaksia joka on melko erilaista verrattuna Intelin syntaksiin. En tiedä johtuuko siitä mutta GCC kääntäjällä ohjelman koko tulee olemaan 6,4K kun taas esim. NASM kääntää tuosta Intelin syntaksista ohjelman kooksi vain 456 bytesia, eli GCC tekee "samasta" ohjelmasta 14x suuremman.

      Onko tuohon mitään sanottavaa?

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Metsamanin muru kissa kuollut

      Nyt siellä surraan muru kissaa päivä tolkulla,vaikka muuten ei oo välittänyt mitenkään siitä,kun joka videolla vaan mars
      Tuusniemi
      152
      2470
    2. 79
      1056
    3. Kysymys

      Pystyisitkö tutustuu kaverina tai alkaa parisuhteeseen skitsofreenikon kanssa? T.Skitosoaffektiivinen (parantunut) Ois
      Sinkut
      236
      987
    4. Mitä haluaisit kysyä

      kaivatultasi juuri nyt?
      Ikävä
      121
      966
    5. Tapailtaisko nainen

      Meidän kotien puolessavälissä suunnilleen, vähä niinku salaa. Siinä on yks kiva paikka joka sopis hyvin. Mieheltä
      Ikävä
      73
      803
    6. Olisitko valmis lähitulevaisuudessa

      Kohtaamaan minut mies?
      Ikävä
      75
      633
    7. Kissan kuolema

      https://youtube.com/shorts/lJznLVfBTxA?si=h-F1D4Arg4uGjGX- On tuo aivan uskomaton tapaus! Lähes 200 osanottoa ja surun
      Tuusniemi
      91
      573
    8. Haluatko J-mies jutella asiat selviksi vai jäädä palstalle haaveilemaan

      Kuten otsikko sanoo: Haluatko tavata ja jutella, jotta saadaan asioihin selvyys lopullisesti vai haluatko mieluummin haa
      Ikävä
      50
      546
    9. Miten on, luotathan siihen?

      Että vielä tehdään kiihkeästi sitä yhdessä... Tutulle naiselle.❤️‍🔥
      Ikävä
      38
      532
    10. Ei siitä mahdollisesta suhteesta

      saa kukaan tietää jos niin haluat❤️naiselle
      Ikävä
      36
      498
    Aihe