Πως γράφουμε Assembly σε Ubuntu μέσω GCC και as

...το μέρος για να ξεκινήσετε!

Συντονιστής: adem1

Κανόνες Δ. Συζήτησης
Παρακαλώ να επιλέξετε, με προσοχή, την άδεια που θέλετε να έχουν οι οδηγοί που συγγράφετε.
Πληροφορίες για τις άδειες μπορείτε να βρείτε εδώ.
Άμα επιθυμείτε κάποια άλλη άδεια επικοινωνήστε με κάποιο Διαχειριστή είτε Συντονιστή.

Σημαντικό είναι να χρησιμοποιήσετε την υπηρεσία http://imagebin.ubuntu-gr.org για τις εικόνες.

Πως γράφουμε Assembly σε Ubuntu μέσω GCC και as

Δημοσίευσηαπό simosx » 30 Ιαν 2012, 11:50

Δείτε και Πως γράφουμε σε Assembly σε Ubuntu (NASM)

Το να γράψουμε 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!       
Τελευταία επεξεργασία από simosx και 07 Φεβ 2012, 02:51, έχει επεξεργασθεί 1 φορά/ες συνολικά
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Πως γράφουμε Assembly σε Ubuntu μέσω GCC και as

Δημοσίευσηαπό pc_magas » 31 Ιαν 2012, 01:36

Καλοοοοοο αν και ξέρω asm για MIPS και PIC16F84A
My blog|Κυπριακή Κοινότητα Ελευθέρου Λογισμικού Λογισμικού ανοικτού Κώδικα
Γνώσεις Linux:Ποτέ αρκετές|Προγραμματισμός: Php, javascript, nodejs, python, bash |Aγγλικά:Καλά
Οι υπολογιστές μου:
Spoiler: show
Ubuntu 16.04 64 bit σεIntel(R) Pentium(R) CPU G4400 @ 3.30GHz, 16Gib Ram, 500Gib Hard Disk, και κάρτα γραφικών Nvidia Geforce GT610
Lubuntu 14.04 σε Dell Inspiron mini 10(1010) intel Atom Z500 1Gb ram και gma500 (εδώθη σε άλλον)
Kubuntu 16.04 Lenovo G70 Intel i5 Nvidia Grapgics Card, Intel Graphics card (έχει 2) με Nouveau, 16Gb RAM, 126GB SSD Σκληρό Δίσκο
Άβαταρ μέλους
pc_magas
powerTUX
powerTUX
 
Δημοσιεύσεις: 2598
Εγγραφή: 12 Απρ 2009, 18:55
Τοποθεσία: Αχαρναί Αττικής
Launchpad: pc_magas
IRC: pc_magas
Εκτύπωση

Re: Πως γράφουμε Assembly σε Ubuntu μέσω GCC και as

Δημοσίευσηαπό Star_Light » 31 Ιαν 2012, 03:32

Πολυ ενδιαφέρον θέμα. Καλή ιδέα σίμο ;) Μπορει καποιος να πάρει τις εντολές απο πάνω πχ

call , mov , push και να τις ψάξει. Ισως το κάνω αύριο αν έχω χρονο .

Η γνωμη μου ειναι πως πυρήνας εδω ειναι οι καταχωρητές (Data Registers) με μια γρηγορη και προχειρη αναζητηση βρήκα τα εξης :

http://www.botskool.com/tutorials/elect ... rogramming
http://www.botskool.com/tutorials/elect ... structions
http://www.compeng.dit.ie/staff/tscarff ... sters.html
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Οδηγοί - How to - Tutorials