Pagina 1 di 1

Assembly 8086 on linux

Inviato: lun mag 10, 2010 2:54
da Blallo
Esiste un modo per compilare assembly 8086 su linux con sintassi intel?

Re: Assembly 8086 on linux

Inviato: lun mag 10, 2010 10:21
da lennynero
as e as86 sono compilatori assembly già presenti in slackware, penso che con opportuni flag si potrebbe ottimizzare la compilazione per intel, anche se non sono molto ferrato sull'argomento. Facendo una rapida ricerca ho trovato questo: http://www.niksula.cs.hut.fi/~mtiihone/intel2gas/, potrebbe esseeti utile...

Re: Assembly 8086 on linux

Inviato: lun mag 10, 2010 12:24
da 414N
Ci sono anche NASM e YASM, con una sintassi simile a quella Intel.

Re: Assembly 8086 on linux

Inviato: lun mag 10, 2010 14:30
da Blallo
414N ha scritto:Ci sono anche NASM e YASM, con una sintassi simile a quella Intel.

ho provato a dare in pasto a nasm questo

Codice: Seleziona tutto

.MODEL small
.STACK
.DATA
    VAR DW ?
.CODE
.STARTUP
    MOV VAR, 0
.EXIT
END

ma non ne vuole sapere di compilare :(

Re: Assembly 8086 on linux

Inviato: lun mag 10, 2010 18:56
da 414N
jimmy_page_89 ha scritto:
414N ha scritto:Ci sono anche NASM e YASM, con una sintassi simile a quella Intel.

ho provato a dare in pasto a nasm questo

Codice: Seleziona tutto

.MODEL small
.STACK
.DATA
    VAR DW ?
.CODE
.STARTUP
    MOV VAR, 0
.EXIT
END

ma non ne vuole sapere di compilare :(

Ah, che nostalgia l'ASM! :)
Avevo detto che supportano una sintassi simile Intel. Quelle macro che usi sinceramente non so da quale "standard" derivino.
Qui trovi qualche esempio di applicaizioni al livello di hello world per nasm: http://www.csee.umbc.edu/portal/help/nasm/sample.shtml

Re: Assembly 8086 on linux

Inviato: lun mag 10, 2010 20:15
da phobos3576
jimmy_page_89 ha scritto:ho provato a dare in pasto a nasm questo

Codice: Seleziona tutto

.MODEL small
.STACK
.DATA
    VAR DW ?
.CODE
.STARTUP
    MOV VAR, 0
.EXIT
END

ma non ne vuole sapere di compilare :(


Prova:

Codice: Seleziona tutto

section   .text
    global _start         ; dichiara l'entry point

_start:                   ; entry point

   mov   var, 0
   
   mov   eax,1            ; system call (sys_exit)
   int   0x80             ; chiama il kernel per l'uscita

section   .data

   var   resw   1         ; riserva 1 WORD a var

Re: Assembly 8086 on linux

Inviato: lun mag 10, 2010 23:19
da Blallo
phobos3576 ha scritto:Prova:

Codice: Seleziona tutto

section   .text
    global _start         ; dichiara l'entry point

_start:                   ; entry point

   mov   var, 0
   
   mov   eax,1            ; system call (sys_exit)
   int   0x80             ; chiama il kernel per l'uscita

section   .data

   var   resw   1         ; riserva 1 WORD a var

Codice: Seleziona tutto

6: error: invalid combination of opcode and operands
13: warning: uninitialized spacedeclared in non-BSS section `.data': zeroing

Re: Assembly 8086 on linux

Inviato: lun mag 10, 2010 23:34
da phobos3576
jimmy_page_89 ha scritto:

Codice: Seleziona tutto

6: error: invalid combination of opcode and operands
13: warning: uninitialized spacedeclared in non-BSS section `.data': zeroing


Errori madornali dovuti alla fretta di rispondere.

1) In NASM, var è l'indirizzo della variabile, mentre [var] è il suo contenuto; quindi, bisogna scrivere:

Codice: Seleziona tutto

mov word [var], 0

word è necessario per specificare la dimensione del trasferimento dati (da valore immediato a memoria).

2) In Linux, la section .data è per i dati inizializzati; per i dati non inizializzati bisogna usare section .bss

Re: Assembly 8086 on linux

Inviato: mar mag 11, 2010 0:29
da Blallo
grazie mille, ora funziona
ma ciò comunque non risolve il mio problema...
ma oggi il prof ci ha detto che quel codice va su MASM
al massimo chiederò lumi domani

Re: Assembly 8086 on linux

Inviato: mar mag 11, 2010 0:39
da phobos3576
Si ma, attenzione a non confondere la struttura del programma con il suo contenuto.

La struttura di un programma Assembly varia a seconda del sistema operativo; ad esempio, quando programmi sotto Linux devi usare apposite sezioni per codice e dati che sono differenti da quelle usate sotto Windows.
Il contenuto del programma invece lo puoi scrivere seguendo la sintassi Intel che viene pienamente supportata da NASM e YASM.

Re: Assembly 8086 on linux

Inviato: mar mag 11, 2010 0:40
da zoros
jimmy_page_89 ha scritto:Esiste un modo per compilare assembly 8086 su linux con sintassi intel?

caro jimmy_page_89,
ti consiglio anch'io nasm, ci sono delle differenze ma si sta poco a trasformare un listato masm in nasm ...

non capisco perché usi "var" ... per allocare uno spazio ram basta un db, dw, ecc. ...

se invece vuoi usare l'originale MASM c'è sempre dosbox ...

Re: Assembly 8086 on linux

Inviato: mar mag 11, 2010 0:47
da phobos3576
zoros ha scritto:non capisco perché usi "var" ... per allocare uno spazio ram basta un db, dw, ecc. ...

In questo caso var è un nome di variabile e non una keyword.

zoros ha scritto:se invece vuoi usare l'originale MASM c'è sempre dosbox ...

Infatti, sotto DosBox o DosEmu girano MASM, TASM e praticamente tutti i programmi destinati al DOS.

In epoca preistorica avevo scritto un tutorial sull'Assembly dove ci sono anche istruzioni sulla sintassi NASM, MASM, TASM e su come installare ed usare DosEmu sotto Linux.

http://xoomer.virgilio.it/ramsoft/

Re: Assembly 8086 on linux

Inviato: mar mag 11, 2010 0:57
da zoros
phobos3576 ha scritto:
zoros ha scritto:non capisco perché usi "var" ... per allocare uno spazio ram basta un db, dw, ecc. ...

In questo caso var è un nome di variabile e non una keyword.


sì, ho letto frettolosamente il codice ... mi suonava male il "resw" ... io avrei scritto:

var dw 0 ; riserva 1 WORD a var


chiaro che var è un identificatore ... brutta scelta direi ;) ...

Re: Assembly 8086 on linux

Inviato: mar mag 11, 2010 1:08
da phobos3576
zoros ha scritto:sì, ho letto frettolosamente il codice ... mi suonava male il "resw" ... io avrei scritto:

var dw 0 ; riserva 1 WORD a var


chiaro che var è un identificatore ... brutta scelta direi ;) ...


Se devi definire dati inizializzati devi appunto usare DB, DW e così via; siccome jimmy_page_89 voleva definire un dato non inizializzato, allora secondo la sintassi NASM bisogna usare RESB (reserve bytes), RESW (reserve words) e così via.