-
Notifications
You must be signed in to change notification settings - Fork 0
/
shared.asm
152 lines (139 loc) · 5.67 KB
/
shared.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
;#########################################################################
;@file shared.asm
;@brief Libreria con wrappers de systems calls
; Intel x86 compatible en 32 bit.
;@author Agustin Alba Chicar
;@date Noviembre, 2015
;#########################################################################
;********************************************************************************
; Simbolos externos y globales
;********************************************************************************
%include "system.inc"
%include "video.inc"
GLOBAL print
GLOBAL cls
GLOBAL getTime
GLOBAL sleep
GLOBAL printNumberToArray
GLOBAL getChar
GLOBAL getTaskPriority
GLOBAL setTaskPriority
;********************************************************************************
; Defines
;********************************************************************************
;********************************************************************************
; Datos no inicializados
;********************************************************************************
;********************************************************************************
; Datos inicializados
;********************************************************************************
USE32
SECTION .shared
;********************************************************************************
;@fn void sleep(uint32_t ticks)
;@brief Wrapper de la sys call sleep
;@param tick es el numero de ticks a poner en sleep a la tarea
;********************************************************************************
sleep:
mov eax, SYSTEM_API_SLEEP
int 0x80
ret
;********************************************************************************
;@fn void cls(void)
;@brief Wrapper de la sys call cls
;********************************************************************************
cls:
mov eax, SYSTEM_API_CLS
int 0x80
ret
;********************************************************************************
;@fn void print(char *string, int32_t column, int32_t row, int32_t attribute)
;@brief Wrapper de la sys call print
;@param string es el puntero al string a imprimir
;@param column es la columna donde se imprime la informacion
;@param row es la fila donde se imprime la informacion
;@param attribute es el atributo de los caracteres que imprimen la informacion
;********************************************************************************
print:
mov eax, SYSTEM_API_PRINT
int 0x80
ret
;********************************************************************************
;@fn void getTime(timeType *time)
;@brief Wrapper de la sys call getTime
;@param time es un puntero a la estructura de la fecha donde se carga toda la informacion
;********************************************************************************
getTime:
mov eax, SYSTEM_API_GET_TIME
int 0x80
ret
;********************************************************************************
;@fn int getChar(char *value)
;@brief Wrapper de la sys call getTime
;@param time es un puntero a la estructura de la fecha donde se carga toda la informacion
;********************************************************************************
getChar:
mov eax, SYSTEM_API_GETCHAR
int 0x80
ret
;********************************************************************************
;@fn int getTaskPriority(uint32_t taskId)
;@brief Wrapper de la sys call getTaskPriority
;@param taskId es el id de la tarea a obenerle la prioridad
;@retval La prioridad de la tarea o PRIORITY_MAXIMUM+1 si no esta ese id de tarea
;********************************************************************************
getTaskPriority:
mov eax, SYSTEM_API_GETTASKPRIO
int 0x80
ret
;********************************************************************************
;@fn void setTaskPriority(uint32_t taskId, uint32_t priority)
;********************************************************************************
setTaskPriority:
mov eax, SYSTEM_API_SETTASKPRIO
int 0x80
ret
;********************************************************************************
;@fn printNumberToArray(uint32_t number, char *array)
;@brief Imprime sobre el array un numero number de 4 bytes. Agrega el NULL al final
;@details El mayor numero es 4294967295 que son 10 digitos por lo que array
; debe ser de 11 caracteres en caso de tener que usarse todo el rango.
;@param number es el numero a convertir
;@param array es puntero al buffer sobre el que se va a escribir
;********************************************************************************
printNumberToArray:
push ebp
mov ebp, esp
sub esp, 4 ; Reservamos una variable
pushad
push edi
; Lo primero es obtener la cantidad de digitos que tiene la variable
mov [ebp - 4], DWORD 0; Cargo en cero el contador de digitos
mov eax, [ebp + 8] ; Obtengo el numero
printNumberToArrayDigitsLoop:
mov ebx, [ebp - 4] ; Incrementamos el contador
inc ebx
mov [ebp - 4], ebx
mov edx, 0 ; Dividimos
mov ebx, 10
div ebx
push edx ; Guardamos en el stack dl
cmp eax, 0
jne printNumberToArrayDigitsLoop
mov edi, [ebp + 12] ; Obtengo el puntero al array
mov ecx, [ebp - 4] ; Cargo en ecx el numero de digitos
printNumberToArrayStackToArrayLoop:
pop eax ; Obtengo en al el ultimo digito
add al, '0' ; Sumo el offset del cero
mov [edi], al ; Cargo en el array
inc edi ; Incremento edi
dec ecx ; Decremento ecx
cmp ecx, 0 ; Testeo el contador para cargar el proximo valor
jne printNumberToArrayStackToArrayLoop
; Cargo en edi el null pointer
mov [edi], BYTE NULL
pop edi
popad
add esp, 4 ; Liberamos la variable
pop ebp
ret