|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Mar 2005
Città: Lecce
Messaggi: 195
|
ASM : caricare un vettore
salve a tutti allora, sto preparando un progetto per l'uni e devo ad un certo punto caricare dei valori presi da un file di testo in un vettore. Allora io ho :
1) scritto la routine per l'apertura, la scanzione Char per char e la conversione dei char in interi senza segno a 16 bit (valori positivi da 0 a 32mila e rotti) 2)tale procedura riorna di volta i volta il valore convertito in una varibile allocata dichiarata in BSS ora io dovrei riempire il vettore per poterci poi fare 2 operazioni di cui ho già scritto il codice solo che al momeno non riesco a venirne a capo. Qualcuno mi da qualche dritta ? vi pasto il codice che apre il file legge carattere carattere e (al momento) stampa a video i caratteri convertiti al posto di metterli nel vettore "fotogramma". L'assemblatore usato è as88 di tanenbaum ma a me non serve che scriviate il codice apposta per il mio asm bastano le linee guida generali che non riesco a cogliere. Grazie a tutti in anticipo PS è asm 8088 APRE E LEGGE Codice:
#include "syscalnr.h"
#include "converter.s"
bufsiz = 1 ! blocchi di 1 byte (16 bit)
.SECT .TEXT
infbufst:!(puntatore a vector)
mov SI,0
push bp
mov bp,sp
1: PUSH 0 ! lettura
PUSH filnam ! nomefile
PUSH _OPEN ! funzione
SYS ! chiamata sistema
ADD SP,8 ! pulisco lo stack
CMP AX,0 ! ci sono errori nell'apertura?
JL 9f ! errore nell'apertura
MOV (fildes),AX ! metto in fildes il descrittore del file
MOV BX,0
1: CALL vulbuf !carica il contenuto del file in memoria
CMP CX,0 !se cx 0 non ho letto
JLE 3f !termino esecuzione per fine file
2: MOVB AL,' ' !metto lo spazio in al
REPNE SCASB !cerco lo spazio nel buffer attuale
JNE impila !se non spazio lo metto sullo stack
push dx !numero di caratteri impilati sullo stack
call charInt !conversione ascii to intero
mov dx,0 !azzero il contacaratteri
add sp,4 !pulisco lo stack
sub (buf), 100 !pulisco il buffer
push (conv) !metto il numero convertito sullo stack
push fts !formattazione stringa
push _PRINTF !stampo a video
sys !chiama sistema
add sp,6 !pulisco lo stack
INC (count) !incremento contatore
MOV AX,BX !scansione quanto letto e posizionato in memoria
SUB AX,CX !caratteri rimanenti
CMP CX,0 !se zero ho finito il buffer
JNE 2b !continuo a cercare nel buffer
JMP 1b !ricarico il buffer con nuovi caratteri
9: mov AX, 1 !errore nel caricamento
pop bp !rirpistino il pb
ret !esco dalla procedura
3:
push 0 !codice di uscita
push _EXIT !termina programma
sys !chiamata di sistema
impila :
push (buf) !salvo sullo stack il carattere letto
inc DX !incremento il contatore di carattei
jmp 1b !torno a leggere
vulbuf:
PUSH bufsiz ! quanti bite leggo
PUSH buf ! contiene il carattere letto
PUSH (fildes) ! dove leggo
PUSH _READ ! leggo
SYS ! chiamata di sistema
ADD SP,8 ! pulisco lo stack
MOV CX,AX ! in ax numero di byte letti
ADD BX,CX ! li aggiungo a quelli letti in prcedenza
MOV DI,buf ! prossima posizione da leggere
RET ! 93
.SECT .DATA
filnam : .ASCIZ "Input.txt" !nomefile
fts: .ASCIZ "Valore : %d\n" !stringa di formattazione
.SECT .BSS !
fildes: .SPACE 2 !descrittore del file
buf: .SPACE 1 !dove memorizzo i caratteri
count: .SPACE 2 !contatore
conv: .SPACE 4 !contiene i caratteri convertiti in numeri
fotogramma: .SPACE 9600
Codice:
#include "syscalnr.h" .SECT .TEXT !Convertitore char to dec per il progetto di Architetture giugno 09 !developed under debian GNU/LINUX charInt: !( val1....valn, dim) -> conv push ax push dx push cx push bx push SI push DI push bp mov bp,sp mov SI, 16 mov cx , (BP)(SI) !indice ciclo !dec cx mov dx, cx !controllo dei pesi add SI ,2 mov ax ,0 cilo: push dx mov bx, (BP)(SI) sub bx, 48 sub dx, cx push ax cmp dx, 0 je zero cmp dx, 1 je uno cmp dx, 2 je due cmp dx, 3 je tre cmp dx, 4 je quattro molt: mul bx mov bx,ax pop ax pop dx add ax, bx add si ,2 loop cilo mov (conv),ax pop bp pop di pop SI pop bx pop cx pop dx pop ax ret zero : mov ax , 1 jmp molt uno : mov ax , 10 jmp molt due: mov ax, 100 jmp molt tre: mov ax, 1000 jmp molt quattro: mov ax, 10000 jmp molt .sect .data .sect .bs
__________________
Albert Einstein disse " Solo due cose sono infinite: l'universo e la stupidità umana. Ma non sono sicuro della prima " e aveva ragione Ho Contrattato con gli utenti "carbv" "(zar)sheva" "rasbeetle" |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:40.



















