assembler su linux? possibile?

Stato
Discussione chiusa ad ulteriori risposte.

dadenino46

Utente Silver
14 Luglio 2007
11
4
0
63
a scuola abbiamo appunto incominciato a fare le prime cose di assembler... c'è qualche speranza per poterlo usare su linux? grazie
 
Non capisco... io non ne so niente di assembler, ma quello che cambia tra un sistema all' altro è il compilatore nient'altro. Basta trovare il compilatore adatto, per linux:
http://www.siforge.org/articles/2004/04/26-compilazione_asm.html
Credo dovrebbe andar bene, Ciauzz
 
la sintassi dell'assembler varia anche in dipendenza della piattaforma usata,non solo dal S.O...uno per sparc non sarà mai uguale a uno per x86,quindi occhio.
 
Si puo' programmare in assembly sia su win e su linux. Anche se le istruzioni sono le medesime (dato che dipendono dal processore) l'unica cosa che varia un pochino è la sintassi.
Del resto anche su Windows stesso la sintassi varia da masm a nasm eppure si tratta sempre assembler.
Se non erro su linux per compilare sorgenti assembly solitamente si usa gcc, che è sia assemblatore che linker.
 
na gcc(gnu c compiler) trasforma da C ad asm per gas(gnu assembler)e usa automaticamente come linker ld
cmq c'è anche nasm di assembler per linux :D
 
c'è una cosa a cui non avete pensato..... se programmi assembly puro, ok dipende solo dal processore e quindi in generale dall'architettura (esistono acnhe gli interrupt bios, ma se questo cambia, possono cambiare)....

ma, predator, in assebly, quante chiamate hai fatto alle api di windows? migliaia, ma ora spiegatemi..... se l'assembly è uguale, funzionerà su linux? LOL

per evitare equivoci dico: l'assembly è uguale, solo che è l'utente che ha fatto fare chiamate che esistono solo su un tipo di s.o.
quindi bisogna anche stare attenti e conoscere il sistema

se sbaglio meglio, perchè significa che c'è qualcuno che può correggermi ^^
 
Eh eh nei post sopra c'è la mia guida alla sintassi Assembly AT&T per sistemi Unix, cosa si vuole di più dalla vita?

@Whivel: L'Assembly non è affatto uguale per tutti i sistemi operativi. Ovvio, se usi NASM su Windows e su Linux la sintassi rimane sempre la stessa Intel-based, ma le syscall e gli interrupt usati cambiano radicalmente. Ad esempio un codice del genere

Codice:
section .text
  global _start
_start:
  mov  eax,1
  mov  ebx,0
  int  80h

su Windows non funzionerà mai, pur essendo sintatticamente corretto su qualsiasi sistema che supporti la sintassi Intel, in quanto fa riferimento ad una syscall (syscall 1 dell'interrupt 80h, a.k.a. sys_exit) tipica del kernel Linux, così come un codice che farà uso dell'interrupt 13h o 21h del DOS su sistemi Unix non funzionerà mai pur essendo sintatticamente corretto su tutti i sistemi.
 
Whivel ha detto:
ma, predator, in assebly, quante chiamate hai fatto alle api di windows? migliaia, ma ora spiegatemi..... se l'assembly è uguale, funzionerà su linux? LOL

per evitare equivoci dico: l'assembly è uguale, solo che è l'utente che ha fatto fare chiamate che esistono solo su un tipo di s.o.
quindi bisogna anche stare attenti e conoscere il sistema

se sbaglio meglio, perchè significa che c'è qualcuno che può correggermi ^^
si Whivel, l'assembler è diciamo molto simile per sintassi, il fatto che si usino le api è relativo al sistema.
A questo punto è come fare un OpenFile su un file che non esiste.
è una scelta di comodita' usare le api, che è indipendente dalla sintassi.
Come dici anche tu, conoscere il sistema è sempre necessario. Prima di costruire bisogna sapere che terreno abbiamo sotto i piedi.
BlackCode ha detto:
bah se tu vouoi "allenarti" per assembly di win, visto che lo fate scuola tanto vale emularlo..
emularlo in che senso?
 
ma non dovrebbe essere uguale l'assembly di linux e di windows?
Su un libro ho trovato un programma :
Codice:
as -o nome.o nome.s
il problema è che mi da molti errori... mi sapreste che differenze ci sono da quello di windows?
 
BlackLight ha detto:
Eh eh nei post sopra c'è la mia guida alla sintassi Assembly AT&T per sistemi Unix, cosa si vuole di più dalla vita?

@Whivel: L'Assembly non è affatto uguale per tutti i sistemi operativi. Ovvio, se usi NASM su Windows e su Linux la sintassi rimane sempre la stessa Intel-based, ma le syscall e gli interrupt usati cambiano radicalmente. Ad esempio un codice del genere

Codice:
section .text
  global _start
_start:
  mov  eax,1
  mov  ebx,0
  int  80h

su Windows non funzionerà mai, pur essendo sintatticamente corretto su qualsiasi sistema che supporti la sintassi Intel, in quanto fa riferimento ad una syscall (syscall 1 dell'interrupt 80h, a.k.a. sys_exit) tipica del kernel Linux, così come un codice che farà uso dell'interrupt 13h o 21h del DOS su sistemi Unix non funzionerà mai pur essendo sintatticamente corretto su tutti i sistemi.

a me sembra di aver detto esattamente quello....
cmq l'assembly è uguale e dipende dall'architettura...
le syscall e gli interrupt (quelli programmabili) dipendono dal s.o. ma sono alla stregua di quelle che io avevo specificato solo come api.

Whivel ha detto:
per evitare equivoci dico: l'assembly è uguale, solo che è l'utente che ha fatto fare chiamate che esistono solo su un tipo di s.o.

[edit_after_quote]quindi usando syscall, api e interrupt specifici del s.o., ma il modo in cui le chiami è lo stesso[/edit_after_quote]

quindi bisogna anche stare attenti e conoscere il sistema
meno male che lo avevo scritto a scampo di equivoci.
 
l'assembly cambia a seconda del processore e dell'assembler, e non del s.o ma per funzionare su sidtemi diversi deve essere linkata a librerie diversi, avere due headers diversi (PE e COFF)un po come il C, c'è qualche differenza data dal compilatore e c'è da usare librerie e funzioni diverse
p.s: vabbe repetita iuvant xD
 
il mio "programma" è questo:
Codice:
.model small
.stack
.data
.code

inizio
MOV ax,0FFFh
MOV ah,4ch
MOV al,5
MOV bl,4
ADD al,bl
int 21h
end inizio

nino@nino-desktop:~/Assembler$ as -o Es.o Es.s
Es.s: Assembler messages:
Es.s:1: Error: unknown pseudo-op: `.model'
Es.s:2: Error: unknown pseudo-op: `.stack'
Es.s:4: Error: unknown pseudo-op: `.code'
Es.s:6: Error: no such instruction: `inizio'
Es.s:8: Error: too many memory references for `mov'
Es.s:9: Error: too many memory references for `mov'
Es.s:11: Error: too many memory references for `mov'
Es.s:12: Error: too many memory references for `mov'
Es.s:14: Error: too many memory references for `add'
Es.s:16: Error: junk `h' after expression
Es.s:16: Error: suffix or operands invalid for `int'
Es.s:18: Error: no such instruction: `end inizio'
 
L'INT 21h non ce l'hai nemmeno su Linux, e la sintassi è completamente diversa dalla GAS, che sarebbe

Codice:
.data
.text
  .global _start
_start:
  movl  $1,%eax
  movl  $0,%ebx
  int   $0x80

  leave
  ret
 
Uffa è completamente diverso!!!
le istruzioni sono diverse!!
ahn "$1" è un registro o cosa?

grazie
 
in realtà è che usi il masm (microsoft asm).... microsoft = SOLO Windows (quasi ovviamente)....

cmq non funzionerebbe neppure perchè int 21h è un interrupt del dos.... quindi funziona solo da msdos e windows....
o meglio, funziona e te lo compila, ma andrà sicuramente in errore in esecuzione, visto che l'int 21h non esiste oppure fa qualcosa di diverso
 
Stato
Discussione chiusa ad ulteriori risposte.