PDA

View Full Version : Semplice programma assembly


kniv7s
26-06-2004, 07:34
Ciao, mi sono appena registrato. :)

In internet ho trovato questo codice, e l'ho modificato appena (parte in grassetto)


.model small
.stack
.data

Message db "Hello World!$" ; message to be display
num1 dw 10
num2 dw 5
res dw ?

.code

mov dx,OFFSET Message
mov ax,SEG Message
mov ds,ax

mov ah,9
int 21h
mov ax,4c00h
int 21h

mov bx,num1
mov cx,num2
add bx,cx
mov res,bx
int 21h
mov res,4c00h
int 21h


END


A parte che non conosco bene gli interrupt, io avevo calcolato la stampa a video del numero 15. Invece non stampa nulla (pero' compila correttamente).

Come mai??


Altra domanda: cosa cambia tra asm e macro asm (masm) ?

repne scasb
26-06-2004, 09:00

kniv7s
26-06-2004, 10:49
MMMH la stringa non l'ho modificata (Hello World lo stampa lo stesso)
Comunque 15 lo volevo stampare come risultato dell'addizione dei 2 numeri dove se ne dovrebbe occupare

mov bx,num1
mov cx,num2
add bx,cx ; somma di 5 + 10
mov res,bx ; res diventa 15
...


... Si puo' fare???

Ciao e grazie cmq

cionci
26-06-2004, 11:10
Sì, ma devi stampare una cifra alla volta...

.model small
.stack
.data

Message db "Hello World!$" ; message to be display
num1 dw 10
num2 dw 5
res dw ?

.code

mov dx,OFFSET Message
mov ax,SEG Message
mov ds,ax

mov ah,9
int 21h

mov bx,num1
mov cx,num2
add bx,cx

mov ax, bx
xor dx, dx
mov cx, 10
div cx

mov dh, dl

mov dl, al ; move al (ascii code) into dl
mov ah,02h ; function 02h of interrupt 21h
int 21h ; call interrupt 21h

mov dl, dh ; move al (ascii code) into dl
mov ah,02h ; function 02h of interrupt 21h
int 21h ; call interrupt 21h

mov ax,4c00h
int 21h

END

Prova così, dovrebbe andare (gli interrupt non li puoi tirare a caso ;)) Ovviamente va fino a 99... Oltre ti devi studiare una algoritmo adatto ;)

kniv7s
26-06-2004, 12:05
Ok grazie 1000 :)

Ciao!

cionci
26-06-2004, 12:17
Funziona ? Non l'ho provato...

repne scasb
26-06-2004, 14:01

cionci
26-06-2004, 14:35
Sisi lo sapevo...me lo sono scordato ;)

mmx[ngg]
26-06-2004, 14:52
Originariamente inviato da kniv7s
Ciao, mi sono appena registrato. :)


Alle 06:34.....stica :D

kniv7s
26-06-2004, 17:45
:D

Grazie x le risposte e x la disponibilita'
non appena avro' tempo di testare il programma vi faro' sapere

intanto, avrei una domanda:
c'è incompabilità fra compilatori e compilatori (assembler) ?

cionci
27-06-2004, 17:40
Assemblatori ;)

Certo che ci sono incompatibilità... Si dividono principalmente in due grandi famiglier... Sintassi Microsoft e sintassi AT&T...

La sintassi AT&T ad esempio inverte sorgente e destinazione delle istruzioni con due operandi rispetto al codice che hai scritto (sintassi Microsoft)... Nella sintassi AT&T ci sono caratteri che identificano i registri (%) e valori... Inoltre mi sembra che sia obbligatorio specifcare la dimensione degli operandi (long word byte etc etc)...

movw %ax, %bx

Al interno delle varie famiglie poi c'è un'ulteriore differenza per cui ogni compilatore, fissata una sintassi delle istruzioni, introduce anche differenti direttive ai compilatori...vedi Borland TASM e Microsoft MASM...

AnonimoVeneziano
27-06-2004, 17:49
Sintassi Intel , ti prego , il nome Sintassi MICROSOFT mi fa venir meno :sofico:

cionci
27-06-2004, 17:58
Sì...hai ragione ;) La ciamavo sintassi M$ perchè è quella del MASM...

kniv7s
27-06-2004, 19:32
MMMH, ho controllato e il codice che mi avete dato funziona.

Comunque io uso TASM.

Ora vorrei porvi un ultimo quesito nato dalla lettura oggi, di un libro su microprocessori intel della famiglia 8088 : come mai questi 2 assembly sono diversi?

1: quello dato da voi

.model small
.stack
.data

num1 dw 10
num2 dw 5

.code

Start:
mov ax,@data
mov ds,ax

mov bx,num1
mov cx,num2
add bx,cx

mov ax,bx
xor dx,dx
mov cx,10
div cx

push dx

add al,'0'
mov dl,al
mov ah,2h
int 21h

pop dx

add dl,'0'
mov ah,2h
int 21h

mov ax,4C00h
int 21h

END Start




e questo


STACK SEGMENT PARA STACK 'STACK'
STACK ENDS
;
DATA SEGMENT PARA PUBLIC 'DATA'

num1 dw 10
num2 dw 5

DATA ENDS
;
CODE SEGMENT PARA PUBLIC 'CODE'

assume cs:code
assume es:data ; mov ax,@data
mov ds,ax

mov bx,num1
mov cx,num2
add bx,cx

mov ax,bx
xor dx,dx
mov cx,10
div cx

push dx

add al,'0'
mov dl,al
mov ah,2h
int 21h

pop dx

add dl,'0'
mov ah,2h
int 21h

mov ax,4C00h
int 21h

CODE ENDS


Come mai sono diversi??

ps.: nel secondo mi dà 1 warning e 1 fatal error ( unexpected end of file encountered).


Ciao

cionci
27-06-2004, 22:11
Il code assembly è lo stesso... Sono le direttive all'assemblatore che sono diverse... Quello appunto è per Microsoft MASM ;)

repne scasb
27-06-2004, 22:51

cionci
27-06-2004, 22:59
Io dicevo che il modo di scrivere le istruzioni è lo stesso... Il codice non l'ho nemmeno guardato...sono 3-4 anni che non prendo in mano il MASM ;)

kniv7s
28-06-2004, 15:56
Ritornando sull'assembly, non mi è chiara la funzione di questo tratto di codice:


mov ax,bx
xor dx,dx
mov cx,10
div cx

push dx

add al,'0'
mov dl,al
mov ah,2h
int 21h

pop dx

add dl,'0'
mov ah,2h
int 21h

mov ax,4C00h
int 21h


Possibile che per stampare a video la somma di una addizione sia così lungo e complicato (per me) ?

cionci
28-06-2004, 16:12
Tutto in pratica ;)

;metto il risultato dell'addizione in ax
mov ax,bx
;azzero dx
xor dx,dx
;metto 10 in cx
mov cx,10
;divido il contenuto di ax per cx, risultato in ax e resto in dx
div cx
;metto nello stack il contenuto di dx (che devo sporcare)
push dx
;aggiungo il caratter '0' perchè i numero sono rappresentati in ASCII da '0' in poi
add al,'0'
;metto in dl il carattere da stampare
mov dl,al
;seleziono la funzione 2h dell'int 21h
mov ah,2h
;richiamo l'interrupt 21h
int 21h
;riprendo il resto della divisione che avevo salvato
pop dx
;aggiungo '0' per lo stesso motivo precedente
add dl,'0'
mov ah,2h
int 21h
;esco al DOS
mov ax,4C00h
int 21h

Possibile che per stampare a video la somma di una addizione sia così lungo e complicato (per me) ?
Altrimenti non era assembly ;) E non hai ancora visto niente !!! :cool:

kniv7s
28-06-2004, 18:17
Ok, perfetto! Grazie!

Ho trovato alcuni sorgenti su internet, ma davvero pochi.
Conoscete voi un sito che ne offra parecchi?

Ciao :)

kniv7s
28-06-2004, 18:46
Start:

End Start


per caso corrisponde a questo


Start PROC FAR

Start ENDP


in un altro compilatore, o sono operazioni separate incluse nello stesso compilatore?

Luc@s
28-06-2004, 18:55
il primo è un label per i salti il 2° è la dichiarazione di una funzione........credo IMHO

cionci
28-06-2004, 19:27
Ma stai cercando di imparare l'assembly dagli esempi ?!?!? Mi sa che non ti coviente... Meglio studiarsi come funziona ogni singola istruzione e poi vedere gli esempi...

Luc@s
28-06-2004, 19:28
Originariamente inviato da cionci
Ma stai cercando di imparare l'assembly dagli esempi ?!?!? Mi sa che non ti coviente... Meglio studiarsi come funziona ogni singola istruzione e poi vedere gli esempi...


cmq......ho ragione io??
Il fatto è che l'asm è funzioni..........non ha sintassi :(:(

kniv7s
28-06-2004, 19:45
Ho qualche libro sui microprocessori intel ma i concetti espressi sono abbastanza difficili. Posto i titoli, chissa' se li conoscete:

- Il manuale 8086 / 8088 - McGrawHill
- 8086 8088 Programmazione - Jackson
- Sistemi a microcomputer (v.2) - Ddelektron
- I microprocessori della famiglia iAPX 86 - Masson
- IBM PC Programmazione del microprocessore 8088 - Tecniche nuove

Finora sto leggendo quest'ultimo... ma usa sintassi NASM (io uso TASM)

le guide su internet sono piu' esplicative in modo diretto al linguaggio??

pensate che possa riuscire ad imparare l'asm entro settembre (prima che vada in Ia ITI ) ??

kniv7s
28-06-2004, 19:52
Originariamente inviato da cionci
... Meglio studiarsi come funziona ogni singola istruzione e poi vedere gli esempi...

il fatto è che ogni istruzione porta all'utilizzo di altre 10 :(

mmx[ngg]
28-06-2004, 19:57
Originariamente inviato da kniv7s
Ho qualche libro sui microprocessori intel ma i concetti espressi sono abbastanza difficili. Posto i titoli, chissa' se li conoscete:

- Il manuale 8086 / 8088 - McGrawHill
- 8086 8088 Programmazione - Jackson
- Sistemi a microcomputer (v.2) - Ddelektron
- I microprocessori della famiglia iAPX 86 - Masson
- IBM PC Programmazione del microprocessore 8088 - Tecniche nuove

Finora sto leggendo quest'ultimo... ma usa sintassi NASM (io uso TASM)

le guide su internet sono piu' esplicative in modo diretto al linguaggio??

pensate che possa riuscire ad imparare l'asm entro settembre (prima che vada in Ia ITI ) ??

ITI è l'istituto tecnico industriale ?

Vuoi un metodo diretto x imparare....

Impara le basi del C, scrivi piccoli algoritmi e tramite il compilatore li traduci in asm. Vai sul sito Intel/AMD e ti scarichi i manuali sulle istruzioni x86. Manuale alla mano cerchi di capire xke il compilatore ha tradotto quello ke tu hai scritto in C in quel modo e inizi a smanettare sul codice. Ti prendi un bel debugger (wdasm), impari cosa sono i flag e i salti condizionati e procedi step by step verificando i cambiamenti di ogni istruzione sullo stack, flag e sui registri. All'inizio non è una passeggiata ma ti rimangono in testa molte + cose rispetto alla semplice lettura di manuali....anke xke ognuno ha il suo metodo di apprendimento e non è detto ke sia necessariamente quello ke ti viene 'imposto' da un libro.

L'asm è abbastanza semplice da imparare....il problema vero è usarlo in modo efficente....ma quello viene col tempo ;)

kniv7s
28-06-2004, 20:03
le basi del C le so, anche se ho qualche bug con i puntatori

potresti farmi un esempio di algoritmo per farmi una idea (che non mi è chiara) ?

il libro parla dei flag ma non li ho in testa

per il resto seguo le indicazioni che mi hai dato

ps.: si', iti è istituto tecnico industriale

kniv7s
28-06-2004, 20:06
potrebbe servire l'inserimento di codice ASM inline nel C o nel pascal , per un funzionamento immediato?

Luc@s
28-06-2004, 20:09
Originariamente inviato da kniv7s
potrebbe servire l'inserimento di codice ASM inline nel C o nel pascal , per un funzionamento immediato?

http://kleidemos.altervista.org/guidaASM4Trad.rar
Download and Have fun :D

mmx[ngg]
28-06-2004, 20:51
le basi del C le so, anche se ho qualche bug con i puntatori


Più ke bug io utilizzerei il termine incertezza....bug è un'altra cosa


potresti farmi un esempio di algoritmo per farmi una idea (che non mi è chiara) ?


Un semplice ciclo con un'unica condizione di uscita (senza or / and...quelli li aggiungi dopo) ke abbia all'interno una if e qualke istruzione (possibilmente istruzioni semplici.....assegnazioni o simili...non chiamate ad altre funzioni)


il libro parla dei flag ma non li ho in testa


E' x questo ke li devi studiare....tanto sono poca roba...però è meglio capirli bene

cionci
28-06-2004, 23:00
Originariamente inviato da kniv7s
Ho qualche libro sui microprocessori intel ma i concetti espressi sono abbastanza difficili. Posto i titoli, chissa' se li conoscete:

- Il manuale 8086 / 8088 - McGrawHill
- 8086 8088 Programmazione - Jackson
- Sistemi a microcomputer (v.2) - Ddelektron
- I microprocessori della famiglia iAPX 86 - Masson
- IBM PC Programmazione del microprocessore 8088 - Tecniche nuove

Finora sto leggendo quest'ultimo... ma usa sintassi NASM (io uso TASM)

le guide su internet sono piu' esplicative in modo diretto al linguaggio??

pensate che possa riuscire ad imparare l'asm entro settembre (prima che vada in Ia ITI ) ??
Il primo è un libro del 79 ;) Forse meglio passare a qualcosa di più "moderno"...
E perchè non scarichi NASM ?!!?!?

AnonimoVeneziano
28-06-2004, 23:10
Infatti .

Il TASM ormai è vecchiotto .

Inoltre il NASM si prospetta per essere l'assembler per x86 più usato in futuro, soprattutto per il fatto di essere Open SOurce e per la possibilità di girare su + piattaforme (da Win a DOS a Linux a vari UNIX/*NIX )

Ciao

kniv7s
29-06-2004, 05:23
Ah ok faro' come dite. :)

kniv7s
29-06-2004, 05:44
Perche' NASM mi dà 5 errori per questo


.model small
.stack

.data

num1 dw 20
num2 dw 4

.code

Init:

MOV es,@data

END Init


????????

AnonimoVeneziano
29-06-2004, 09:22
Originariamente inviato da kniv7s
Perche' NASM mi dà 5 errori per questo


.model small
.stack

.data

num1 dw 20
num2 dw 4

.code

Init:

MOV es,@data

END Init


????????


Perchè la sintassi è cannata :D :

[BITS 16]

SEGMENT data

num1 dw 20
num2 dw 4

SEGMENT code

..start:

mov ax, data
mov ds, ax

mov ax, code
mov cs, ax

mov ax, stack
mov ss, ax

mov sp, stacktop

SEGMENT stack stack

resb 512

stacktop:



Il programma che hai scritto non faceva altro che inizializzare il Data segment , in quello che ho scritto io in questo caso inizializzo tutti i registri segmenti e anche lo stack pointer . TI ricordo che non è possibile inizializzare direttamente un registro segmento , quindi le scritture :

mov ds, @data (per TASM, presumo)
o

mov ds, data (per NASM)

sono sbagliate .

Bisogna prima passare il valore in un registro come AX e poi farle finire nel registro segmento.

CIao

repne scasb
29-06-2004, 10:43

AnonimoVeneziano
29-06-2004, 10:52
Originariamente inviato da repne scasb
No. Sono le direttive "corrette" per assemblaggio tramite TASM. Ogni assemblatore ha "SUE" direttive. Un codice assembly IDEAL/TASM e' incompatibile con MASM(Microsoft) entrambi sono incompatibile con NASM (e chiaramente viceversa). Per rendere i codici compatibile e' necessario rendere compatibili le direttive.


Cioè, in pratica

mov ds, @data

sotto TASM viene trasformato in 2 istruzioni MOV che fanno il lavoro?

Ciao

kniv7s
29-06-2004, 10:56
oh chiaro

ma mi avete consigliato NASM o MASM?? :mc:

AnonimoVeneziano
29-06-2004, 10:58
Originariamente inviato da kniv7s
oh chiaro

ma mi avete consigliato NASM o MASM?? :mc:

NASM

kniv7s
29-06-2004, 11:02
Ah allora ho fatto bene. :P

AnonimoVeneziano
29-06-2004, 11:09
Originariamente inviato da repne scasb
No. Sono le direttive "corrette" per assemblaggio tramite TASM. Ogni assemblatore ha "SUE" direttive. Un codice assembly IDEAL/TASM e' incompatibile con MASM(Microsoft) entrambi sono incompatibile con NASM (e chiaramente viceversa). Per rendere i codici compatibile e' necessario rendere compatibili le direttive.


Ho fatto una ricerca in giro e ho visto che TASM non esegue nessuna conversione o robe del genere , quindi la scrittura :

mov ds, @data

sotto TASM è illegale.

Anche per questo assemblatore bisogna usare

mov ax, @data
mov ds,ax

Ciao

repne scasb
29-06-2004, 11:56

AnonimoVeneziano
29-06-2004, 11:59
Originariamente inviato da repne scasb
Funziona in TASM 5 modo IDEAL+MACRO.INC. Viene automaticamente trasformato in:


push @data
pop ds



Ah ok , scusa :p