Sartomiki.net

  • Aumenta dimensione caratteri
  • Dimensione caratteri predefinita
  • Diminuisci dimensione caratteri

Libreria

E-mail Stampa PDF
Valutazione attuale: / 0
ScarsoOttimo 

; In questo file ASM sono presenti alcune funzioni richiamabili da C o da altre procedure Assembler.
; chkn -> controlla se la stringa Ë un numero valido
; str2bin -> converte una stringa in numero
; bin2str -> converte un numero in una stringa
; strrev -> inverte una stringa sul posto
; dbavg -> esegue la media di un vettore di byte
; dwavg -> esegue la media di un vettore di word

PUBLIC chkn, str2bin, bin2str, strrev, dbavg, dwavg

.MODEL small
.CODE

; ----------------------------------------------------------------
; PROCEDURA chkn
; controlla se la stringa Ë un numero valido
; CF -> ritorna: 1 valido, 0 errore
; BP + 6 -> lunghezza stringa
; BP + 4 -> indirizzo stringa
chkn                PROC                   

; inizializza gestione parametri
PUSH BP
MOV BP, SP

; salva registri
PUSH BX
PUSH SI

; inizializza procedura
MOV BX, [BP+4]
MOV SI, 0
chkn_loop:                CMP BYTE PTR [BX][SI], "0" ; controlla carattere
JB chkn_error
CMP BYTE PTR [BX][SI], "9"
JA chkn_error

; verifica se continuare il ciclo
INC SI
CMP SI, [BP+6]
JNE chkn_loop

; numero valido
chkn_valid:                STC
JMP chkn_end

; numero non valido
chkn_error:                CLC
JMP chkn_end

; ripristina i registri, pulisce lo stack e ritorna
chkn_end:                POP SI
POP BX
POP BP
RET 4

chkn                ENDP
; FINE PROCEDURA chkn
; ----------------------------------------------------------------

; ----------------------------------------------------------------
; PROCEDURA str2bin
; converte una stringa in numero
; BP + 8 -> ritorna: risultato conversione
; BP + 6 -> lunghezza stringa
; BP + 4 -> indirizzo stringa
str2bin                PROC   

; inizializza gestione parametri
PUSH BP
MOV BP, SP

; salva registri
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI

; inizializza procedura
MOV BX, [BP+4]
MOV SI, 0
MOV AX, 0
MOV CX, 10

; moltiplica numero per dieci
str2bin_loop:            MUL CX

; converte il carattere successivo e lo somma al risultato
; salva temporaneamente il risultato in DX per eseguire la CBW
MOV DX, AX
MOV AL, [BX][SI]
SUB AL, "0"
CBW
ADD DX, AX
MOV AX, DX

; verifica se continuare il ciclo
INC SI
CMP SI, [BP+6]
JNE str2bin_loop

; salva il risultato
MOV [BP+8], AX

; ripristina i registri, pulisce lo stack e ritorna
str2bin_end:            POP SI
POP DX
POP CX
POP BX
POP AX
POP BP
RET 4

str2bin                ENDP
; FINE PROCEDURA str2bin
; ----------------------------------------------------------------               

; ----------------------------------------------------------------
; PROCEDURA bin2str
; converte un numero in stringa
; BP + 8 -> ritorna: lunghezza della stringa
; BP + 6 -> numero da convertire
; BP + 4 -> indirizzo stringa
bin2str                PROC   

; inizializza gestione parametri
PUSH BP
MOV BP, SP

; salva registri
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI

; inizializza procedura
MOV BX, [BP+4]
MOV AX, [BP+6]
MOV DX, 0
MOV SI, 0
MOV CX, 10

; divide numero per dieci
bin2str_loop:            DIV CX

; converte il resto in cifra, lo accoda alla stringa e ripristina il numero da dividere
ADD DL, "0"
MOV [BX][SI], DL
INC SI
CWD

; controlla se continuare
CMP AX, 0
JNE bin2str_loop

; termina la stringa e salva il parametro da restituire
MOV BYTE PTR [BX][SI], "$"
MOV [BP+8], SI

; inverte la stringa
PUSH SI
PUSH [BP+4]
CALL strrev

; ripristina i registri, pulisce lo stack e ritorna
bin2str_end:            POP SI
POP DX
POP CX
POP BX
POP AX
POP BP
RET 4                       

bin2str                ENDP
; FINE PROCEDURA bin2str
; ----------------------------------------------------------------   

; ----------------------------------------------------------------
; PROCEDURA strrev
; inverte una stringa sul posto
; BP + 6 -> lunghezza stringa
; BP + 4 -> indirizzo stringa
strrev                PROC   

; inizializza gestione parametri
PUSH BP
MOV BP, SP

; salva registri
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DI

; inizializza procedura
MOV BX, [BP+4]
MOV CX, [BP+6]
SHR CX, 1
MOV SI, 0
MOV DI, [BP+6]
DEC DI

; scambia i caratteri correnti
strrev_loop:            MOV AL, [BX][SI]
XCHG AL, [BX][DI]
MOV [BX][SI], AL

; controlla se continuare
INC SI
DEC DI
CMP SI, CX
JNE strrev_loop

; ripristina i registri, pulisce lo stack e ritorna
bin2str_end:            POP DI
POP SI
POP CX
POP BX
POP AX
POP BP
RET 4           

strrev                ENDP
; FINE PROCEDURA strrev
; ----------------------------------------------------------------   

; ----------------------------------------------------------------
; PROCEDURA dbavg
; esegue la media di un vettore di byte
; BP + 8 -> ritorna: media del vettore
; BP + 6 -> lunghezza vettore
; BP + 4 -> indirizzo vettore
dbavg                PROC   

; inizializza gestione parametri
PUSH BP
MOV BP, SP

; salva registri
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI

; inizializza procedura
MOV BX, [BP+4]
MOV CX, 0
MOV SI, 0

; somma elementi vettore
dbavg_loop:                MOV AL, [BX][SI]
CBW
ADD CX, AX

; controlla se continuare il ciclo
INC SI
CMP SI, [BP+6]
JNE dbavg_loop

; calcola la media
MOV AX, CX
CWD
IDIV WORD PTR [BP+6]

; salva il risultato
MOV [BP+8], AX

; ripristina i registri, pulisce lo stack e ritorna
dbavg_end:                POP SI
POP DX
POP CX
POP BX
POP AX
POP BP
RET 4       

dbavg                ENDP
; FINE PROCEDURA dbavg
; ----------------------------------------------------------------   

; ----------------------------------------------------------------
; PROCEDURA dwavg
; esegue la media di un vettore di word
; BP + 8 -> ritorna: media del vettore
; BP + 6 -> lunghezza vettore
; BP + 4 -> indirizzo vettore
dwavg                PROC                       

; inizializza gestione parametri
PUSH BP
MOV BP, SP

; salva registri
PUSH AX
PUSH BX
PUSH DX
PUSH SI

; inizializza procedura
MOV BX, [BP+4]
MOV CX, [BP+6]
SHL CX, 1
MOV SI, 0
MOV AX, 0
MOV DX, 0

dwavg_loop:                ADD AX, [BX][SI]
JNO dwavg_noov
INC DX

; controlla se continuare il ciclo
dwavg_noov:                ADD SI, 2
CMP SI, CX
JNE dwavg_loop

; calcola la media e salva il risultato
IDIV WORD PTR [BP+6]
MOV [BP+8], AX

; ripristina i registri, pulisce lo stack e ritorna
dbavg_end:                POP SI
POP DX
POP BX
POP AX
POP BP
RET 4   

dwavg                ENDP
; FINE PROCEDURA dwavg
; ----------------------------------------------------------------   

; FINE MODULO
END

 


blog comments powered by Disqus
 

http://sartomiki.net/modules/mod_fuofb/assets/it/find-us-on-facebook-1.png

Follow me

Amici

Chi è online

 4 visitatori online

Siti amici

Banner

Notizie flash

Ora Sartomiki.net ha ben 200 appunti di 16 materie differenti! La sezione Appunti è davvero grande!

PUBBLICITA'