<^MORFEO^>
21-08-2009, 15:19
Salve a tutti! :D
E' ormai da qualche settimana che bazzico con ASSEMBLER (classico x86) e vi sarei riconoscente se qualcuno mi aiutasse a capire che cosa fa in pratica una ben determinata porzine di codice in grassetto del seguente programma:
(Questo non è altro che un giochino che fa rimbalzare una pallina per lo schermo in modalità testo 80x25)
------------------------------------------------------------------------
.model small
.stack
.data
.code
inizio:
; imposto la modalità grafica 80x25
mov ah, 00h
mov al, 03h
int 10h
; Vengono usati 2 flag (ch e cl) che possono avere valore 0 o 1
; il valore di questi due viene impostato a seconda del valore attuale del cursore
; i flag servono a stabilire se sul contatore di riga o colonna va fatta un operazione di incremento o decremento
; Valori dei flag:
; CH = 0: decremento delle colonne
; CH = 1: incremento delle colonne
; CL = 0: decremento delle righe
; CL = 1: incremento delle righe
mov ax, 0B800h ; imposto il segmento extra per la memoria video (il primo carattere in alto a dx è contenuto in quseto indirizzo in ram video)
mov es, ax
; BX: punto di partenza
mov bh, 0 ; BH: colonne
mov bl, 0 ; BL: righe
; DX: carattere da stampare e attributo
mov dh, '8' ; codice ascii del carattere riprodotto
mov dl, 0Eh ; attributo del carattere
; inizialmente imposto i flag a 1 poiche incremento tutti i contatori
mov ch, 1 ; comincio il moto verso il basso e verso sinistra
mov cl, 1
ciclo1:
mov ah, es:[si]
mov al, es:[si+1]
mov bp, ax
mov di, bx
mov al, 80
mov ah, 0
mul bl
xchg bh, bl
mov bh, 0
add ax, bx
mov bx, si
mov bl, 2
mov bh, 0
mov si, dx
mul bx
mov dx, si
mov si, ax
mov es:[si], dh
mov es:[si+1], dl
mov bx, di
call sleep
; setto i flag (CX)
cmp bl, 24
jne pRig2
mov cl, 0
jmp pCol1
pRig2:
cmp bl, 0
jne pCol1
mov cl, 1
pCol1:
cmp bh, 79
jne pCol2
mov ch, 0
jmp continua
pCol2:
cmp bh, 0
jne continua
mov ch, 1
continua:
cmp ch, 0
jne v2
; decrementa colonne
dec bh
jmp colonne
v2:
; incrementa colonne
inc bh
colonne:
cmp cl, 0
jne v3
; decrementa righe
dec bl
jmp salta
v3:
; decrementa righe
inc bl
jmp salta
salta:
mov ax, bp
mov es:[si], ah
mov es:[si+1], al
jmp ciclo1
mov ah, 4Ch
int 21h
; sleep: effettua 10^8 push (15 ck) e pop (15 ck)
sleep PROC
push cx
mov cx, 10000
cicloSleep:
push cx
mov cx, 10000
ciclo2:
loop ciclo2
pop cx
loop cicloSleep
pop cx
ret
sleep ENDP
END inizio
------------------------------------------------------------------------
Che cosa faccia ogni singola riga la capisco, ma non capisco nel complesso a che cosa serva quella porzione di codice... :(
Grazie mille! :)
E' ormai da qualche settimana che bazzico con ASSEMBLER (classico x86) e vi sarei riconoscente se qualcuno mi aiutasse a capire che cosa fa in pratica una ben determinata porzine di codice in grassetto del seguente programma:
(Questo non è altro che un giochino che fa rimbalzare una pallina per lo schermo in modalità testo 80x25)
------------------------------------------------------------------------
.model small
.stack
.data
.code
inizio:
; imposto la modalità grafica 80x25
mov ah, 00h
mov al, 03h
int 10h
; Vengono usati 2 flag (ch e cl) che possono avere valore 0 o 1
; il valore di questi due viene impostato a seconda del valore attuale del cursore
; i flag servono a stabilire se sul contatore di riga o colonna va fatta un operazione di incremento o decremento
; Valori dei flag:
; CH = 0: decremento delle colonne
; CH = 1: incremento delle colonne
; CL = 0: decremento delle righe
; CL = 1: incremento delle righe
mov ax, 0B800h ; imposto il segmento extra per la memoria video (il primo carattere in alto a dx è contenuto in quseto indirizzo in ram video)
mov es, ax
; BX: punto di partenza
mov bh, 0 ; BH: colonne
mov bl, 0 ; BL: righe
; DX: carattere da stampare e attributo
mov dh, '8' ; codice ascii del carattere riprodotto
mov dl, 0Eh ; attributo del carattere
; inizialmente imposto i flag a 1 poiche incremento tutti i contatori
mov ch, 1 ; comincio il moto verso il basso e verso sinistra
mov cl, 1
ciclo1:
mov ah, es:[si]
mov al, es:[si+1]
mov bp, ax
mov di, bx
mov al, 80
mov ah, 0
mul bl
xchg bh, bl
mov bh, 0
add ax, bx
mov bx, si
mov bl, 2
mov bh, 0
mov si, dx
mul bx
mov dx, si
mov si, ax
mov es:[si], dh
mov es:[si+1], dl
mov bx, di
call sleep
; setto i flag (CX)
cmp bl, 24
jne pRig2
mov cl, 0
jmp pCol1
pRig2:
cmp bl, 0
jne pCol1
mov cl, 1
pCol1:
cmp bh, 79
jne pCol2
mov ch, 0
jmp continua
pCol2:
cmp bh, 0
jne continua
mov ch, 1
continua:
cmp ch, 0
jne v2
; decrementa colonne
dec bh
jmp colonne
v2:
; incrementa colonne
inc bh
colonne:
cmp cl, 0
jne v3
; decrementa righe
dec bl
jmp salta
v3:
; decrementa righe
inc bl
jmp salta
salta:
mov ax, bp
mov es:[si], ah
mov es:[si+1], al
jmp ciclo1
mov ah, 4Ch
int 21h
; sleep: effettua 10^8 push (15 ck) e pop (15 ck)
sleep PROC
push cx
mov cx, 10000
cicloSleep:
push cx
mov cx, 10000
ciclo2:
loop ciclo2
pop cx
loop cicloSleep
pop cx
ret
sleep ENDP
END inizio
------------------------------------------------------------------------
Che cosa faccia ogni singola riga la capisco, ma non capisco nel complesso a che cosa serva quella porzione di codice... :(
Grazie mille! :)