PRA1 Buscaminas PDF

Title PRA1 Buscaminas
Course Estructura de computadors
Institution Universitat Oberta de Catalunya
Pages 10
File Size 113.4 KB
File Type PDF
Total Downloads 5
Total Views 120

Summary

PRA1 Buscaminas...


Description

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

section .data ;Cambiar Nombre y Apellido por vuestros datos. developer db "_Nom_ _Cognom1_",0 ;Constantes que también están definidas en C. DimMatrix equ 10 SizeMatrix equ 100 section .text ;Variables definidas en Ensamblador. global developer ;Subrutinas de ensamblador que se llaman desde C. global posCurScreenP1, showMinesP1, updateBoardP1, moveCursorP1 global mineMarkerP1, checkMinesP1, printMessageP1, playP1 ;Variables globales definidas en C. extern rowScreen, colScreen, rowMat, colMat, indexMat extern charac, mines, marks, numMines, state ;Funciones de C que se llaman desde ensamblador extern gotoxyP1_C, getchP1_C, printchP1_C extern printBoardP1_C, printMessageP1_C , ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ATENCIÓN: Recordad que las variables y los Parámetros de tipo 'char', ;; en ensamblador se tienen que asignar a registros de tipo ;; BYTE (1 byte): al, ah, bl, bh, cl, ch, dl, dh, sil, dil, ..., r15b ;; las de tipo 'int' se tienen que assignar a registres de tipo ;; DWORD (4 bytes): eax, ebx, ecx, edx, esi, edi, ...., r15d ;; las de tipo 'long' se tienen que assignar a registres de tipo ;; QWORD (8 bytes): rax, rbx, rcx, rdx, rsi, rdi, ...., r15 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Las subrutinas en ensamblador que tenéis que implementar son: ;; posCurScreenP1, showMinesP1, updateBoardP1 ;; moveCursorP1, mineMarkerP1, checkEndP1 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Esta subrutina se da hecha. NO LA PODÉIS MODIFICAR. ; Situar el cursor en una fila indicada por la variable (rowScreen) y en ; una columna indicada por la variable (colScreen) de pantalla ; llamando a la función gotoxyP1_C. ; ; Variables globales utilizadas: ; rowScreen: fila de la pantalla donde posicionamos el cursor. ; colScreen: columna de la pantalla donde posicionamos el cursor. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gotoxyP1: push rbp mov rbp, rsp ;guardamos el estado de los registros del procesador porque ;las funciones de C no mantienen el estado de los registros. push rax push rbx push rcx push rdx push rsi push rdi push r8 push r9 push r10 push r11 push r12 push r13 push r14 push r15 call gotoxyP1_C pop r15

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

pop pop pop pop pop pop pop pop pop pop pop pop pop

r14 r13 r12 r11 r10 r9 r8 rdi rsi rdx rcx rbx rax

mov rsp, rbp pop rbp ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Esta subrutina se da hecha. NO LA PODÉIS MODIFICAR. ; Mostrar un carácter guradado en la variable (charac) en pantalla, en ; la posición donde está el cursor llamando a la función printchP1_C. ; ; Variables globales utilizadas: ; charac : carácter que queremos mostrar. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; printchP1: push rbp mov rbp, rsp ;guardamos el estado de los registros del procesador porque ;las funciones de C no mantienen el estado de los registros. push rax push rbx push rcx push rdx push rsi push rdi push r8 push r9 push r10 push r11 push r12 push r13 push r14 push r15 call printchP1_C pop pop pop pop pop pop pop pop pop pop pop pop pop pop

r15 r14 r13 r12 r11 r10 r9 r8 rdi rsi rdx rcx rbx rax

mov rsp, rbp pop rbp ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Esta subrutina se da hecha. NO LA PODÉIS MODIFICAR. ; Leer una tecla y guardar el carácter asociado en la variable (charac) ; sin mostrarlo en pantalla, llamando a la función getchP1_C

147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219

; ; Variables globales utilizadas: ; charac : carácter que queremos mostrar. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; getchP1: push rbp mov rbp, rsp ;guardamos el estado de los registros del procesador porque ;las funciones de C no mantienen el estado de los registros. push rax push rbx push rcx push rdx push rsi push rdi push r8 push r9 push r10 push r11 push r12 push r13 push r14 push r15 call getchP1_C pop pop pop pop pop pop pop pop pop pop pop pop pop pop

r15 r14 r13 r12 r11 r10 r9 r8 rdi rsi rdx rcx rbx rax

mov rsp, rbp pop rbp ret ;;;;; ; Posicionar el cursor en pantalla dentro del tablero, en función del ; índice de la matriz (indexMat), posición del cursor dentro del tablero. ; Para calcular la posición del cursor en pantalla utilizar ; estas fórmulas: ; rowScreen=((indexMat/10)*2)+7 ; colScreen=((indexMat%10)*4)+7 ; Para posicionar el cursor se llama a la subrutina gotoxyP1 ; ; Variables globales utilizadas: ; indexMat : Índice para acceder a las matrices mines y marks desde ensamblador. ; rowScreen: Fila de la pantalla donde posicionamos el cursor. ; colScreen: Columna de la pantalla donde posicionamos el cursor. ;;;;; posCurScreenP1: push rbp mov rbp, rsp push push push push mov mov mov div

rax rdx rdi rsi rdx, 0 rax, QWORD[indexMat] rsi, 10 rsi ;RAX = RDX:RAX / EDI, RDX = RDX:RAX mod EDI

220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292

;RAX=(indexMat/10) RDX=(indexMat/10)

mov rdi, rax shl rdi, 1 add rdi, 7

; (indexMat/10)*2) ; (indexMat/10)*2)+7

mov rsi, rdx shl rsi, 2 add rsi, 7

; ((indexMat%10)*4) ; ((indexMat%10)+7

mov QWORD[rowScreen], rdi mov QWORD[colScreen], rsi call gotoxyP1 posCurScreenP1_End: pop rsi pop rdi pop rdx pop rax mov rsp, rbp pop rbp ret ;;;;; ; Convierte el valor del Número de minas que quedan por marcar (numMines) ; (entre 0 y 99) a dos caracteres ASCII. ; Se tiene que dividir el valor (numMines) entre 10, el cociente ; representará las decenas y el residuo las unidades, y después se ; tienen que convertir a ASCII sumando 48, carácter '0'. ; Mostrar los dígitos (carácter ASCII) de les decenas en la fila 27, ; columna 24 de la pantalla y las unidades en la fila 27, columna 26. ; (la posición se indica através de las variables rowScreen y colScreen). ; Para posicionar el cursor se llama a la subrutina gotoxyP1 y para ; mostrar los caracteres a la subrutina printchP1. ; ; Variables globales utilizadas: ; rowScreen: Fila de la pantalla donde posicionamos el cursor. ; colScreen: Columna de la pantalla donde posicionamos el cursor. ; numMines : Número de minas que quedan por marcar. ; charac : Carácter a escribir en pantalla ;;;;; showMinesP1: push rbp mov rbp, rsp push rax push rbx push rdx mov rax, 0 mov eax, DWORD[numMines] mov edx, 0 ;calcular unidades y decenas mov ebx,10 div ebx ;EAX=EDX:EAX/EBX EDX=EDX:EAX%EBX ;EAX=(numMines/10) EDX=(numMines%10) add al,'0' add dl,'0'

;convertim els valors a caràcters ASCII ;charac = charac + '0';

;Posicionar el cursor i mostrar dígits mov QWORD[rowScreen], 27 ;rowScreen = 27; mov QWORD[colScreen], 24 ;colScreen = 24 call gotoxyP1 mov BYTE[charac], al call printchP1 mov QWORD[colScreen], 26 ;colScreen = 26 call gotoxyP1

293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364

mov BYTE[charac], dl call printchP1 showMinesP1_End: pop rdx pop rbx pop rax mov rsp, rbp pop rbp ret ;;;;; ; Actualizar el contenido del Tablero de Juego con los datos de la ; matriz (marks) y el número de minas que quedan por marcar. ; Se tiene que recorrer toda la matriz (marks), y para cada elemento ; de la matriz posicionar el cursor en pantalla y mostrar los caracteres ; de la matriz. ; Después mostrar el valor de (numMines) en la parte inferior del tablero. ; Para posicionar el cursor se llama la subrutina gotoxyP1, ; para a mostrar los caracteres se llama la subrutina printchP1 y para ; mostrar (numMines) se llama a la subrutina ShowMinesP1. ; ; Variables globales utilizadas: ; rowScreen: Fila de la pantalla donde posicionamos el cursor. ; colScreen: Columna de la pantalla donde posicionamos el cursor. ; charac : Carácter a escribir en pantalla. ; marks : Matriz con las minas marcadas y las minas abiertas. ;;;;; updateBoardP1: push rbp mov rbp, rsp push push push push

rax rbx rcx rdx

mov DWORD[rowScreen], 7 mov rbx, 0 mov rdx, 0

;rowScreen = 7;

updateBoardP1_for1: cmp rbx, DimMatrix jge updateBoardP1_endfor1

;for (i=0;i...


Similar Free PDFs