-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.lst
3917 lines (3917 loc) · 235 KB
/
main.lst
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
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
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
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
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1 %macro mPuts 1 ; Imprime el string %1, hasta encontrar un 0
2 mov rdi, %1
3 sub rsp, 8
4 call puts
5 add rsp, 8
6 %endmacro
7
8 %macro mPrint 2 ; Imprime el string %2 con formato %1
9 mov rdi, %1
10 mov rsi, %2
11 sub rsp, 8
12 call printf
13 add rsp, 8
14 %endmacro
15
16 %macro mGets 1 ; Obtiene un string por teclado, guardándolo en %1
17 mov rdi, %1
18 sub rsp, 8
19 call gets
20 add rsp, 8
21 %endmacro
22
23 %macro mCommand 1 ; Ejecuta el comando %1 de la terminal
24 mov rdi, %1
25 sub rsp, 8
26 call system
27 add rsp, 8
28 %endmacro
29
30 %macro mMov 3 ; Copia %3 bytes del campo de memoria %2 al campo de memoria %1
31 mov rcx, %3
32 lea rsi, [%2]
33 lea rdi, [%1]
34 rep movsb
35 %endmacro
36
37 %macro mCmp 3 ; Compara %3 bytes del campo %1 con %2
38 mov rcx, %3
39 lea rsi, %1
40 lea rdi, %2
41 repe cmpsb
42 %endmacro
43
44 %macro mErrorJump 2 ; Imprime el mensaje de error %1 y salta a la etiqueta %2
45 mPuts %1
46 jmp %2
47 %endmacro
48
49 %macro mfGets 2
50 mov rdi, %1
51 mov rsi, %2
52 mov rdx, [stdin]
53 sub rsp, 8
54 call fgets
55 add rsp, 8
56 %endmacro
57
58 %macro mLeerEntradaEstandar 2
59 mov rax, 0 ; syscall: read
60 mov rdi, 0 ; 0: stdin
61 mov rsi, %1 ; buffer (direccion de guardado de lo leido)
62 mov rdx, %2 ; Cuantos bytes queremos leer
63 syscall
64
65 mov byte[rsi+rax], 0
66 %endmacro
67
68 %macro mSscanf 3
69 lea rdi, %1 ; Variable Original string
70 mov rsi, %2 ; Formato
71 mov rdx, %3 ; Variable a guardar el int
72 sub rsp, 8
73 call sscanf
74 add rsp, 8
75 %endmacro
76
77 %macro mSprintf 3
78 mov rdi, %1 ; Variable donde se guardará el string
79 mov rsi, %2 ; Formato
80 mov rdx, %3 ; Variable a guardar en el string
81 sub rsp, 8
82 call sprintf
83 add rsp, 8
84 %endmacro
85
86 %macro mCalcDesplaz 3
87 mov rdi, %1
88 mov rsi, %2
89 call calcularDesplazamiento
90 mov %3, rax
91 %endmacro
92
93 %macro mEstaVacia 1
94 mov rax, 0
95 mov rdi, %1 ; recibe el desplazamiento
96 call estaVacia
97 %endmacro
98
99 %macro mHaySoldado 1
100 mov rax, 0
101 mov rdi, %1 ; recibe el desplazamiento
102 call haySoldado
103 %endmacro
104
105 %macro mPuedeCapturar 2
106 mov rdi, %1 ; diferencia de desplazamiento
107 mov rsi, %2 ; 0 para sumar [rdi] al desplazamiento, 1 para restar
108 call podiaComerPieza
109 %endmacro
110
111 %macro mOpenFile 2
112 mov rdi, %1 ; nombre del archivo
113 mov rsi, %2 ; modo de apertura
114 sub rsp, 8
115 call fopen
116 add rsp, 8
117 mov qword[idArchGuardado], rax ; Guardamos el ID del archivo
118 %endmacro
119
120 %macro mCloseFile 1
121 mov rdi, [%1] ; ID del archivo
122 sub rsp, 8
123 call fclose
124 add rsp, 8
125 %endmacro
126
127 %macro mReadLine 3
128 mov rdi, %1 ; lugar a dejar lo leido
129 mov rsi, %2 ; cantidad de bytes a leer
130 mov rdx, %3 ; bloques de lectura
131 mov rcx, [idArchGuardado] ; ID del archivo
132 sub rsp, 8
133 call fread
134 add rsp, 8
135 %endmacro
136
137 %macro mWriteLine 3
138 mov rdi, %1 ; string a escribir
139 mov rsi, %2 ; cantidad de bytes a escribir
140 mov rdx, %3 ; bloques de escritura
141 mov rcx, [idArchGuardado] ; ID del archivo
142 sub rsp, 8
143 call fwrite
144 add rsp, 8
145 %endmacro
146
147 ; Importación de funciones de la librería C
148 extern puts, printf
149 extern gets
150 extern system, stdin
151 extern sscanf, sprintf
152 extern fopen, fclose, fread, fwrite, fgets
153
154 section .data
155
156 ; Tableros y sus posibles estados
157
158 00000000 202031323334353637- tableroOrig db " "," ","1","2","3","4","5","6","7"," ",10
158 00000009 200A
159 0000000B 2020202D5F5F5F2D20- db " "," "," ","-","_","_","_","-"," "," ",10
159 00000014 200A
160 00000016 3120207C5858587C20- db "1"," "," ","|","X","X","X","|"," "," ",10
160 0000001F 200A
161 00000021 322D5F7C5858587C5F- db "2","-","_","|","X","X","X","|","_","-",10
161 0000002A 2D0A
162 0000002C 337C58585858585858- db "3","|","X","X","X","X","X","X","X","|",10
162 00000035 7C0A
163 00000037 347C58585858585858- db "4","|","X","X","X","X","X","X","X","|",10
163 00000040 7C0A
164 00000042 357C58582020205858- db "5","|","X","X"," "," "," ","X","X","|",10
164 0000004B 7C0A
165 0000004D 362D2D7C20204F7C2D- db "6","-","-","|"," "," ","O","|","-","-",10
165 00000056 2D0A
166 00000058 3720207C4F20207C20- db "7"," "," ","|","O"," "," ","|"," "," ",10
166 00000061 200A
167 00000063 2020202D2D2D2D2D20- db " "," "," ","-","-","-","-","-"," "," ",10,0
167 0000006C 200A00
168
169 ; Mensajes
170
171 0000006F C2A14269656E76656E- msgBienvenida db "¡Bienvenido al juego El Asalto! ('#' para salir)", 0
171 00000078 69646F20616C206A75-
171 00000081 65676F20456C204173-
171 0000008A 616C746F2120282723-
171 00000093 272070617261207361-
171 0000009C 6C69722900
172
173 000000A1 4F706369C3B36E2069- msgOpcionInvalida db "Opción inválida. Intente de nuevo.", 0
173 000000AA 6E76C3A16C6964612E-
173 000000B3 20496E74656E746520-
173 000000BC 6465206E7565766F2E-
173 000000C5 00
174
175 000000C6 436173696C6C612069- msgCasillaInvalidaSold db "Casilla inválida: no hay un soldado en esa casilla. Intente de nuevo.", 0
175 000000CF 6E76C3A16C6964613A-
175 000000D8 206E6F206861792075-
175 000000E1 6E20736F6C6461646F-
175 000000EA 20656E206573612063-
175 000000F3 6173696C6C612E2049-
175 000000FC 6E74656E7465206465-
175 00000105 206E7565766F2E00
176 0000010D 4572726F7220656E20- msgErrorInputSold db "Error en el formato de entrada del soldado. Intente de nuevo.", 0
176 00000116 656C20666F726D6174-
176 0000011F 6F20646520656E7472-
176 00000128 6164612064656C2073-
176 00000131 6F6C6461646F2E2049-
176 0000013A 6E74656E7465206465-
176 00000143 206E7565766F2E00
177 0000014B 4E6F20736520707565- msgCasillaInvMovSold db "No se puede mover el soldado a esa casilla. Intente de nuevo.", 0
177 00000154 6465206D6F76657220-
177 0000015D 656C20736F6C646164-
177 00000166 6F2061206573612063-
177 0000016F 6173696C6C612E2049-
177 00000178 6E74656E7465206465-
177 00000181 206E7565766F2E00
178
179 00000189 436173696C6C612069- msgCasillaInvalidaOfic db "Casilla inválida: no hay un oficial en esa casilla. Intente de nuevo.", 0
179 00000192 6E76C3A16C6964613A-
179 0000019B 206E6F206861792075-
179 000001A4 6E206F66696369616C-
179 000001AD 20656E206573612063-
179 000001B6 6173696C6C612E2049-
179 000001BF 6E74656E7465206465-
179 000001C8 206E7565766F2E00
180 000001D0 4572726F7220656E20- msgErrorInputOfic db "Error en el formato de entrada del oficial. Intente de nuevo.", 0
180 000001D9 656C20666F726D6174-
180 000001E2 6F20646520656E7472-
180 000001EB 6164612064656C206F-
180 000001F4 66696369616C2E2049-
180 000001FD 6E74656E7465206465-
180 00000206 206E7565766F2E00
181 0000020E 4E6F20736520707565- msgCasillaInvMovOfic db "No se puede mover el oficial a esa casilla. Intente de nuevo.", 0
181 00000217 6465206D6F76657220-
181 00000220 656C206F6669636961-
181 00000229 6C2061206573612063-
181 00000232 6173696C6C612E2049-
181 0000023B 6E74656E7465206465-
181 00000244 206E7565766F2E00
182
183 0000024C 556E206F6669636961- msgCapturaSold db "Un oficial ha capturado a un soldado.", 0
183 00000255 6C2068612063617074-
183 0000025E 757261646F20612075-
183 00000267 6E20736F6C6461646F-
183 00000270 2E00
184 00000272 536520686120726574- msgOficialRetirado db "Se ha retirado a un oficial! No ha capturado a un soldado.", 0
184 0000027B 697261646F20612075-
184 00000284 6E206F66696369616C-
184 0000028D 21204E6F2068612063-
184 00000296 617074757261646F20-
184 0000029F 6120756E20736F6C64-
184 000002A8 61646F2E00
185
186 000002AD C2BF517569C3A96E20- msgQuienInicia db "¿Quién inicia el juego: oficiales o soldados? (o/s): ", 0
186 000002B6 696E6963696120656C-
186 000002BF 206A7565676F3A206F-
186 000002C8 66696369616C657320-
186 000002D1 6F20736F6C6461646F-
186 000002DA 733F20286F2F73293A-
186 000002E3 2000
187
188 000002E5 4573746164C3AD7374- msgEstadisticas db "Estadísticas de los oficiales:", 10, 0
188 000002EE 69636173206465206C-
188 000002F7 6F73206F6669636961-
188 00000300 6C65733A0A00
189
190 00000306 43616E746964616420- msgCantTotalCapturas db "Cantidad total de capturas: %d", 10, 10, 0
190 0000030F 746F74616C20646520-
190 00000318 63617074757261733A-
190 00000321 2025640A0A00
191
192 00000327 4F66696369616C2031- msgOficial1 db "Oficial 1:", 10, 0
192 00000330 3A0A00
193 00000333 4F66696369616C2032- msgOficial2 db "Oficial 2:", 10, 0
193 0000033C 3A0A00
194
195 0000033F 4D6F76696D69656E74- msgCantMovimientos db "Movimientos totales: %d", 10, 0
195 00000348 6F7320746F74616C65-
195 00000351 733A2025640A00
196 00000358 2D2048616369612061- msgCantAdelante db "- Hacia adelante: %d", 10, 0
196 00000361 64656C616E74653A20-
196 0000036A 25640A00
197 0000036E 2D204861636961206C- msgCantDerecha db "- Hacia la derecha: %d", 10, 0
197 00000377 612064657265636861-
197 00000380 3A2025640A00
198 00000386 2D204861636961206C- msgCantIzquierda db "- Hacia la izquierda: %d", 10, 0
198 0000038F 6120697A7175696572-
198 00000398 64613A2025640A00
199 000003A0 2D2048616369612061- msgCantAtras db "- Hacia atrás: %d", 10, 0
199 000003A9 7472C3A1733A202564-
199 000003B2 0A00
200 000003B4 2D20456E2064696167- msgCantDiagonal db "- En diagonal: %d", 10, 0
200 000003BD 6F6E616C3A2025640A-
200 000003C6 00
201 000003C7 2D2D2D204164656C61- msgCantDiagArribaDer db "--- Adelante-derecha: %d", 10, 0
201 000003D0 6E74652D6465726563-
201 000003D9 68613A2025640A00
202 000003E1 2D2D2D204164656C61- msgCantDiagArribaIzq db "--- Adelante-izquierda: %d", 10, 0
202 000003EA 6E74652D697A717569-
202 000003F3 657264613A2025640A-
202 000003FC 00
203 000003FD 2D2D2D20417472C3A1- msgCantDiagAbajoDer db "--- Atrás-derecha: %d", 10, 0
203 00000406 732D64657265636861-
203 0000040F 3A2025640A00
204 00000415 2D2D2D20417472C3A1- msgCantDiagAbajoIzq db "--- Atrás-izquierda: %d", 10, 0
204 0000041E 732D697A7175696572-
204 00000427 64613A2025640A00
205
206 0000042F 43616E746964616420- msgCantSoldadosCapt db "Cantidad de soldados capturados: %d", 10, 10, 0
206 00000438 646520736F6C646164-
206 00000441 6F7320636170747572-
206 0000044A 61646F733A2025640A-
206 00000453 0A00
207
208 00000455 C2A1456C206A756567- msgJuegoTerminado db "¡El juego ha terminado!", 10, 0
208 0000045E 6F206861207465726D-
208 00000467 696E61646F210A00
209 0000046F C2A1456C2067616E61- msgGanador db "¡El ganador es el equipo de los %s!", 10, 0
209 00000478 646F7220657320656C-
209 00000481 2065717569706F2064-
209 0000048A 65206C6F7320257321-
209 00000493 0A00
210 00000495 736F6C6461646F7300 stringSoldados db "soldados", 0
211 0000049E 6F66696369616C6573- stringOficiales db "oficiales", 0
211 000004A7 00
212
213 000004A8 52617AC3B36E3A2025- msgRazonGanador db "Razón: %s", 10, 0
213 000004B1 730A00
214
215 000004B4 2D2D2D2D00 varRazonFin db '----', 0 ; Razón de fin de juego (a llenar)
216
217 ; Se ha decidido salir de la partida
218 000004B9 536520686120646563- msgSalidaPartida db "Se ha decidido salir de la partida. ¿Desea guardarla? (s/n)", 0
218 000004C2 696469646F2073616C-
218 000004CB 6972206465206C6120-
218 000004D4 706172746964612E20-
218 000004DD C2BF44657365612067-
218 000004E6 7561726461726C613F-
218 000004EF 2028732F6E2900
219 000004F6 4E4F54413A20536920- msgAclaracionSalida db "NOTA: Si decide no guardar la partida, se perderá todo el progreso. En cambio, si decide guardarla y tenía una partida guardada, se sobreescribirá.", 0
219 000004FF 646563696465206E6F-
219 00000508 206775617264617220-
219 00000511 6C6120706172746964-
219 0000051A 612C20736520706572-
219 00000523 646572C3A120746F64-
219 0000052C 6F20656C2070726F67-
219 00000535 7265736F2E20456E20-
219 0000053E 63616D62696F2C2073-
219 00000547 692064656369646520-
219 00000550 677561726461726C61-
219 00000559 20792074656EC3AD61-
219 00000562 20756E612070617274-
219 0000056B 696461206775617264-
219 00000574 6164612C2073652073-
219 0000057D 6F6272656573637269-
219 00000586 626972C3A12E00
220 0000058D 6E00 guardadoPartida db 'n', 0 ; guardar (s), no guardar (n)
221
222 0000058F 6E00 yaHabiaGuardado db 'n', 0 ; ya había guardado (s), no había guardado (n)
223
224 00000591 7300 turnoDe db 's', 0 ; soldados (s), oficiales (o)
225
226 00000593 C2A150617274696461- msgPartidaGuardada db "¡Partida guardada con éxito!", 0
226 0000059C 206775617264616461-
226 000005A5 20636F6E20C3A97869-
226 000005AE 746F2100
227
228 000005B2 4572726F7220616C20- msgErrorOpenFile db "Error al abrir el archivo.", 0
228 000005BB 616272697220656C20-
228 000005C4 6172636869766F2E00
229
230 ; Razones de victoria de soldados
231 000005CD 6C6F7320736F6C6461- msgSoldadosFortaleza db "los soldados han ocupado todos las casillas de la fortaleza.", 0
231 000005D6 646F732068616E206F-
231 000005DF 63757061646F20746F-
231 000005E8 646F73206C61732063-
231 000005F1 6173696C6C61732064-
231 000005FA 65206C6120666F7274-
231 00000603 616C657A612E00
232 0000060A 6C6F7320736F6C6461- msgSoldadosRodean db "los soldados han rodeado a los oficiales.", 0
232 00000613 646F732068616E2072-
232 0000061C 6F646561646F206120-
232 00000625 6C6F73206F66696369-
232 0000062E 616C65732E00
233 00000634 616D626F73206F6669- msgSoldadosInvalidar db "ambos oficiales han sido invalidados.", 0
233 0000063D 6369616C6573206861-
233 00000646 6E207369646F20696E-
233 0000064F 76616C696461646F73-
233 00000658 2E00
234
235 ; Razones de victoria de oficiales
236 0000065A 6E6F2071756564616E- msgOficialesGanan db "no quedan suficientes soldados para ocupar la fortaleza.", 0
236 00000663 20737566696369656E-
236 0000066C 74657320736F6C6461-
236 00000675 646F73207061726120-
236 0000067E 6F6375706172206C61-
236 00000687 20666F7274616C657A-
236 00000690 612E00
237
238 ; Turnos
239 00000693 4573207475726E6F20- msgTurnoSoldados db "Es turno de los soldados. Decida a qué soldado desea mover: (<numFila>-<numColumna>)", 0
239 0000069C 6465206C6F7320736F-
239 000006A5 6C6461646F732E2044-
239 000006AE 656369646120612071-
239 000006B7 75C3A920736F6C6461-
239 000006C0 646F20646573656120-
239 000006C9 6D6F7665723A20283C-
239 000006D2 6E756D46696C613E2D-
239 000006DB 3C6E756D436F6C756D-
239 000006E4 6E613E2900
240 000006E9 4573207475726E6F20- msgTurnoOficiales db "Es turno de los oficiales. Decida a qué oficial desea mover: (<numFila>-<numColumna>)", 0
240 000006F2 6465206C6F73206F66-
240 000006FB 696369616C65732E20-
240 00000704 446563696461206120-
240 0000070D 7175C3A9206F666963-
240 00000716 69616C206465736561-
240 0000071F 206D6F7665723A2028-
240 00000728 3C6E756D46696C613E-
240 00000731 2D3C6E756D436F6C75-
240 0000073A 6D6E613E2900
241 00000740 C2BF41207175C3A920- msgTurnoMovSold db "¿A qué casilla desea mover el soldado? (<numFila>-<numColumna>)", 0
241 00000749 636173696C6C612064-
241 00000752 65736561206D6F7665-
241 0000075B 7220656C20736F6C64-
241 00000764 61646F3F20283C6E75-
241 0000076D 6D46696C613E2D3C6E-
241 00000776 756D436F6C756D6E61-
241 0000077F 3E2900
242 00000782 C2BF41207175C3A920- msgTurnoMovOfic db "¿A qué casilla desea mover el oficial? (<numFila>-<numColumna>)", 0
242 0000078B 636173696C6C612064-
242 00000794 65736561206D6F7665-
242 0000079D 7220656C206F666963-
242 000007A6 69616C3F20283C6E75-
242 000007AF 6D46696C613E2D3C6E-
242 000007B8 756D436F6C756D6E61-
242 000007C1 3E2900
243
244 ; Contadores
245
246 000007C4 0000000000000000 movimientosOfic1 dq 0
247 000007CC 0000000000000000 movimientosOfic2 dq 0
248
249 000007D4 0000000000000000 movOfic1Adelante dq 0
250 000007DC 0000000000000000 movOfic1Derecha dq 0
251 000007E4 0000000000000000 movOfic1Izquierda dq 0
252 000007EC 0000000000000000 movOfic1Atras dq 0
253 000007F4 0000000000000000 movOfic1Diagonal dq 0
254 000007FC 0000000000000000 movOfic1DiagArribaDer dq 0
255 00000804 0000000000000000 movOfic1DiagArribaIzq dq 0
256 0000080C 0000000000000000 movOfic1DiagAbajoDer dq 0
257 00000814 0000000000000000 movOfic1DiagAbajoIzq dq 0
258
259 0000081C 0000000000000000 movOfic2Adelante dq 0
260 00000824 0000000000000000 movOfic2Derecha dq 0
261 0000082C 0000000000000000 movOfic2Izquierda dq 0
262 00000834 0000000000000000 movOfic2Atras dq 0
263 0000083C 0000000000000000 movOfic2Diagonal dq 0
264 00000844 0000000000000000 movOfic2DiagArribaDer dq 0
265 0000084C 0000000000000000 movOfic2DiagArribaIzq dq 0
266 00000854 0000000000000000 movOfic2DiagAbajoDer dq 0
267 0000085C 0000000000000000 movOfic2DiagAbajoIzq dq 0
268
269 00000864 0000000000000000 cantSoldCapturados dq 0 ; Cuando haya 16 soldados capturados, los oficiales ganan
270 0000086C 0000000000000000 cantOficInvalidados dq 0 ; Cuando haya 2 oficiales invalidados, los soldados ganan
271
272 00000874 070000000000000003- casillaOfic1 dq 7,3
272 0000087D 00000000000000
273 00000884 060000000000000005- casillaOfic2 dq 6,5
273 0000088D 00000000000000
274
275 00000894 0000000000000000 cantCapturasOfic1 dq 0
276 0000089C 0000000000000000 cantCapturasOfic2 dq 0
277
278 000008A4 4F00 simboloOficiales db 'O', 0
279 000008A6 5800 simboloSoldados db 'X', 0
280
281 000008A8 04 orientacionTablero db 4 ; 4 -> no rotar (default)
282 000008A9 73 piezaDeInicio db 's' ; soldados (s), oficiales (o)
283
284 ; Comandos
285 000008AA 636C65617200 cmdLimpiarPantalla db "clear", 0
286 000008B0 746F75636820706172- cmdCrearArchivoPartida db "touch partidaGuardada.dat", 0
286 000008B9 746964614775617264-
286 000008C2 6164612E64617400
287 000008CA 726D20706172746964- cmdBorrarArchivoPartida db "rm partidaGuardada.dat", 0
287 000008D3 614775617264616461-
287 000008DC 2E64617400
288 000008E1 6563686F202D6E203E- cmdLimpiarArchivo db "echo -n > partidaGuardada.dat", 0
288 000008EA 207061727469646147-
288 000008F3 756172646164612E64-
288 000008FC 617400
289
290 ; Formatos
291 000008FF 257500 formatoAtoi db "%u", 0
292 00000902 257300 formatoItoa db "%s", 0
293
294 ; Modos de apertura de archivos
295 00000905 726200 modoLectura db "rb", 0
296 00000908 776200 modoEscritura db "wb", 0
297 0000090B 616200 modoAppend db "ab", 0
298
299 0000090E 706172746964614775- nombreArchivo db "partidaGuardada.dat", 0
299 00000917 6172646164612E6461-
299 00000920 7400
300
301 section .bss
302
303 00000000 ???????? piezaIniElegida resd 1 ; Variable pivote para la pieza que inicia
304
305 00000004 <res 74h> tableroEnJuego resb 116 ; Tablero en juego
306
307 00000078 ???????? soldadoElegido resb 4 ; Fila y columna del soldado a mover
308 0000007C ???????? casillaMovSold resb 4 ; Fila y columna de la casilla de destino del soldado
309
310 00000080 ???????? oficialElegido resb 4 ; Fila y columna del oficial a mover
311 00000084 ???????? casillaMovOfic resb 4 ; Fila y columna de la casilla de destino del oficial
312
313 00000088 ???????????????? fila resq 1
314 00000090 ???????????????? columna resq 1
315 00000098 ???????????????? desplazCasOrig resq 1
316
317 000000A0 ???????????????? filaAMover resq 1
318 000000A8 ???????????????? columnaAMover resq 1
319 000000B0 ???????????????? desplazCasAMover resq 1
320
321 000000B8 ???????????????? filaAux resq 1
322 000000C0 ???????????????? columnaAux resq 1
323 000000C8 ???????????????? desplazAux resq 1
324 000000D0 ???????????????? desplazAux2 resq 1
325
326 000000D8 ???????????????? idArchGuardado resq 1 ; ID del archivo de la partida guardada
327
328 000000E0 <res 47h> msgErrorEspecificoSold resb 71 ; Máximo largo de mensaje de error para soldados
329 00000127 <res 47h> msgErrorEspecificoOfic resb 71 ; Máximo largo de mensaje de error para oficiales
330
331 0000016E <res 47h> msgErrorEspecificoSoldMov resb 71 ; Máximo largo de mensaje de error para movimientos de soldados
332 000001B5 <res 47h> msgErrorEspecificoOficMov resb 71 ; Máximo largo de mensaje de error para movimientos de oficiales
333
334 000001FC <res 26h> msgCapturaSoldado resb 38 ; Si se capturó un soldado
335 00000222 <res 3Bh> msgOficialRet resb 59 ; Si se retiró un oficial
336
337 section .text
338 global main
339
340 main:
341 ; Vemos si hay una partida guardada
342 mOpenFile nombreArchivo, modoLectura
112 00000000 48BF- <1> mov rdi, %1
112 00000002 [0E09000000000000] <1>
113 0000000A 48BE- <1> mov rsi, %2
113 0000000C [0509000000000000] <1>
114 00000014 4883EC08 <1> sub rsp, 8
115 00000018 E8(00000000) <1> call fopen
116 0000001D 4883C408 <1> add rsp, 8
117 00000021 48890425[D8000000] <1> mov qword[idArchGuardado], rax
343 00000029 4883F800 cmp rax, 0
344 0000002D 7F02 jg partidaGuardada
345 0000002F EB18 jmp bienvenida
346
347 partidaGuardada:
348 00000031 E866290000 call abrirPartidaGuardada
349 00000036 803C25[91050000]73 cmp byte[turnoDe], 's'
350 0000003E 0F84D8000000 je loopMovimientos
351 00000044 E94D020000 jmp turnoOficiales
352
353 bienvenida:
354 mPuts msgBienvenida
2 00000049 48BF- <1> mov rdi, %1
2 0000004B [6F00000000000000] <1>
3 00000053 4883EC08 <1> sub rsp, 8
4 00000057 E8(00000000) <1> call puts
5 0000005C 4883C408 <1> add rsp, 8
355
356 ; Se debe elegir quién inicia la partida
357 personalizarQuienInicia:
358 00000060 C70425[00000000]00- mov dword[piezaIniElegida], '' ; vaciar variable
358 00000068 000000
359 mPuts msgQuienInicia
2 0000006B 48BF- <1> mov rdi, %1
2 0000006D [AD02000000000000] <1>
3 00000075 4883EC08 <1> sub rsp, 8
4 00000079 E8(00000000) <1> call puts
5 0000007E 4883C408 <1> add rsp, 8
360 mGets piezaIniElegida
17 00000082 48BF- <1> mov rdi, %1
17 00000084 [0000000000000000] <1>
18 0000008C 4883EC08 <1> sub rsp, 8
19 00000090 E8(00000000) <1> call gets
20 00000095 4883C408 <1> add rsp, 8
361
362 00000099 833C25[00000000]23 cmp dword[piezaIniElegida], '#'
363 000000A1 0F84B8220000 je salirSinGuardar
364
365 000000A7 833C25[00000000]6F cmp dword[piezaIniElegida], 'o'
366 000000AF 7423 je setearPiezaInicio
367 000000B1 833C25[00000000]73 cmp dword[piezaIniElegida], 's'
368 000000B9 7419 je setearPiezaInicio
369
370 mErrorJump msgOpcionInvalida, personalizarQuienInicia
45 <1> mPuts %1
2 000000BB 48BF- <2> mov rdi, %1
2 000000BD [A100000000000000] <2>
3 000000C5 4883EC08 <2> sub rsp, 8
4 000000C9 E8(00000000) <2> call puts
5 000000CE 4883C408 <2> add rsp, 8
46 000000D2 EB8C <1> jmp %2
371
372 setearPiezaInicio:
373 mMov piezaDeInicio, piezaIniElegida, 1
31 000000D4 B901000000 <1> mov rcx, %3
32 000000D9 488D3425[00000000] <1> lea rsi, [%2]
33 000000E1 488D3C25[A9080000] <1> lea rdi, [%1]
34 000000E9 F3A4 <1> rep movsb
374 000000EB EB00 jmp comenzarPorInicio
375
376 ; --------------------------------------------------------------------------------------------
377 ; RUTINA PARA COMENZAR EL JUEGO -> Se comienza desde el jugador elegido (o el default)
378 ; --------------------------------------------------------------------------------------------
379
380 comenzarPorInicio:
381 mMov tableroEnJuego, tableroOrig, 116
31 000000ED B974000000 <1> mov rcx, %3
32 000000F2 488D3425[00000000] <1> lea rsi, [%2]
33 000000FA 488D3C25[04000000] <1> lea rdi, [%1]
34 00000102 F3A4 <1> rep movsb
382
383 00000104 803C25[A9080000]73 cmp byte[piezaDeInicio], 's'
384 0000010C 740E je loopMovimientos
385 0000010E 803C25[A9080000]6F cmp byte[piezaDeInicio], 'o'
386 00000116 0F847A010000 je turnoOficiales
387
388
389 ; COMIENZA EL JUEGO
390 loopMovimientos:; mostrarTablero, mostrarTurno, realizarMovimiento, verificarFinJuego
391 ; Limpiamos los mensajes de error
392 0000011C C60425[E0000000]00 mov byte[msgErrorEspecificoSold], 0
393 00000124 C60425[6E010000]00 mov byte[msgErrorEspecificoSoldMov], 0
394 0000012C C60425[27010000]00 mov byte[msgErrorEspecificoOfic], 0
395 00000134 C60425[B5010000]00 mov byte[msgErrorEspecificoOficMov], 0
396 0000013C C60425[FC010000]00 mov byte[msgCapturaSoldado], 0
397 00000144 C60425[22020000]00 mov byte[msgOficialRet], 0
398
399 turnoSoldados:
400 0000014C C60425[91050000]73 mov byte[turnoDe], 's'
401 00000154 C60425[78000000]30 mov byte [soldadoElegido], '0'
402
403 mCommand cmdLimpiarPantalla ; Limpia la pantalla para mostrar el tablero
24 0000015C 48BF- <1> mov rdi, %1
24 0000015E [AA08000000000000] <1>
25 00000166 4883EC08 <1> sub rsp, 8
26 0000016A E8(00000000) <1> call system
27 0000016F 4883C408 <1> add rsp, 8
404
405 mPuts tableroEnJuego ; Muestro el tablero
2 00000173 48BF- <1> mov rdi, %1
2 00000175 [0400000000000000] <1>
3 0000017D 4883EC08 <1> sub rsp, 8
4 00000181 E8(00000000) <1> call puts
5 00000186 4883C408 <1> add rsp, 8
406
407 0000018A 803C25[E0000000]00 cmp byte[msgErrorEspecificoSold], 0
408 00000192 0F8579030000 jne imprimirErrorSold
409
410 00000198 803C25[6E010000]00 cmp byte[msgErrorEspecificoSoldMov], 0
411 000001A0 0F853C070000 jne imprimirErrorSoldMov
412
413 000001A6 803C25[B5010000]00 cmp byte[msgErrorEspecificoOficMov], 0
414 000001AE 0F85E60B0000 jne imprimirOficInvalidado
415
416 000001B4 803C25[22020000]00 cmp byte[msgOficialRet], 0
417 000001BC 0F85F40B0000 jne imprimirOficRetirado
418
419 000001C2 803C25[FC010000]00 cmp byte[msgCapturaSoldado], 0
420 000001CA 0F850C100000 jne imprimirCapturaSoldado
421
422 todoOkSold:
423 ; Limpiamos los mensajes de error
424 000001D0 C60425[E0000000]00 mov byte[msgErrorEspecificoSold], 0
425 000001D8 C60425[6E010000]00 mov byte[msgErrorEspecificoSoldMov], 0
426 000001E0 C60425[B5010000]00 mov byte[msgErrorEspecificoOficMov], 0
427 000001E8 C60425[FC010000]00 mov byte[msgCapturaSoldado], 0
428 000001F0 C60425[22020000]00 mov byte[msgOficialRet], 0
429
430 mPuts msgTurnoSoldados ; Muestra el mensaje de seleccionar ficha a mover
2 000001F8 48BF- <1> mov rdi, %1
2 000001FA [9306000000000000] <1>
3 00000202 4883EC08 <1> sub rsp, 8
4 00000206 E8(00000000) <1> call puts
5 0000020B 4883C408 <1> add rsp, 8
431 mGets soldadoElegido ; Obtiene la ficha a mover
17 0000020F 48BF- <1> mov rdi, %1
17 00000211 [7800000000000000] <1>
18 00000219 4883EC08 <1> sub rsp, 8
19 0000021D E8(00000000) <1> call gets
20 00000222 4883C408 <1> add rsp, 8
432
433 00000226 803C25[78000000]23 cmp byte[soldadoElegido], '#'
434 0000022E 0F8431210000 je salirDelJuego
435
436 00000234 E97C010000 jmp verificarFichaSold ; Verifica si la ficha elegida es valida
437
438 casillaAMoverseSold:
439
440 mPuts msgTurnoMovSold ; Muestra el mensaje de seleccionar casilla a mover
2 00000239 48BF- <1> mov rdi, %1
2 0000023B [4007000000000000] <1>
3 00000243 4883EC08 <1> sub rsp, 8
4 00000247 E8(00000000) <1> call puts
5 0000024C 4883C408 <1> add rsp, 8
441 mGets casillaMovSold ; Obtiene la casilla a mover
17 00000250 48BF- <1> mov rdi, %1
17 00000252 [7C00000000000000] <1>
18 0000025A 4883EC08 <1> sub rsp, 8
19 0000025E E8(00000000) <1> call gets
20 00000263 4883C408 <1> add rsp, 8
442
443 00000267 803C25[7C000000]23 cmp byte[casillaMovSold], '#'
444 0000026F 0F84F0200000 je salirDelJuego
445
446 00000275 E931040000 jmp verificarMovimientoSold ; Verifica si el movimiento es valido
447
448 moverSoldado:
449 0000027A E8B70A0000 call realizarMovimientoSold ; Realiza el movimiento
450
451 0000027F E8D1160000 call verificarFinJuegoSoldados ; Verificar fin de juego por algún movimiento de soldado
452 00000284 4883F800 cmp rax, 0
453 00000288 0F84291C0000 je finDeJuego
454
455 0000028E C60425[27010000]00 mov byte[msgErrorEspecificoOfic], 0
456 turnoOficiales:
457 00000296 C60425[91050000]6F mov byte[turnoDe], 'o'
458 0000029E C60425[80000000]30 mov byte[oficialElegido], '0'
459
460 mCommand cmdLimpiarPantalla ; Limpia la pantalla para mostrar el tablero
24 000002A6 48BF- <1> mov rdi, %1
24 000002A8 [AA08000000000000] <1>
25 000002B0 4883EC08 <1> sub rsp, 8
26 000002B4 E8(00000000) <1> call system
27 000002B9 4883C408 <1> add rsp, 8
461
462 mPuts tableroEnJuego ; Muestra el tablero
2 000002BD 48BF- <1> mov rdi, %1
2 000002BF [0400000000000000] <1>
3 000002C7 4883EC08 <1> sub rsp, 8
4 000002CB E8(00000000) <1> call puts
5 000002D0 4883C408 <1> add rsp, 8
463
464 000002D4 803C25[27010000]00 cmp byte[msgErrorEspecificoOfic], 0
465 000002DC 0F85AD030000 jne imprimirErrorOfic
466
467 000002E2 803C25[B5010000]00 cmp byte[msgErrorEspecificoOficMov], 0
468 000002EA 0F85AA0A0000 jne imprimirOficInvalidado
469
470 todoOkOfic:
471 ; Limpiamos los mensajes de error
472 000002F0 C60425[27010000]00 mov byte[msgErrorEspecificoOfic], 0
473 000002F8 C60425[B5010000]00 mov byte[msgErrorEspecificoOficMov], 0
474
475 mPuts msgTurnoOficiales ; Muestra el mensaje de seleccionar ficha a mover
2 00000300 48BF- <1> mov rdi, %1
2 00000302 [E906000000000000] <1>
3 0000030A 4883EC08 <1> sub rsp, 8
4 0000030E E8(00000000) <1> call puts
5 00000313 4883C408 <1> add rsp, 8
476 mGets oficialElegido ; Obtiene la ficha a mover
17 00000317 48BF- <1> mov rdi, %1
17 00000319 [8000000000000000] <1>
18 00000321 4883EC08 <1> sub rsp, 8
19 00000325 E8(00000000) <1> call gets
20 0000032A 4883C408 <1> add rsp, 8
477
478 0000032E 803C25[80000000]23 cmp byte[oficialElegido], '#'
479 00000336 0F8429200000 je salirDelJuego
480
481 0000033C E9EC010000 jmp verificarFichaOfic ; Verifica si la ficha elegida es valida
482
483 casillaAMoverseOfic:
484
485 mPuts msgTurnoMovOfic ; Muestra el mensaje de seleccionar casilla a mover
2 00000341 48BF- <1> mov rdi, %1
2 00000343 [8207000000000000] <1>
3 0000034B 4883EC08 <1> sub rsp, 8
4 0000034F E8(00000000) <1> call puts
5 00000354 4883C408 <1> add rsp, 8
486 mGets casillaMovOfic ; Obtiene la casilla a mover
17 00000358 48BF- <1> mov rdi, %1
17 0000035A [8400000000000000] <1>
18 00000362 4883EC08 <1> sub rsp, 8
19 00000366 E8(00000000) <1> call gets
20 0000036B 4883C408 <1> add rsp, 8
487
488 0000036F 803C25[84000000]23 cmp byte[casillaMovOfic], '#'
489 00000377 0F84E81F0000 je salirDelJuego
490
491 0000037D E9C3060000 jmp verificarMovimientoOfic ; Verifica si el movimiento es valido
492
493 moverOficial:
494 00000382 E8DD090000 call realizarMovimientoOfic ; Realiza el movimiento
495 ; Verificar fin de juego por algún movimiento de oficial
496 00000387 E88F150000 call verificarFinJuegoOficiales
497 0000038C 4883F800 cmp rax, 0
498 00000390 0F84211B0000 je finDeJuego
499
500 00000396 E9B1FDFFFF jmp turnoSoldados
501
502 capturar:
503 0000039B E8CC0D0000 call capturarSoldado ; Captura soldado
504 ; Verificar fin de juego por captura de soldado
505 000003A0 E876150000 call verificarFinJuegoOficiales
506 000003A5 4883F800 cmp rax, 0
507 000003A9 0F84081B0000 je finDeJuego
508
509 ; Repetir en loop
510 000003AF E998FDFFFF jmp turnoSoldados
511
512 000003B4 C3 ret
513
514 ; --------------------------------------------------------------------------------------------
515 ; VERIFICACIONES DE PIEZAS ORIGINALES A MOVER PARA SOLDADOS Y OFICIALES
516 ; --------------------------------------------------------------------------------------------
517
518 verificarFichaSold:
519 000003B5 8A0425[78000000] mov al, byte[soldadoElegido] ; Numero de fila
520
521 ; Compromabos que el caracter ingresado sea un número entre 1 y 7
522 000003BC 3C31 cmp al, '1'
523 000003BE 0F8C05010000 jl errorInputSold
524 000003C4 3C37 cmp al, '7'
525 000003C6 0F8FFD000000 jg errorInputSold
526
527 ; Parseamos el número de fila de string a int
528 000003CC 48C70425[88000000]- mov qword[fila], 0
528 000003D4 00000000
529 mSscanf byte[soldadoElegido], formatoAtoi, fila
69 000003D8 488D3C25[78000000] <1> lea rdi, %1
70 000003E0 48BE- <1> mov rsi, %2
70 000003E2 [FF08000000000000] <1>
71 000003EA 48BA- <1> mov rdx, %3
71 000003EC [8800000000000000] <1>
72 000003F4 4883EC08 <1> sub rsp, 8
73 000003F8 E8(00000000) <1> call sscanf
74 000003FD 4883C408 <1> add rsp, 8
530 00000401 4883F801 cmp rax, 1
531 00000405 0F8CBE000000 jl errorInputSold
532
533 ; Comprobamos que el caracter siguiente sea un guión para que cumpla con el formato establecido
534 0000040B 8A0425[79000000] mov al, byte[soldadoElegido+1] ; Caracter '-'
535 00000412 3C2D cmp al, '-'
536 00000414 0F85AF000000 jne errorInputSold
537
538 ; Comprobamos que el número de columna sea un número entre 1 y 7
539 0000041A 8A0425[7A000000] mov al, byte[soldadoElegido+2] ; Numero de columna
540 00000421 3C31 cmp al, '1'
541 00000423 0F8CA0000000 jl errorInputSold
542 00000429 3C37 cmp al, '7'
543 0000042B 0F8F98000000 jg errorInputSold
544
545 ; Parseamos el número de columna de string a int
546 00000431 48C70425[90000000]- mov qword[columna], 0
546 00000439 00000000
547 mSscanf byte[soldadoElegido+2], formatoAtoi, columna
69 0000043D 488D3C25[7A000000] <1> lea rdi, %1
70 00000445 48BE- <1> mov rsi, %2
70 00000447 [FF08000000000000] <1>
71 0000044F 48BA- <1> mov rdx, %3
71 00000451 [9000000000000000] <1>
72 00000459 4883EC08 <1> sub rsp, 8
73 0000045D E8(00000000) <1> call sscanf
74 00000462 4883C408 <1> add rsp, 8
548 00000466 4883F801 cmp rax, 1
549 0000046A 7C5D jl errorInputSold
550
551 ; El ultimo caracter del string ingresado debe ser un caracter nulo
552 0000046C 8A0425[7B000000] mov al, byte[soldadoElegido+3] ; Caracter nulo
553 00000473 3C00 cmp al, 0
554 00000475 7552 jne errorInputSold
555
556 ; Calculamos desplazamiento en el tablero
557 ; mCalcDesplaz calcula el desplazamiento en el tablero en base a la fila y columna y lo almacena en desplazCasOrig usando una formula
558 mCalcDesplaz [fila], [columna], qword[desplazCasOrig]
87 00000477 488B3C25[88000000] <1> mov rdi, %1
88 0000047F 488B3425[90000000] <1> mov rsi, %2
89 00000487 E894080000 <1> call calcularDesplazamiento
90 0000048C 48890425[98000000] <1> mov %3, rax
559 00000494 488B1C25[98000000] mov rbx, qword[desplazCasOrig]
560
561 ; Limpio los registros
562 0000049C B800000000 mov rax,0
563 000004A1 BA00000000 mov rdx, 0
564
565 ; Cargo en dl el caracter de la casilla en el tablero y en al el simbolo de los soldados
566 000004A6 8A93[04000000] mov dl, byte[tableroEnJuego+rbx]
567 000004AC 8A0425[A6080000] mov al, [simboloSoldados]
568
569 ; Comparo los caracteres, deben ser iguales para que el movimiento no sea invalido
570 000004B3 38C2 cmp dl, al
571 000004B5 7536 jne errorCasillaInvalidaSold
572
573 ; Si no hubo errores, limpio el mensaje de error y sigo con la ejecucion
574 000004B7 B800000000 mov rax, 0
575 000004BC 48890425[E0000000] mov [msgErrorEspecificoSold], rax
576 000004C4 E970FDFFFF jmp casillaAMoverseSold
577
578 ; Errores
579 errorInputSold:
580 000004C9 488B0425[0D010000] mov rax, [msgErrorInputSold]
581 mMov msgErrorEspecificoSold, msgErrorInputSold, 62
31 000004D1 B93E000000 <1> mov rcx, %3
32 000004D6 488D3425[0D010000] <1> lea rsi, [%2]
33 000004DE 488D3C25[E0000000] <1> lea rdi, [%1]
34 000004E6 F3A4 <1> rep movsb
582 000004E8 E95FFCFFFF jmp turnoSoldados
583
584 errorCasillaInvalidaSold:
585 000004ED 488B0425[C6000000] mov rax, [msgCasillaInvalidaSold]
586 mMov msgErrorEspecificoSold, msgCasillaInvalidaSold, 71
31 000004F5 B947000000 <1> mov rcx, %3
32 000004FA 488D3425[C6000000] <1> lea rsi, [%2]
33 00000502 488D3C25[E0000000] <1> lea rdi, [%1]
34 0000050A F3A4 <1> rep movsb
587 0000050C E93BFCFFFF jmp turnoSoldados
588
589 imprimirErrorSold:
590 mPuts msgErrorEspecificoSold
2 00000511 48BF- <1> mov rdi, %1
2 00000513 [E000000000000000] <1>
3 0000051B 4883EC08 <1> sub rsp, 8
4 0000051F E8(00000000) <1> call puts
5 00000524 4883C408 <1> add rsp, 8
591 00000528 E9A3FCFFFF jmp todoOkSold
592
593
594 verificarFichaOfic:
595 0000052D 8A0C25[80000000] mov cl, byte[oficialElegido] ; Numero de fila
596
597 ; Compromabos que el caracter ingresado para la fila sea un número entre 1 y 7
598 00000534 80F931 cmp cl, '1'
599 00000537 0F8C0A010000 jl errorInputOfic
600 0000053D 80F937 cmp cl, '7'
601 00000540 0F8F01010000 jg errorInputOfic
602
603 ; Parseamos el número de fila de string a int
604 00000546 48C70425[88000000]- mov qword[fila], 0
604 0000054E 00000000
605 mSscanf byte[oficialElegido], formatoAtoi, fila
69 00000552 488D3C25[80000000] <1> lea rdi, %1
70 0000055A 48BE- <1> mov rsi, %2
70 0000055C [FF08000000000000] <1>
71 00000564 48BA- <1> mov rdx, %3
71 00000566 [8800000000000000] <1>
72 0000056E 4883EC08 <1> sub rsp, 8
73 00000572 E8(00000000) <1> call sscanf
74 00000577 4883C408 <1> add rsp, 8
606 0000057B 4883F801 cmp rax, 1
607 0000057F 0F8CC2000000 jl errorInputOfic
608
609 ; Comprobamos que el caracter siguiente sea un guión para que cumpla con el formato establecido
610 00000585 8A0C25[81000000] mov cl, byte[oficialElegido+1] ; Caracter '-'
611 0000058C 80F92D cmp cl, '-'
612 0000058F 0F85B2000000 jne errorInputOfic
613
614 ; Comprobamos que el número de columna sea un número entre 1 y 7
615 00000595 8A0C25[82000000] mov cl, byte[oficialElegido+2] ; Numero de columna
616 0000059C 80F931 cmp cl, '1'
617 0000059F 0F8CA2000000 jl errorInputOfic
618 000005A5 80F937 cmp cl, '7'
619 000005A8 0F8F99000000 jg errorInputOfic
620
621 ; Parseamos el número de columna de string a int
622 000005AE 48C70425[90000000]- mov qword[columna], 0
622 000005B6 00000000
623 mSscanf byte[oficialElegido+2], formatoAtoi, columna
69 000005BA 488D3C25[82000000] <1> lea rdi, %1
70 000005C2 48BE- <1> mov rsi, %2
70 000005C4 [FF08000000000000] <1>
71 000005CC 48BA- <1> mov rdx, %3
71 000005CE [9000000000000000] <1>
72 000005D6 4883EC08 <1> sub rsp, 8
73 000005DA E8(00000000) <1> call sscanf
74 000005DF 4883C408 <1> add rsp, 8
624 000005E3 4883F801 cmp rax, 1
625 000005E7 7C5E jl errorInputOfic
626
627 ; El ultimo caracter del string ingresado debe ser un caracter nulo
628 000005E9 8A0C25[83000000] mov cl, byte[oficialElegido+3] ; Caracter nulo
629 000005F0 80F900 cmp cl, 0
630 000005F3 7552 jne errorInputOfic
631
632 ; Calculamos desplazamiento en tablero
633 ; mCalcDesplaz calcula el desplazamiento en el tablero en base a la fila y columna y lo almacena en desplazCasOrig usando una formula
634 mCalcDesplaz [fila], [columna], qword[desplazCasOrig]
87 000005F5 488B3C25[88000000] <1> mov rdi, %1
88 000005FD 488B3425[90000000] <1> mov rsi, %2
89 00000605 E816070000 <1> call calcularDesplazamiento
90 0000060A 48890425[98000000] <1> mov %3, rax
635 00000612 488B1C25[98000000] mov rbx, qword[desplazCasOrig]
636
637 ; Limpio los registros
638 0000061A B800000000 mov rax, 0
639 0000061F BA00000000 mov rdx, 0
640