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?
Yksinkertainen juttu varmasti mutta...
3
225
Vastaukset 3
- 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
- 681246
Kai mua vähän
Masentaa tämä kaikki. Tämä koko meidän välinen juttu on niin vaikea… Voitaisiinko molemmat lopettaa tilanteen ruokkimine1381054Onko karhukanta jo liian iso? Lenkkeilijä kohtasi kontion juoksulenkillä
Rantasalmella lenkkeilijä kohtasi karhun. Kylällä karhun näkeminen on ollut tosi harvinaista. Onko karhukanta jo liian i113704S-ryhmän Israel-boikotti liiketalouden opintojen tapausesimerkkinä
Tätä S-ryhmän Israel-boikottitapausta käsitellään jo kauppakorkeakoulujen ja johtamiskorkeakoulujen esimerkeissä. Se ant22615Vanhat konkarit ulos Elämäni biisistä - Yle selittelee
Elämäni biisi starttaa taas tänä syksynä. Mukana on ripaus uutta, mutta poissa on iso osa vanhaa... Poissa ovat Markku16611Oot upea nainen, älä vähättele ittees
Ja tietojeni mukaan 2 muuta on susta kiinnostuneit mun lisäks. 👀32561Mitä tehdä kun rakastan yhtä ja olen rakastunut toiseen
Kamala tilanne. Voinko pitää molemmat? 😁61541Mies miksi moinen vetäytyminen?
1) Olit loukkaantunut tai suuttunut 2) Sulla oli toinen nainen 3) Luulit, etten halua jatkaa tutustumista 4) Vai joku52519Mitä vit,,tua!
Mikä hiivatin kommunistien teltta oli kirsikan nurkalla, olivat vähällä jäädä telttoinensa auton alle kun olivat sen kul22506Hyvä Kukkola! toitte tänne taas jotain uutta
Niin sitä pitää! Kehittää oikeasti tarjontaa. Nyt on maut kohdillaan! Käykäähän herkuttelemassa wingseillä ja siipiweikk62485