Nasm x86 32 bit

...IDE, compilers, κλπ

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

Nasm x86 32 bit

Δημοσίευσηαπό thodoris_turtle » 20 Οκτ 2008, 21:15

χμμ ειπα να εγκαταστησω(sudo apt-get install nasm) το Nasm για linux το θεμα ειναι οτι δεν εχω ιδεα πως να τρεξω ενα απλο προγραμμα μεσω του Nasm 32 bit x86 γιατι δεν εχω ασχωληθει ιδιαιτερα


βεβαιος δεν ειμαι εντελος ασχετος εχω δουλεψει σε windows για χ86 MASM αλλα για 16 bit και οχι για 32 bit

σε ποιο directory θα βρω τον NASM για να γραφω εκει το .asm αρχεια μου??

απλα αμα ειναι θελω καποιες βασικες οδηγιες για να τρεξω ας πουμε ενα απλο προγραμμα ας πουμε το hello world σε NASM χ86 32 bit σε linux

ευχαριστω εκ των προτερων για οποιον ασχωληθει με το παραμικρο στο να δωσουν καποιες βασικες οδηγιες για τον Nasm
Η ζωή είναι κενή χωρίς ιδέες. Δεν υπάρχει μεγαλύτερη χαρά από τον αγώνα στο όνομά τους.

Φιντέλ Κάστρο Ρους
31 Ιούλη του 2007
Άβαταρ μέλους
thodoris_turtle
punkTUX
punkTUX
 
Δημοσιεύσεις: 187
Εγγραφή: 28 Αύγ 2008, 15:18
Τοποθεσία: Άνω Γλυφάδα
Εκτύπωση

Re: Nasm x86 32 bit

Δημοσίευσηαπό cyberpython » 20 Οκτ 2008, 22:07

Πρώτα απ' όλα πρέπει να εγκαταστήσεις το nasm:
Κώδικας: Επιλογή όλων
sudo apt-get install nasm

και για μετατροπή του object code σε εκτελέσιμο (linking) το gcc (περιέχεται μαζί με άλλα χρήσιμα πραγματάκια στο meta-package build-essential):
Κώδικας: Επιλογή όλων
sudo apt-get install build-essential

Ας πούμε οτι έχεις τον παρακάτω κώδικα (τον βρήκα στη διεύθυνση http://www.csee.umbc.edu/help/nasm/sample.shtml γιατί με x86 assembly δεν έχω ασχοληθεί):
Κώδικας: Επιλογή όλων
;  hello.asm  a first program for nasm for Linux, Intel, gcc
;
; assemble:   nasm -f elf -l hello.lst  hello.asm
; link:      gcc -o hello  hello.o
; run:           hello
; output is:   Hello World

   SECTION .data      ; data section
msg:   db "Hello World",10   ; the string to print, 10=cr
len:   equ $-msg      ; "$" means "here"
            ; len is a value, not an address

   SECTION .text      ; code section
        global main      ; make label available to linker
main:            ; standard  gcc  entry point
   
   mov   edx,len      ; arg3, length of string to print
   mov   ecx,msg      ; arg2, pointer to string
   mov   ebx,1      ; arg1, where to write, screen
   mov   eax,4      ; write sysout command to int 80 hex
   int   0x80      ; interrupt 80 hex, call kernel
   
   mov   ebx,0      ; exit code, 0=normal
   mov   eax,1      ; exit command to kernel
   int   0x80      ; interrupt 80 hex, call kernel



Το αποθηκεύεις π.χ. στο /home/cyberpython/hello.asm
Ανοίγεις ένα τερματικό και πας στο /home/cyberpython/hello.asm
Έπειτα δίνεις την εντολή:
Κώδικας: Επιλογή όλων
nasm -f elf -l hello.lst hello.asm

και δημιουργείται το αρχείο hello.o
έπειτα δίνεις:
Κώδικας: Επιλογή όλων
gcc -o hello.bin hello.o

και δημιουργείται το hello.bin που το εκτελείς με :
Κώδικας: Επιλογή όλων
./hello.bin
Κοινότητα ΕΛ/ΛΑΚ Οικονομικού Πανεπιστημίου Αθηνών / Ubuntu-gr / My Web Log
Επίπεδο Γνώσεων Linux: Μέτριο, Προγραμματισμός: Ναι, Aγγλικά: Καλά
Λειτουργικό : Ubuntu 10.04 - 32bits
Η/Υ : Intel Core2 4400@2 GHz / 2GB DDR2 RAM / GeForce 8400 GS 512MB / Creative SB Audigy SE
Άβαταρ μέλους
cyberpython
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 733
Εγγραφή: 14 Μάιος 2008, 13:22
Εκτύπωση

Re: Nasm x86 32 bit

Δημοσίευσηαπό thodoris_turtle » 21 Οκτ 2008, 16:05

χμμ εισαι πολυ συνεργασιμος θα τα δοκιμασω αυτα που με εγραψες εδω και τωρα ευχαριστω πολυ μου δινεις κινητρο για να ασχωληθω και παλι thanx πολλα

α και κατι αλλο στα windows ποιος assembler υπαρχει για 32 bit

εγω ξερω τον Environ ειναι ενα zip αρχειο οπου περιεχει τον masn αλλα για 16 bit ξερεις ποιο πακετο υπαρχει αντιστοιχο για masn αλλα για 32 bit?
Τελευταία επεξεργασία από thodoris_turtle και 21 Οκτ 2008, 16:30, έχει επεξεργασθεί 1 φορά/ες συνολικά
Η ζωή είναι κενή χωρίς ιδέες. Δεν υπάρχει μεγαλύτερη χαρά από τον αγώνα στο όνομά τους.

Φιντέλ Κάστρο Ρους
31 Ιούλη του 2007
Άβαταρ μέλους
thodoris_turtle
punkTUX
punkTUX
 
Δημοσιεύσεις: 187
Εγγραφή: 28 Αύγ 2008, 15:18
Τοποθεσία: Άνω Γλυφάδα
Εκτύπωση

Re: Nasm x86 32 bit

Δημοσίευσηαπό linuxman » 21 Οκτ 2008, 16:12

Κάνε edit το ποστ σου και σβήσε κάποιες λέξεις ...
Οδηγίες προς Νεοεισερχόμενους
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Linux Mint 17.1 Rebecca 3.13.0-37-generic 64bit (el_GR.UTF-8, X-Cinnamon cinnamon)
3 Intel Core i5-2310M CPU @ 2.10GHz ‖ RAM 3866 MiB ‖ Dell Inc. 0D7C51 - Dell Inc. Dell System Vostro 3750
4 Intel 2nd Generation Core Processor Family Integrated Graphics [8086:0116] {i915}
5 wlan0: Intel Centrino Wireless-N 1030 [Rainbow Peak] [8086:008a] (rev 34) ⋮ eth0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 06)
http://www.greeklug.gr
Άβαταρ μέλους
linuxman
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10378
Εγγραφή: 10 Μάιος 2008, 20:41
Τοποθεσία: Thessaloniki / Macedonia / Greece
Εκτύπωση

Re: Nasm x86 32 bit

Δημοσίευσηαπό thodoris_turtle » 21 Οκτ 2008, 16:31

ευχαριστω για την προηδοποιηση ηταν απο τον ενθουσιασμο μου συγνωμη :oops:

τωρα ειναι ενταξη το ποστ μου
Η ζωή είναι κενή χωρίς ιδέες. Δεν υπάρχει μεγαλύτερη χαρά από τον αγώνα στο όνομά τους.

Φιντέλ Κάστρο Ρους
31 Ιούλη του 2007
Άβαταρ μέλους
thodoris_turtle
punkTUX
punkTUX
 
Δημοσιεύσεις: 187
Εγγραφή: 28 Αύγ 2008, 15:18
Τοποθεσία: Άνω Γλυφάδα
Εκτύπωση

Re: Nasm x86 32 bit

Δημοσίευσηαπό thodoris_turtle » 21 Οκτ 2008, 18:08

Κώδικας: Επιλογή όλων
   title main

      dosseg

      .model small

      .stack 100h

      .data



   nl           db     10,13,'$'

   message1   db     'Please enter a string:  $'



   buf         db     20

   actlen      db     ?

   store       db     20 dup ('$')



   buf1         db     20

   actlen1      db     ?

   store1       db     20 dup ('$')







      .code



      PUBLIC  _length

      EXTRN _asm2pas:PROC



   start: 

      mov ax,@data

      mov ds,ax





      mov ah,09h

      lea dx,message1            ;emfanizei to 1 mnm

      int 21h



      mov ah,0ah

      lea dx,buf            ;diabazei to string

      int 21h







      lea dx,store1            ;push store1

      push dx





      lea dx,store            ;push store

      push dx



   







      CALL _asm2pas



      mov ax, 4C00h

      int 21h



   ;-------------------------------------------





      _length proc



         

         push bp

         mov bp,sp

   

               

         mov di,[bp+4]

         mov bx,0



         

         

      lab:

         cmp cl,0Dh

         je telos

                     

            mov cl,store[bx+1]

            inc bx

            

            jmp short lab



         telos:   



            mov ax,bx

            

            pop bp

            



            ret

      _length endp





   end start

















Κώδικας: Επιλογή όλων
/*

   Assembly connection :

      - calls ext ASM func "length"

      - passes a string of chars

      - gets the result (string's length)

*/



extern unsigned int cdecl length( char*, char );



unsigned int asm2pas(char* str,char* res)  /* public by default*/

{

   unsigned int len;

   int i;

   len = length(str,13);  /* in ASM arguments are in reverse */



   for ( i=0; i<len; i++ )  /* copy string */

      res[i+1] = str[i];

   res[0] = len;

                             /* PASCAL string bears length on char[0] */

   return len;

}





θα προσπαθησω να κανω μετατροπει τον κωδικα απο MASM για windows 16 bit σε linux NASM 32 bit

καλη μου επιτυχια

να ρωτησω κατι αλλο για οποιον ξερει? ποσο διαφερουν οι εντολες απο 16 bit X86 σε 32 bit X86?

ενα τμημα του προγραμματος σε assembly(masm 16 bit windows) που εχω ποσταρει ή καποιο αλλο παραδειγμα πως θα γινοταν, πως θα το μετατρεψω σε nasm 32 bit? γιατι εδω τα πραγματα απ οτι βλεπω γιατι ερχομαι σε πρωτη επαφη με nasm ειναι αρκετα διαφορετικα
Η ζωή είναι κενή χωρίς ιδέες. Δεν υπάρχει μεγαλύτερη χαρά από τον αγώνα στο όνομά τους.

Φιντέλ Κάστρο Ρους
31 Ιούλη του 2007
Άβαταρ μέλους
thodoris_turtle
punkTUX
punkTUX
 
Δημοσιεύσεις: 187
Εγγραφή: 28 Αύγ 2008, 15:18
Τοποθεσία: Άνω Γλυφάδα
Εκτύπωση

Re: Nasm x86 32 bit

Δημοσίευσηαπό thodoris_turtle » 21 Οκτ 2008, 18:51

Κώδικας: Επιλογή όλων
   

      SECTION .data ;data section.

   



   nl           db     10,13,'$'

   message1   db     'Please enter a string:  $'



   buf         db     20

   actlen      db     ?

   store       db     20 dup ('$')



   buf1         db     20

   actlen1      db     ?

   store1       db     20 dup ('$')





SECTION .text   ;code section.

global main

main:

      



      PUBLIC  _length

      EXTRN _asm2pas:PROC



   

      mov eax,@data

      mov eds,eax





      mov eah,09h

      lea edx,message1            ;emfanizei to 1 mnm

      int 21h



      mov eah,0eah

      lea edx,buf            ;diabazei to string

      int 21h







      lea edx,store1            ;push store1

      push edx





      lea edx,store            ;push store

      push edx



   







      CALL _asm2pas



      mov eax, 4C00h

      int 21h



   ;-------------------------------------------





      _length proc



         

         push ebp

         mov ebp,esp

   

               

         mov edi,[ebp+4]

         mov ebx,0



         

         

      lab:

         cmp ecl,0Dh

         je telos

                     

            mov ecl,store[ebx+1]

            inc ebx

            

            jmp short lab



         telos:   



            mov eax,ebx

            

            pop ebp

            



            ret

      _length endp













κοιταξτε δεν εχω δουλεψει ποτε σε X86 nasm 32 bit γι αυτο ο κωδικας μου εχει πολλα λαθη

τι πρεπει να τροποποιησω στις εντολες ετσι ωστε να ειναι σωστω το προγραμμα μου

ξερω το βασικο οτι οι καταχωρητες γενικου σκοπου ax,bx,cx,dx απο 16 bit για 32 bit ειναι eax,ebx,ecx,edx

πως γινεται να παρω το μισω του eax οπως γινοταν σε 16 bit δηλ. ah ή al για τον ax σε 16bit

για 32 bit πως γινεται αυτο?

γι αυτο μπερδευομαι γιατι δεν ξερω τα βασικα αμα μπορει καποιος να με καθοδηγηση λιγακι

σας ευχαριστω πολυ
Η ζωή είναι κενή χωρίς ιδέες. Δεν υπάρχει μεγαλύτερη χαρά από τον αγώνα στο όνομά τους.

Φιντέλ Κάστρο Ρους
31 Ιούλη του 2007
Άβαταρ μέλους
thodoris_turtle
punkTUX
punkTUX
 
Δημοσιεύσεις: 187
Εγγραφή: 28 Αύγ 2008, 15:18
Τοποθεσία: Άνω Γλυφάδα
Εκτύπωση

Re: Nasm x86 32 bit

Δημοσίευσηαπό simosx » 21 Οκτ 2008, 19:52

Κοιτώντας στο
http://en.wikipedia.org/wiki/Yasm
http://www.tortall.net/projects/yasm/
βλέπω ότι υπάρχει το yasm που διατίθεται με την άδεια BSD και είναι συμβατό με NASM.
Είδα ότι έχω το yasm ήδη εγκατεστημένο, είναι πιθανό να μπαίνει με το build-essential. Αν μπορεί να επιβεβαιώσει κάποιος.

Για τη χρήση και παραδείγματα, μπορείς να βρεις οδηγούς στο διαδίκτυο.
Ακόμα, μπορείς να γράψεις προγράμματα σε C και να κάνεις dissassembly με χρήση π.χ. του NASM ή με GCC.

Με gcc κάνεις

Κώδικας: Επιλογή όλων
gcc -S helloworld.c


και παράγει το helloworld.s.
προσωπικό ιστολόγιο ϗ πλανήτης 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: Nasm x86 32 bit

Δημοσίευσηαπό Dimitris » 21 Οκτ 2008, 20:18

To yasm δεν εγκαθίσταται με το build-essential.
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Nasm x86 32 bit

Δημοσίευσηαπό thodoris_turtle » 21 Οκτ 2008, 22:49

simosx έγραψε:Κοιτώντας στο
http://en.wikipedia.org/wiki/Yasm
http://www.tortall.net/projects/yasm/
βλέπω ότι υπάρχει το yasm που διατίθεται με την άδεια BSD και είναι συμβατό με NASM.
Είδα ότι έχω το yasm ήδη εγκατεστημένο, είναι πιθανό να μπαίνει με το build-essential. Αν μπορεί να επιβεβαιώσει κάποιος.

Για τη χρήση και παραδείγματα, μπορείς να βρεις οδηγούς στο διαδίκτυο.
Ακόμα, μπορείς να γράψεις προγράμματα σε C και να κάνεις dissassembly με χρήση π.χ. του NASM ή με GCC.

Με gcc κάνεις

Κώδικας: Επιλογή όλων
gcc -S helloworld.c


και παράγει το helloworld.s.


dissassembly δηλ. προγραμμα χαμηλου επιπεδου σε υψηλο επιπεδο οπως C ? αυτο λες?

εγω θελω για NASM οποιαδηποτε πληροφορια και αν βρειτε . συγκεκριμενα πρεπει πρωτα να μαθω τα βασικα για NASM και μετα πρεπει να μαθω πως γινεται η κληση μιας συναρτησης C με παραμετρους απο assembly προγραμμα με χρηση της στοιβας κτλ

MASM ξερω για 16bit σε windows τα βασικα

NASM για 32 bit για linux δεν εχω ιδεα γι αυτο ζηταω την καθοδηγηση σας γι οποιον φυσικα ξερω οποιαδηποτε πληροφορια και αν παραθεση καποιος εδω χρησιμη θα ηταν
Η ζωή είναι κενή χωρίς ιδέες. Δεν υπάρχει μεγαλύτερη χαρά από τον αγώνα στο όνομά τους.

Φιντέλ Κάστρο Ρους
31 Ιούλη του 2007
Άβαταρ μέλους
thodoris_turtle
punkTUX
punkTUX
 
Δημοσιεύσεις: 187
Εγγραφή: 28 Αύγ 2008, 15:18
Τοποθεσία: Άνω Γλυφάδα
Εκτύπωση

Επόμενο

Επιστροφή στο Εφαρμογές για Ανάπτυξη Λογισμικού