me quedo hiper largo y no se si esta bien. Alguna sugerencia??
Otra duda es el uso del CMP, es similar al SUB pero sin guardar el resultado en ningun lado??
Gracias
INICIO
SETLO 0x01 REG3;
SETHI 0x01 REG3; REG3 = 0101 (inferior)
SETLO 0x65 REG2;
SETHI 0x01 REG2; REG2 = 0165 (superior)
SETLO 0x00 REG4;
SETHI 0x01 REG4; REG4 = 0100 (dato)
LOAD REG4, REG1; REG1 = dato
DIVISION
CMP REG2,REG3; REG2-REG3
SETLO 0x02 REG4;
SETHI 0x00 REG4; REG4 = 0002
SETLO 0x01 REG6;
SETHI 0x00 REG6; REG6 = 0001
SETLO 0x00 REG8;
SETHI 0x00 REG8; REG8 = 0000
RESTO2
JZ 0x008; 8 lugares adelante a SIGO
ADD REG8,REG3,REG7; copio el inferior al reg7
ADD REG8,REG3,REG5; copio el inferior al reg5
ADD REG5, REG4, REG5; sumo dos al inferior
CMP REG2, REG5;
JN 0x003; 3 lugares adelantes a SIGO
ADD REG7, REG6, REG7; sumo 1 al inferior (guardara medio)
JMP 0xFF9; 7 lugares atras al RESTO2
SIGO
LOAD REG7 REG4;
CMP REG4, REG1; dato - memoria[medio]
JZ 0x003; 3 lugares adelante a ENCONTRADO
JN 0x008; 8 lugares adelante a MENOR
JMP 0x00B; 11 lugares adelante a MAYOR
ENCONTRADO
SETLO 0x66 REG1;
SETHI 0x01 REG1; REG1 = 0166 (guarda dato)
SETLO 0x01 REG2;
SETHI 0x00 REG2; REG2 = 0001
STORE REG2 REG1;
JMP 0x00F; 15 lugares adelante hacia FIN
MENOR
SETLO 0x01 REG4;
SETHI 0x00 REG4; REG2 = 0001
SUB REG7,REG4,REG2; superior = medio-1
JMP 0x004; 4 lugares adelante a COMPARACION
MAYOR
SETLO 0x01 REG4;
SETHI 0x00 REG4; REG2 = 0001
ADD REG7,REG4,REG3; inferior = medio+1
COMPARACION
CMP REG3-REG2; inferior-superior
JN 0xFDE; 34 lugares para atras a donde arranca la division;
NO ENCONTRADO
SETLO 0x66 REG1;
SETHI 0x01 REG1; REG1 = 0166 (guarda dato)
SETLO 0x00 REG2;
SETHI 0x00 REG2; REG2 = 0000
STORE REG2 REG1;
FIN
NOP
Por lo que llegué a ver, hay un CMP
Que sobra (no lo entiendo).
Tip: Para dividir entre dos, utilizá SR (shift right). Para multiplicar por dos, SL (shift left).
SR 1 : Divide por dos
SR 2 : Divide por cuatro
SR 3 : Divide por ocho
...
Análogo para SL.
Probá escribirlo con SR a ver si queda más corto/sencillo.
Saludos.
DIVISION
CMP REG2,REG3; REG2-REG3
SETLO 0x02 REG4;
CMP REG2,REG3; REG2-REG3
SETLO 0x02 REG4;
Que sobra (no lo entiendo).
Tip: Para dividir entre dos, utilizá SR (shift right). Para multiplicar por dos, SL (shift left).
SR 1 : Divide por dos
SR 2 : Divide por cuatro
SR 3 : Divide por ocho
...
Análogo para SL.
Probá escribirlo con SR a ver si queda más corto/sencillo.
Saludos.
Tengo una duda en este ejercicio. Los registros son de 16 bits verdad? Y según la letra, el "dato" de la búsqueda está en la dirección 0100h, y la "lista ordenada" empieza en 0101h, por lo que entonces los datos en la memoria son de 1 byte (?) es decir, que cada vez que hago "Load" estoy trayendo 2 bytes (2 números)(?). O no es así?
Porque si los datos fueran de 2 bytes, no tendría que avanzar de a 2? es decir, que la lista empiece en 0102h (?)
Si te fijśa, es posible deducir que la memoria se debe recorrer de a palabras y no de a bytes. Esto surge de que el largo es de 100 elementos y las direcciones van de 101h a 165h. (64h es 100).
En cualquier caso, sigue siendo una excelente observación.
Si fuese de a bytes (como lo es habitualmente) debería ser:
En 0x100 el dato, en 0x102 arranca la lista con 100 elementos que llega hasta 0x1CA. En 0x1CC debería ir el dato. Y si, deberías incrementar de a dos.
Espero se entienda, cualquier duda a las órdenes.
Saludos.
En cualquier caso, sigue siendo una excelente observación.
Si fuese de a bytes (como lo es habitualmente) debería ser:
En 0x100 el dato, en 0x102 arranca la lista con 100 elementos que llega hasta 0x1CA. En 0x1CC debería ir el dato. Y si, deberías incrementar de a dos.
Espero se entienda, cualquier duda a las órdenes.
Saludos.
Ahhh. Claro claro. Se recorre la memoria por palabras. Ahora que vuelvo a mirar la letra sí, se da a entender eso.
Gracias
Gracias
Los numeros negativos se representan en complemento a dos suponemos?
Y por ejemplo, si quiero ir:
JMP xxx // de aca a llegada
...algo...
...algo...
...algo...
LLEGADA
en xxx debería ir 4?
Igual supongo que eso es particular de este ejercicio, lo que si interesa es saber como suponemos generalemente que se representan los números con signo.
Si, debería ir 4 ya que le pasás el número de instrucciones a saltearse.
Por lo general y si no se especifica lo contrario, si se habla de enteros con signo se puede asumir complemento a 2. En cualquier caso, lo mejor es preguntar.
Saludos.
Por lo general y si no se especifica lo contrario, si se habla de enteros con signo se puede asumir complemento a 2. En cualquier caso, lo mejor es preguntar.
Saludos.