Το να γράψουμε Assembly από το μηδέν μπορεί να είναι δύσκολο. Εδώ θα δούμε πως μπορούμε να ξεκινήσουν από κώδικα C, να τον μετατρέψουμε σε Assembly, να κάνουμε τυχόν προσθήκες και να τον μεταγλωττίσουμε.
Έστω ότι έχουμε το πρόγραμμα helloworld.c σε C:
- Κώδικας: Επιλογή όλων
#include <stdio.h>
int main(void)
{
printf("Γεια σου Ubuntu-gr!");
return 0;
}
Το μετατρέπουμε σε Assembly (τύπου «as», που είναι ο Assembler του GNU Compiler Collection, και διαφέρει σε σύνταξη από το nasm) με
- Κώδικας: Επιλογή όλων
gcc -S helloworld.c
Παράγει το αρχείο helloworld.s,
- Κώδικας: Επιλογή όλων
.file "helloworld.c"
.section .rodata
.LC0:
.string "\316\223\316\265\316\271\316\261 \317\203\316\277\317\205 Ubuntu-gr!"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
movl $.LC0, %eax
movq %rax, %rdi
movl $0, %eax
call printf
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
.section .note.GNU-stack,"",@progbits
Εδώ μπορούμε να κάνουμε αλλαγές/προσθήκες κτλ. Πως μεταγλωττίζουμε ξανά;
Εκτελούμε
- Κώδικας: Επιλογή όλων
as helloworld.s -o helloworld.o
όπου παράγει το helloworld.o, το ενδιάμεσο αρχείο με το λεγόμενο αντικειμενικό κώδικα (object code).
Και συνδέουμε (link) το helloworld.o με τις βιβλιοθήκες συστήματος με την εντολή (θα μπορούσαμε και με την «ld», ωστόσο θέλει πολλές παραμέτρους· δείτε το άρθρο αυτό)
- Κώδικας: Επιλογή όλων
gcc helloworld.o -o helloworld
και εκτελούμε με
- Κώδικας: Επιλογή όλων
$ ./helloworld
Γεια σου Ubuntu-gr!