; 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
| < Prec. | Succ. > |
|---|






