-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlibRands.asm
159 lines (130 loc) · 3.08 KB
/
libRands.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
.8086
.model small
.stack 100h
.data
.code
public toAscii
public seedInicial
public printar
public contar
;Recibe en AX el numero a convertir
;Recibe en BX el offset de la variable (de dos caracteres)
;Recibe en CL la base, (10d si es decimal, 16d si es hexa, 2d si es binario)
;Recibe en DI la cantidad de caracteres
;Es necesario que la base sea menor o igual a 16 para que el resto de la division sea de 8bitsy pueda ser usado como caracter
toAscii proc
push ax
push dx
push di
pushf
inicio:
dec di
xor dx, dx
div cx ;Divido por la base (en 16bits)
cmp dl, 9 ;Me fijo si es un numero o una letra (en el caso de que la base sea 16)
jbe num
add dl, 07h ;sumo 11h para luego sumar 30h y obtener 41h
num:
add dl, 30h
mov [bx+di], dl ;Guardo el digito
cmp ax, 0 ;Termino una vez que el cociente es 0
je finConv
jmp inicio
finConv:
popf
pop di
pop dx
pop ax
ret
toAscii endp
;Genera una semilla a partir de la fecha y hora del sistema
;Devuelve por AX la semilla generada
seedInicial proc
push bx
push cx
push dx
pushf
xor ax, ax
xor bx, bx
xor cx, cx
xor dx, dx
mov ah, 2ah ;Obtengo la fecha
int 21h ;CX = YY, DH = M, DL = D, AL = w (dia de la semana, ej: 00h = Domingo)
xor ah, ah ;Limpio AH, no me interesa el 2Ah
;Sumo todo en BX
add bx, cx
add bx, dx
add bx, ax
mov ax, bx ;Pongo una copia de lo obtenido hasta ahora en AX
shl ax, 1 ;Shifteo y luego xoreo para extra "randomness"
xor bx, ax
mov ah, 2ch ;Obtengo la hora, CH = Hr, CL = Min, DH = Sec, DL = 1/100sec
int 21h
add bx, cx
add bx, dx
or bx, 8101h ;Necesito que el seed sea distinto de cero e impar en el bit menos significativo de cada byte
;y por las dudas, tambien seteo el bit más significativo en 1
mov ax, bx
popf
pop dx
pop cx
pop bx
ret
seedInicial endp
;Recibe por BX el offset del texto a imprimir
;Recibe por CL el caracter de finalizacion del texto (ej: CL = 24h)
;Recibe por CH el caracter a imprimir al finalizar de imprimir el texto (caracter separador)
; ej: CH = 0dh (se imprimirá 0ah tambien para imprimir un salto de linea),
; CH = 24h (para no hacer nada),
; CH = 20h (para imprimir un espacio)
printar proc
push ax
push bx
push cx
pushf
print:
cmp byte ptr [bx], cl
je finPrint
;Imprimo el caracter que está en la posicion de SI
mov ah, 2
mov dl, [bx]
int 21h
;Incremento SI para pasar el caracter siguiente
inc bx
jmp print
finPrint:
;Imprimo el caracter separador
mov ah, 2
mov dl, ch
int 21h
cmp ch, 0dh
jne finPrintar
;Si es un caracter 0dh (\r) imprimo un 0ah (\n)
mov ah, 2
mov dl, 0ah
int 21h
finPrintar:
popf
pop cx
pop bx
pop ax
ret
printar endp
;Recibe por BX un offset
;Recibe por DL el caracter de finalizacion (no es incluido)
;Devuelve por DI la cantidad de caracteres
contar proc
push dx
pushf
xor di, di
contarChars:
cmp [bx+di], dl
je finContar
inc di
jmp contarChars
finContar:
popf
pop dx
ret
contar endp
end