radoen
21-06-2009, 00:08
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
#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
CONVERTER
#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
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
#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
CONVERTER
#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