PROCEDURE Fill64k (Where:word;Col : Byte); assembler;
asm
; Guardamos ES en la pila
push es
; 16000 veces
mov cx, 16000;
; Movemos el valor de la variable a ES
mov es,[where]
; Ponemos DI a cero
; Error: esto supone que los 2 bytes más altos de EDI
; están a cero, por tanto puede producir errores si no es así
xor di,di
; Movemos el valor con que queremos rellenar la zona de memoria a AL (1 byte)
mov al,[col]
; Copiamos ese mismo byte a AH
mov ah,al
; Ahora viene lo que te da el dolor de cabeza :)
; Copia AX en DX (como una variable temporal)
mov dx, ax
; Mueve 16 posiciones a la izquierda EAX, es decir, rellena los 16 bits altos de EAX. AX queda a 0.
db $66, $C1, $E0, $10 {shl eax, 16}
; Vuelve a poner DX en AX, con lo que nos queda el byte con el que rellenar la zona de memoria
; repetido en los 4 bytes de EAX.
mov ax, dx
; Copia EAX 16000 veces en ES:EDI
; Rellena 16000 x 4 bytes = 64000 bytes = 64K con el valor de Col
db $F3, $66, $AB {rep stosd}
; Recupera el ES original
pop es
End;