-
Notifications
You must be signed in to change notification settings - Fork 1
6. Programas de ejemplo
Mario Esteban Fernandez edited this page Dec 14, 2021
·
1 revision
define :loop_addr 0
data :loop
zero r0
addi 0010
left
left
left
left
addi 1011
copy r0r1
#00101011 en r1
zero r0
addi 0001
left
left
left
left
addi 0111
copy r0r2
#00010111 en r2
add
:loop
left
right
left
right
left
right
left
right
left
right
left
right
copy r0r3
zero r0
addi :loop_addr
copy r0r1
ld
copy r0r1
copy r3r0
jump 8
el ensamblador nos devuelve:
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
30 22 60 60 60 60 2b 81 30 21 60 60 60 60 27 82 00 60 70 60 70 60 70 60 70 60 70 60 70 83 30 2:loop_addr 81 c0 81 8c b8
sustituyendo constantes...
{':loop_addr': '0', ':loop': '11'}
text:
30 22 60 60 60 60 2b 81 30 21 60 60 60 60 27 82 00 60 70 60 70 60 70 60 70 60 70 60 70 83 30 20 81 c0 81 8c b8
data:
11
#valor 1 en r3
zero R0
addi 1
copy R0R3
#valor 1 en R2
copy r0r2
#r3 es el valor grande, lo paso temporalmente a r1 para sumar
#r2 es el valor pequeño
:loop
#sumo grande + pequeño
copy R3R1
add
#sobreescribo el pequeño con el grande anterior
copy R1R2
#sobreescribo el grande anterior con el resultado
copy R0R3
#ahora tengo libres r0 y r1 puedo hacer jump
#direccion de memoria en r1
zero R0
addi :loop
copy R0R1
#salto incondicional
jump 8
el ensamblador nos devuelve:
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
30 21 83 82 8d 00 86 83 30 2:loop 81 b8
sustituyendo constantes...
{':loop': '4'}
text:
30 21 83 82 8d 00 86 83 30 24 81 b8
data:
define :mask_sensors 3 #0011
define :loop_addr 0
define :not_found_addr 1
define :go_right_addr 2
define :go_left_addr 3
define :found_addr 4
data :loop :not_found :go_right :go_left :found
#pseudocodigo:
#while(true){
# sensors=readSensors()
# if(sensors==0)
# not_found()
# else if(sensors==1)
# go_right()
# else if(sensors==2)
# go_left()
# else
# found()
#}
:loop
#cargo sensores en r0
io 0
#niego la señal de los sensores
copy r0r1
copy r0r2
nand
#aplico mascara para quedarme con los 2 primeros bits
copy r0r2
zero r0
addi :mask_sensors
copy r0r1
and
copy r0r2
#ahora tengo en r2 el estado de los sensores
frst
zero r1
#comparo con 00
cmp
#cargo direccion de not_found
zero r0
addi :not_found_addr
copy r0r1
ld
copy r0r1
#Salto a :not_found
jump 2 #equal
frst
zero r0
addi 0001
copy r0r1
#comparo con 01
cmp
#cargo direccion de go_right
zero r0
addi :go_right_addr
copy r0r1
ld
copy r0r1
#Salto a :go_right
jump 2 #equal
frst
zero r0
addi 0010
copy r0r1
#comparo con 10
cmp
#cargo direccion de go_left
zero r0
addi :go_left_addr
copy r0r1
ld
copy r0r1
#Salto a :go_left
jump 2 #equal
#else
#cargo direccion de found
zero r0
addi :found_addr
copy r0r1
ld
copy r0r1
#Salto a :found
jump 8 #always
:not_found
zero r0
addi 0000
#escribo el resultado en los motores
io 1
#return
zero r0
addi :loop_addr
copy r0r1
ld
copy r0r1
jump 8
:go_right
zero r0
addi 0001
#escribo el resultado en los motores
io 1
#return
zero r0
addi :loop_addr
copy r0r1
ld
copy r0r1
jump 8
:go_left
zero r0
addi 0010
#escribo el resultado en los motores
io 1
#return
zero r0
addi :loop_addr
copy r0r1
ld
copy r0r1
jump 8
:found
zero r0
addi 0011
#escribo el resultado en los motores
io 1
#return
zero r0
addi :loop_addr
copy r0r1
ld
copy r0r1
jump 8
El ensamblador nos devuelve:
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
90 81 82 50 82 30 2:mask_sensors 81 40 82 e0 31 a0 30 2:not_found_addr 81 c0 81 b2 e0 30 21 81 a0 30 2:go_right_addr 81 c0 81 b2 e0 30 22 81 a0 30 2:go_left_addr 81 c0 81 b2 30 2:found_addr 81 c0 81 b8 30 20 91 30 2:loop_addr 81 c0 81 b8 30 21 91 30 2:loop_addr 81 c0 81 b8 30 22 91 30 2:loop_addr 81 c0 81 b8 30 23 91 30 2:loop_addr 81 c0 81 b8
sustituyendo constantes...
{':mask_sensors': '3', ':loop_addr': '0', ':not_found_addr': '1', ':go_right_addr': '2', ':go_left_addr': '3', ':found_addr': '4', ':loop': '0', ':not_found': '2f', ':go_right': '38', ':go_left': '41', ':found': '4a'}
text:
90 81 82 50 82 30 23 81 40 82 e0 31 a0 30 21 81 c0 81 b2 e0 30 21 81 a0 30 22 81 c0 81 b2 e0 30 22 81 a0 30 23 81 c0 81 b2 30 24 81 c0 81 b8 30 20 91 30 20 81 c0 81 b8 30 21 91 30 20 81 c0 81 b8 30 22 91 30 20 81 c0 81 b8 30 23 91 30 20 81 c0 81 b8
data:
0 2f 38 41 4a