PDA

View Full Version : [ASSEMBLER] Aiuto, non capisco alcune linee di codice...


<^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! :)

<^MORFEO^>
22-08-2009, 09:27
^UP

<^MORFEO^>
24-08-2009, 08:46
^UP