PDA

Visualizza la versione completa : [ASM] esempi con vettori?


rocco.g
30-06-2005, 11:47
Ciao!

mi chiedevo se qualcuno di voi conoscesse qualche sito o avesse qualche programma di esempio scritto in assembly per x86 che usa vettori per compiere operazioni del tipo:
trovare la media dei valori contenuti in un vettore, ribaltare un vettore di caratteri etc...
esercizi non molto complessi, giusto per capire come funziona la cosa con i vettori in asm...
Ho cercato su google, ma non si trova molto!!!

help me please!

Squall1988
30-06-2005, 14:46
Somma di un vettore di byte



DOSSEG
.MODEL small
.STACK 10h

.DATA ; Nel Data Segment...
TAB db 01h, 0FFh ; Tabella di numeri
LUN EQU $-TAB ; Lunghezza della tabella
SOM dw ? ; Somma tabella

.CODE ; Nel Code Segment...
Inizio: StartupCode

; Inizializzazione
MOV AX , 0 ; Inizializzazione somma a 0
MOV CL , LUN ; Contatore dei numeri
LEA BX , TAB ; Puntatore alla tabella

; Corpo del programma
Ciclo: CMP CL , 0 ; Verifica se ci sono numeri da sommare
JZ FineCiclo ; Uscita dal ciclo, non ci sono altri numeri
ADD AL , [BX] ; Parte bassa della somma
ADC AH , 0 ; Eventuale riporto
INC BX ; Punta al numero successivo
DEC CL ; Manca un numero in meno
JMP Ciclo ; Torna all'inizio del ciclo
FineCiclo: ; Fine del ciclo

; Salvataggio risultato
MOV [SOM] , AX ; Salva la somma della tabella

ExitCode 0
END Inizio

Squall1988
30-06-2005, 14:49
conversione in maiuscolo di una stringa (vettore di byte (caratteri) in cui l'ultimo elemento è il $ così rispetta la convenzione DOS)



; Segmentazione del DOS
DOSSEG
; Modello di memoria
.MODEL small
; Memoria per lo stack
.STACK 100h

;------------------------------------------------------------------------------
; Data segment
;------------------------------------------------------------------------------
.DATA
STR1 db 'ciAo a Tutti$'
STR2 db $-STR1 DUP (?)
LMIN EQU 'a' ; Limite inferiore
LMAX EQU 'z' ; Limite superiore
DIFF EQU 'A' - 'a' ; Differenza tra lettere minuscole e maiuscole

;------------------------------------------------------------------------------
; Code Segment
;------------------------------------------------------------------------------
.CODE
Begin: StartupCode ; Inizio del programma

; Inizializzazione dei registri
LEA SI , STR1 ; Punta all'inizio della stringa
LEA DI , STR2 ; Inizio della seconda stringa

; Algoritmo
Ciclo:
MOV AL , [SI] ; Prelevo il carattere
CMP AL , LMIN ; Se non c'è Carry, è >= a
JC NoMin ; Se salti, non è minuscola
CMP AL , LMAX + 1 ; Se c'è Carry, è <= z, ossia < z+1
JNC NoMin ; Se salti, non è minuscola
; Lettera minuscola, da convertire
ADD AL , DIFF ; Porta il carattere in maiuscolo
NoMin: MOV [DI] , AL ; Salva il carattere (modificato quando necessario)
CMP AL , '$' ; Vediamo se la stringa è finita
JZ FineC ; Se salti, la stringa è finita
INC DI ; Prossima posizione valida
INC SI ; Prossimo carattere
JMP Ciclo ; Torna al ciclo
FineC:

; Fine del programma
ExitCode 0 ; Corretta terminazione del programma
END Begin ; Uscita dal programma



unione insiemistica di due vettori



; Segmentazione del DOS
DOSSEG
; Modello di memoria
.MODEL small
; Memoria per lo stack
.STACK 100h

;------------------------------------------------------------------------------
; Data segment
;------------------------------------------------------------------------------
.DATA
V1 db 2, 3, 4
L1 EQU $-V1
V2 db 5, 4, 8
L2 EQU $-V2
L3 EQU L1 + L2 + 1
V3 db L3 DUP (?)

;------------------------------------------------------------------------------
; Code Segment
;------------------------------------------------------------------------------
.CODE
Begin: StartupCode ; Inizio del programma

MOV AH , L1

; Copio il primo vettore nel terzo
LEA SI , V1
LEA DI , V3
INC DI
MOV CX , L1
Copia: MOV AL , [SI]
MOV BYTE PTR [DI] , AL
INC SI
INC DI
Loop Copia

; Analizzo il secondo vettore
MOV CX , L2
LEA SI , V2

Sec: MOV AL , [SI]
MOV DX , L1
LEA BX , V1

Cerca: CMP BYTE PTR [BX] , AL
JZ Next
INC BX
DEC DX
Jnz Cerca
; Non trovato
MOV [DI] , AL
INC AH
INC DI

Next: INC SI
Loop Sec

MOV [V3] , AH

; Algoritmo

; Salvataggio dei risultati

; Fine del programma
ExitCode 0 ; Corretta terminazione del programma
END Begin ; Uscita dal programma

rocco.g
30-06-2005, 15:45
grazie Squall!!!


e se ne volessi altri ? dove li potrei trovare ?

mi servirebbero anche esempi di agganci tra moduli asm in programmi scritti in C e come gestire i parametri che vengono salvati nello stack...

Squall1988
01-07-2005, 09:08
x mettere l'asm in C dovresti usare la parola chiave ASM

asm {
....
....
}

x quanto riguarda il secondo punto, intendi richiamare una routine che vuole i parametri dentro lo stack?

rocco.g
01-07-2005, 12:56
quando una funzione in C ne richiama una scritta in asm salva nello stack prima tutti i parametri e poi la procedura in asm li prende uno ad uno e li gestisce con "BP + locazione di memoria desiderata".

Più o meno so come funziona, ma mi piacerebbe vedere qualche altro esempio, magari con la spiegazione passo passo di quello che accade nello stack quando la funzione viene eseguita...

Oltre a questo:


asm {
....
....
}


c'era anche quello di usare la funzione scritta in asm come una libreria esterna al modulo scritto in C, mi interesserebbe di più capire come fare per usare questo metodo, cioè come faccio a dire che il file in C deve andare a cercare le funzioni nel file scritto in asm ? come lo compilo ?

Squall1988
01-07-2005, 13:46
uhm, no questo nn l'ho mai provato, non ti saprei aiutare :rollo: :rollo: , se trovo qualcosa cmq te lo posto :zizi: :zizi:

rocco.g
01-07-2005, 15:50
io ho capito più o meno come fare, ma non ho capito con che opzione compilare il file asm per usarlo come libreria...

cmq va beh... se trovi qualcosa fammelo sapere ;)
Grazie! :D

Squall1988
01-07-2005, 16:13
uhm, nn puoi compilarlo con il compilatore asm e includere l'obj?

rocco.g
01-07-2005, 17:21
si in effetti l'idea che avevo era questa...

cioè tasm nome_file.asm

e creo il file oggetto...

però poi non so come collegare il file nome_file.obj all'interno del file scritto in C...

#include < nome_file.obj >

:confused: :confused: :confused:

o devo compilare il file C usando qualke opzione che permetta di includere il file oggetto in asm ?

Loading