Autor Tema: duda con posiciones en memoria en ensamblador  (Leído 192 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado kikecea

  • PIC10
  • *
  • Mensajes: 9
duda con posiciones en memoria en ensamblador
« en: 06 de Octubre de 2017, 13:21:37 »
Hola, estoy analizando un código ensamblador para un uC de motorola y tengo algunas dudas a ver si me podéis echar un cable... A veces me encuentro que hace referencia a alguna posición de memoria que por lo que veo no encuentro, x ejemplo si me dice que carga el valor de $FA88 pero en el codigo me aparece una linea en $FA87 con una instrucción de dos bytes y ya me salta a la $FA89... será que en $FA88 va el segundo byte del opcode? xq sino no entiendo como aparece esa posición ya que no está

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6121
Re:duda con posiciones en memoria en ensamblador
« Respuesta #1 en: 06 de Octubre de 2017, 14:06:05 »
Si podes dar aunque sea el pedazo de codigo que estas tratando, y el microcontrolador de motorola el cual estas usando seria de mas ayuda.

Desconectado kikecea

  • PIC10
  • *
  • Mensajes: 9
Re:duda con posiciones en memoria en ensamblador
« Respuesta #2 en: 09 de Octubre de 2017, 05:20:22 »
Hola Killerjc, el microcontrolador sería el MC68HC908QY2 y este sería uno de los datasheet que miro http://cache.nxp.com/docs/en/reference-manual/CPU08RM.pdf  y x lo que veo utiliza desde F800 hasta FFFF que es el codigo que yo tengo. En algunos sitios x ejemplo me aparece :
LDA $9A    ;que por lo que entiendo es cargar en A desde esa posición de memoria, aunque no me aparece esa posición de memoria x     
                ningún lado. Estoy empezando a dudar si será que tiene al principio 256 posiciones de memoria de las que yo no tengo codigo
otro caso sería tb:
STA $97
STA $99    ; de los que tampoco tengo ese contenido en A

Y aprobechando tengo una preguntilla que a veces me lia algo...
LDA 63636,X     ; sería A=(63636 + lo que hay en X)? xq en el caso de que signifique que guarda en A lo que está guardado en la ;  ;  ; ;                         posición (63636d=F894h) $F894 sumandole lo que hay en X, ya sería raro también xq sólo tengo las posiciones:
F893  3319        COM       $19
F895  053F61    BRCLR    2,$3F,*+100

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6121
Re:duda con posiciones en memoria en ensamblador
« Respuesta #3 en: 09 de Octubre de 2017, 08:41:36 »
Citar
y x lo que veo utiliza desde F800 hasta FFFF que es el codigo que yo tengo

Ese microcontrolador:

https://www.nxp.com/docs/en/data-sheet/MC68HC908QY4.pdf
(Busca en donde dice Memory)

Tiene su RAM mapeada en las direcciones 0x80 a 0xFF, Por eso te pedi que mostraras el codigo. Los demas codigos hacen uso de la RAM, por eso ves LDA $9A, STA $97

Código: [Seleccionar]
LDA 63636,X
Si lo paso a hexa $F894 , el cual esta en el rango de la Flash, basicamente es un modo indexado, lo que hace es tomar el dato que se encuentra apuntado por (H:X + offset) No se que valores tenia antes H:X , pero imaginate el contenido de [ H:X + 0xF894], eso lo pasa al Acumulador, Si las instrucciones son seguidas, tal ves acceda al segundo byte del opcode del COM  que es el 0x19.

Código: [Seleccionar]
F893  3319        COM       $19Un complemento al registro que se ubique en la posicion 0x19, el cual estan mapeados los I/O, lo raroo es que 0x19 esta como no implementado

Código: [Seleccionar]
F895  053F61    BRCLR    2,$3F,*+100
Si el bit 2, del registro que se ubica en 0x3F (ultimo de los I/O - ADICLK), salta a una posicion relativa 100 posiciones mas que lo que indica el PC de la proxima instruccion, o en resumen ( PC + 0x3 + 100)
« Última modificación: 09 de Octubre de 2017, 14:15:00 por KILLERJC »

Desconectado kikecea

  • PIC10
  • *
  • Mensajes: 9
Re:duda con posiciones en memoria en ensamblador
« Respuesta #4 en: 18 de Octubre de 2017, 05:31:31 »
Hola Killerjc! El codigo entero no lo pongo ya que son mas de 1000 lineas, jajaja Las posiciones a las que nos referimos de la ram que va de 0x80 a 0xFF, no tienen nada ya que la ram no queda guardada. Esto me resulta lioso ya que por lo que veo parece que hace referencia a direcciones en ram, pero no encuentro x donde puede cargar datos...
Código: [Seleccionar]
   FA41  B6AC  LDA $AC
Código: [Seleccionar]
   FA43  B7A3  STA  $A3
Código: [Seleccionar]
   FA45  B6AB  LDA  $AB
Código: [Seleccionar]
   FA47  B7A4  STA  $A4
por lo que yo entiendo aquí, guarda el valor de la dirección $AC en el acumulador y despues lo pasa a la dirección de memoria $A3 y lo mismo haría con $AB y $A4. Quedando el registro [H:X] como [A3:A4]. Lo que me sucede es que de esas posiciones de memoria, que estarían en la ram pequeña de 0x80 a 0xFF, no tengo ningun otro lugar en el codigo donde se vea que le cargue algún valor... Debería cargarles datos en algun lugar no?

Otra pregunta para que me quede claro,
Código: [Seleccionar]
  FA77  D6F894  LDA  63636,X 
si en ese momento en [H:X] tengo 60, entonces tendría que cargar en el acumulador el valor que se encuentre en la posición F8D0 que es el valor hexadecimal de 63636+60... o sería 63636+2+2+60=63700 = F8D4 sumando dos veces 2 por que hay dos posiciones más de opcode...

Yo estoy tratando de hacer un excel con pequeñas rutinas del código para ver como se van moviendo los valores, ya que tiene un gran numero de lineas de codigo y tengo que tratar de entender las cosas que hace en conjunto... no soy muy ducho en el tema, estoy empezando,jajaj no se si este metodo te parece que puede funcionar o puedes recomendarme algún otro o algún enlace de internet donde pueda echar un ojo para coger ideas... gracias x tu ayuda

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6121
Re:duda con posiciones en memoria en ensamblador
« Respuesta #5 en: 18 de Octubre de 2017, 08:38:20 »
Respecto a las posiciones de la RAM, si es correcto tu apreciacion, pero no entiendo por que estas asumiendo que el registro [H:X] queda con el valor [A3:A4], no veo en ningun momento que lo cargue al registro index. Al menos con lo que mostras. Lo que si veo es el resultado de estas operaciones:

(0xAC) -> (0xA3)
(0xAB) -> (0xA4)

Tal ves en alguna parte del codigo esta la carga de esa RAM, si esto es un desamblado de un C, C crea una tabla en FLASH para inicializar los valores. Si este programa fue armado enteramente en ASM entonces en alguna otra parte se cargo el valor o se modifico.

Citar
si en ese momento en [H:X] tengo 60, entonces tendría que cargar en el acumulador el valor que se encuentre en la posición F8D0 que es el valor hexadecimal de 63636+60... o sería 63636+2+2+60=63700 = F8D4 sumando dos veces 2 por que hay dos posiciones más de opcode...

En este caso ( Modo de direccionamiento: Indexed, 16-Bit Offset ) no se suma los bits del opcode (ademas que son 3 bytes), pero el resultado directo es 63636+60 = 63696 = 0xF8D0

Citar
. no soy muy ducho en el tema, estoy empezando,jajaj no se si este metodo te parece que puede funcionar o puedes recomendarme algún otro o algún enlace de internet donde pueda echar un ojo para coger ideas...

Realizar un disasm es una de las tareas mas complejas del ASM, es mas simple por ahi crear un codigo, supongamos que usas C para no complicarte la vida, creas un codigo "simple" y luego vas a ver el ASM para ver como lo hizo, de todas formas para programar de forma optima en ASM tenes que conocer muy bien los modos de direccionamiento y todas las instrucciones.

Desconectado kikecea

  • PIC10
  • *
  • Mensajes: 9
Re:duda con posiciones en memoria en ensamblador
« Respuesta #6 en: 18 de Octubre de 2017, 10:50:45 »
Buenas, pues si que es un programa que se sacó de un uC, que supongo que estaría escrito en C... no entiendo muy bien lo que me dices de crear una tabla flash, investigaré un poco por aquí a ver si encuentro algo... en lo que me pones al principio, lo que yo entiendo es que coge el dato que está en la posición de memoria $AC y lo guarda en la posición de memoria ram $A3... ya voy asimilando algo mejor el tema, acumulador e index son unos registros que pueden ir cambiando y memoria no es un registro sino esas posiciones de Ram desde 0x80 a 0xFF... xq al final es algo lioso el tema, verlo con perspectiva no es fácil a primeras, jajaja me queda una asignatura para acabar ingeniería en electronica y automática, pero no se como funciona x ahí, aquí en España poco explican las cosas en la carrera, sólo nos enseñan matemáticas...

Desconectado kikecea

  • PIC10
  • *
  • Mensajes: 9
Re:duda con posiciones en memoria en ensamblador
« Respuesta #7 en: 18 de Octubre de 2017, 11:24:56 »
Buenas de nuevo, jajaj creo que estoy viendo algo donde me equivocaba, a ver tu que crees...
Código: [Seleccionar]
FA77  D6F894  LDA  63636,Xserá que usa el valor F894 + (lo que tengo en X), yo creo que me equivocaba y entendía que era el valor de la dirección $F894, pero me acabo de dar cuenta que no tiene la $, entonces sería el valor directo y no la dirección... me despistaba que no aparecía #$ y por eso no pensaba que era el valor..
Código: [Seleccionar]
FA83  AE05  LDX  #$05Aquí sí que guarda en el index el valor 0x05
Código: [Seleccionar]
FA85  E6A3  LDA  163,XSería igual que el primer caso, coge el valor directo 163 y le suma el valor que haya en el index X...

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6121
Re:duda con posiciones en memoria en ensamblador
« Respuesta #8 en: 18 de Octubre de 2017, 14:46:25 »
Muchas veces necesitas tener unos datos y que no varian,, vamos al ejemplo mas sencillo que se me ocurre.

Suponete que estas manejando un display 7 segmentos. Y supongamos que cada bit representa un segmento

Código: C
  1.   //     GFEDCBA  Segments      7-segment map:
  2.   B00111111, // 0   "0"          AAA
  3.   B00000110, // 1   "1"         F   B
  4.   B01011011, // 2   "2"         F   B
  5.   B01001111, // 3   "3"          GGG
  6.   B01100110, // 4   "4"         E   C
  7.   B01101101, // 5   "5"         E   C
  8.   B01111101, // 6   "6"          DDD
  9.   B00000111, // 7   "7"
  10.   B01111111, // 8   "8"
  11.   B01101111, // 9   "9"

Si lo pasamos a hexadecimal tenemos que desde el 0 es:

0x3F, 0x06, 0x5B, etc....

Si quisiera guardar esto en un microcontrolador, lo podria hacer en la RAM, pero esos datos nunca cambian por lo tanto no me sirve ocupar la RAM, y llevaria las cosas a la FLASH. Alli voy a indicarle al compilador que me guarde todos esos datos. No se como es la instruccion para los datos en flash pero vamos a suponer "DT"

SieteSegmento:
   DT  0x3F, 0x06, 0x5B, 0x4F....

Entonces cuando yo haga el programa y tenga que mostrar el valor de una variable, expresados en BCD ( separados en unidades, decenas y centenas )
Solo me bastaria hacer:

   LDX UNIDAD                  ; Unidad tiene un valor de la RAM, donde esta mi variable
   LDA SieteSegmento, X    ; Aca lo que haria es usar la direccion de la etiqueta que corresponde a la direccion del valor 0x3F y le sumo lo que hay en X.

Haciendo lo anterior, Si mi variable es 0 va a tomar el primer valor que es el 0x3F, si mi variable unidad era 2, va a tomar el 3er valor que es 0x5B.
De esa forma tengo una tabla, la cual tengo una BASE ( direccion de inicio - SieteSegmento ) y un offset dado por mi variable ( que se encuentra en los registros H:X )

Eso es a lo que me refiero como una tabla.

Tal ves el LDA 63636, X acceda a esa direccion y tengas realmente una tabla alli. Vos pensa que si el microcontrolador no va con su Program Counter ( PC ) por esos valores, entonces pueden tener cualquier significado. Siguiendo con el ejemplo. que pasaria si yo tengo una tabla con estos valores:

0xB6, 0xAC, 0xB7, 0xA3, .... etc...

Si uno hace un disasembly de este codigo el codgio resultante seguramente sea este:

B6AC  LDA $AC
B7A3  STA  $A3

Ahora parece que tuviera instrucciones, pero en realidad son valores fijos almacenados en la FLASH.
Con esto quiero llegar a que puede haber algunas instrucciones que no poseen sentido, y terminar siendo datos guardados en la flash.

Si el codigo fue generado con C, generalmente tienen una parte inicial que cargan todas las posiciones de memoria con ciertos valores, y esos valores iniciales estan almacenados en la FLASH. Por eso mismo  te dije que busques la forma si es que te manejas mas con C, de hacer algun codigo con C y luego hacerle un disassembly asi poder comparar y al menos sabes que es lo que esta haciendo. Sin contar que C utiliza el stack bastante.

PD: Nunca trabaje con este nucleo ( HC08 ) pero no creo que le este errando tanto, no hay mucha diferencia entre un micro u otro.

Desconectado kikecea

  • PIC10
  • *
  • Mensajes: 9
Re:duda con posiciones en memoria en ensamblador
« Respuesta #9 en: 14 de Noviembre de 2017, 09:27:03 »
Pues aqui sigo trabajando en ello, y peleando aún... jajaj creo que voy a tratar de mirar algo con estes programas como ollydbg o IDA o algo así, te suena algo? muchas gracias por tu ayuda Killerjc

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6121
Re:duda con posiciones en memoria en ensamblador
« Respuesta #10 en: 14 de Noviembre de 2017, 14:25:11 »
El ollydbg el unico soporte que conozco es de x86 y x86_64

El IDA con Hex Rays es lo mejor, pero pago, y recuerdo haber visto hasta soporte para PICs asi que para el MC68 seguramente tenga.