Duda con directivas en ensamblador

Bueno gente, un saludo cordial, la razón por la cual recurro a este gran foro,
es porque tengo algunas dudas en el lenguaje assembler.
Cabe decir que soy principiante en este tema, pero las dudas que tengo quizá ayuden a muchos a aclararlas.
Las dudas son las siguientes:
Aclaración: estoy empezando a programar con dos microprocesadores,
los cuales son de Zilog y de Motorola, el Z80 y el 6800 respectivamente,
ya conozco todas las instrucciones que se pueden escribir y las reconoce,
pero tengo dudas sobre las directivas que se usan.
1- como sabemos las directivas no afectan al MPU (microprocesador)
pero si son necesarias para algunas descripciones muy importantes en cuanto a concepto,
ya que por ejemplo el z80 tiene que comenzare a programar a partir de la dirección 8000h,
lo cual se coloca una directiva .ORG 8000H, en cambio el motorola 6800,
puede empezarse a programar desde la posición 0000h.
Bueno pero amigos la gran duda gran es que:
1` ¿cuantas directivas existen y como le las utiliza?.
Busque en la red y solo existían directivas de los microcontroladores PIC de microchip.
2` ¿las directivas qué existen cambian al cambiar el simulador?
En mi caso yo antes de programar en el trainner de mi universidad lo simulo en el ensamblador Z80simulatorIDE.
3` ¿existe algún documento que me ayude con respecto a este tema de directivas en los simuladores?


Cabe decirles que soy nuevo en esto, quizá tengo algunos errores de concepto,
pero agradecería toda la ayuda que puedan brindarme. Muchas gracias :cool:
 
Última edición por un moderador:
1- como sabemos las directivas no afectan al MPU (microprocesador) pero si son necesarias para algunas descripciones muy importantes en cuanto a concepto ya que por ejemplo el z80 tiene que comenzarce a programar a artir de la direccion 8000h lo cual se coloca una directiva .ORG 8000H en cambio el motorola 6800 puede empezarse a programar desde la posicion 0000h bueno pero amigos la gran duda gran es que:
Hay que aclarar que esas direcciones no tienen nada que ver con los micros sino que son propias de las placas de desarrollo que están usando.
Después de un reset, el Z80 ejecuta la instrucción la instrucción en 0000H y el 6800 en FFFEH (en los casos se pone un salto al verdadero comienzo del programa)
Lo que ocurre es que cada placa de desarrollo ya tiene en ROM un programa cortito de booteo que ejecuta y luego salta a una dirección fija. Que por lo visto en tu caso son 8000H y 0000H.

1`cuantas directivas existen y como le las utiliza, busque en la red y solo existian directivas de los microcontroladores PIC de microchip
Las directivas dependen del ensamblador que estés usando, no del micro.

2` las directivas que existen cambian al cambiar el simulador? en mi caso yo antes de programar en
el trainer de mi universidad lo simulo en el ensamblador Z80simulatorIDE
Es como todo, lo importante se mantiene. Aunque te pueden agregar/sacar directivas y cambiar la sintaxis según se les dé la gana.

3` existe algun documento que me ayude con resepecto a este tema de directivas en los simuladores?
Un documento "general" no serviría de nada, vos lo que tenés que hacer es leer la documentación de cada ensamblador/simulador.
 
Hola,

Yo he estudiado el 6800 con este libro:

Problemas y aplicaciones de sistemas electrónicos digitales - Gregorio Godoy Vilches

Escrito por mi profesor de sistemas electrónicos y donde viene explicado el 6800 de motorola al completo.

Como dice Eduardo, a la hora de enfrentarte a un microprocesador o un microcontrolador, el manual tiene que ser como tu biblia.

saludos
 
Que tal tengo un problema con saber que significan estas directivas de lenguaje ensamblador.
Se trata nada mas y nada menos que Tiny BASIC para el Z80 el problema es que no logro hacerlo compilar.

no entiendo que significa este pedazo de directiva :
Código:
DWA:    MACRO WHERE
        .DB   (WHERE >> 8) + 128
        .DB   WHERE & 0FFH
        ENDM

luego esta función que no entiendo bien que hace exactamente:
Código:
IP4:
        POP AF                          ;PURGE JUNK IN STACK
        RST 08H                         ;IS NEXT CH. ','?
        .DB ','
        .DB IP5-$-1
        JR IP1                          ;YES, MORE ITEMS.
IP5:
        RST 30H

Donde .DB IP5-$-1 al parecer se le resta un símbolo de dinero y se le resta un 1 pero IP5 parece ser una etiqueta que apunta a la dirección de RST 30h
ahí no se que significa esa función, se que DB define un Byte pero no se que función tenga restar un símbolo y un numero.

y lo mismo pasa en este pedazo:

Código:
EXPR1:
        LD HL,TAB8-1

Donde cargan a direccion una etiqueta y le restan un 1, no se exactamente por que.

Despues veo que usan una funcion llamada DS que desconosco su uso

Código:
LSTROM:                                 ;ALL ABOVE CAN BE ROM
                    ;HERE DOWN MUST BE RAM
        ORG  0800H
        .DB   0x00
        ORG  0F00H ; Last 256 bytes of RAM
VARBGN: .DS   55                         ;VARIABLE @(0)
BUFFER: .DS   64                         ;INPUT BUFFER
BUFEND: .DS   1                          ;BUFFER ENDS
STKLMT: .DS   1                          ;TOP LIMIT FOR STACK
        END
Se que las usan para mover o ajustar esas variables en un espacio de memoria de la RAM pero no se que hace DS
Me gustaria que pudieran ayudarme.

Hasta ahorita lo que he hecho es agarrar un .BIN y lo desensamble y lo e estado comparando con el codigo fuente pero me hubiera gustado modificar el codigo fuente.

Desensamblar el binario y el .ASM que me genero y volver a compilar si me genera un .HEX pero si compilo el codigo fuente, me marca 0 errores pero no me genera un .HEX :( no se por que.
 
Ayudando en lo que se puede:
-El signo & es el operador AND. Ya sabes, para hacer máscaras de bits, etc...

.DB WHERE & 0FFH ;
Guarda el resultado (del tamaño de un octeto) de una operación AND entre el contenido de la variable WHERE y 0FFH (255 en decimal).

‐------------

POP AF, extrae el contenido de la parte superior de la pila o stack, al registro acumulador A.
Su opuesta es PUSH AF, que carga el contenido de AF en la pila.

El registro AF es doble. Pero A recibe los resultados de las operaciones aritméticas y lógicas y los bytes de F son Flags indicadores de estado de dichas operaciones. Es de dos octetos, pero no es como los registros BC, DE o HL que admiten hasta FFFFH.
Dice el comentario:"PURGE JUNK IN STACK", osea, limpiar el stack de basura, extrayendola al acumulador.

RST 08H es una llamada al coprocesador. Es una comparación AND. Sus parámetros se definen justo a continuación de dicha instrucción.
RST 30H es otra llamada al coprocesador. Devuelve 1 si el contenido del stack es 0, y 0 si no lo es.
(Como si fuera un flag Z, pero del contenido del stack)
RST 08H ;ES EL SIGUIENTE CARACTER UNA COMA? LLAMADA AL COPROCESADOR
.DB ',' ; COMPARAR UN CARACTER COMA...(Primer parámetro de RST 08H)
.DB IP5-$-1 ; CON ESTA EXPRESIÓN. (Segundo parámetro de RST 08H)
El símbolo $ es la dirección de la instrucción actual, el Program Counter, PC.
Se puede usar como parte de un operando o en una expresión.
En tu caso, .DB IP5-$-1 , está reservando un octeto de la memoria para guardar en él el resultado de la operación:
RST 30H - Direccion del PC -1
Luego, ejecuta RST 08H y, según el resultado de la comparación, salta (o no) con este salto relativo:
JR IP1

--------------
LD HL,TAB8-1

QUIZÁS sea para ahorrar bytes. Un LD HL, xxxxx ocupa 3 bytes. Si LD HL, TAB8-1 ocupa 2 bytes, es por eso.
Hay que tener en cuenta que TAB8 ya está definido en memoria, sería cargar HL con un puntero -1.
Es como un XOR A para poner a 0 el acumulador. Ocupa 1 byte, mientras que LD A, 0 ocupa más (no recuerdo si 2 o 3).
------------------
DEFB, DB, Define Byte, un octeto
DEFW, DW, Define Word, dos octetos
DEFS, DS, ¿Define String? Reserva tantos octetos como el valor de la variable
DEFM, DM "s" Reserva tantos octetos como la longitud de la cadena "s" (sin las comillas).
 
Última edición:
Excelente voy a ver si logro correr BASIC en mi computadora casera.
Este código está compilado para 2K en ROM Y 4k en RAM y un mapa fijo de memoria.
Mi computadora es de 8K en EEPROM Y 8K en RAM.
Por eso no corre el mapa de memoria apunta dentro del ROM.

y mi compilador no compila y TASM me marca errores.
Gracias y si corre aviso.
 
no entiendo que significa este pedazo de directiva :
Código:
DWA:    MACRO WHERE
        .DB   (WHERE >> 8) + 128
        .DB   WHERE & 0FFH
        ENDM
Genera una macroinstruccion, es decir que eso se repetirá varias veces en el código.
La macro se llama DWA, toma el valore de where, que es el parámettro que le envías a la macro lo rota ocho veces luego elimina los 8 bits altos, le suma 128, que es el bit alto del byte bajo y por si desborda se queda solo los 8 bajos , pero eso sí que lo hace en memoria ...
Osea que si ejecutas
DWA 1234h
Lo que hará será primero rotar para quedarse con el 12, le suma 128 y lo guarda en memoria.
Osea, el byte alto del dato forzando a 1 el bit más significativo
En el siguiente byte guarda la parte baja del dato.

Osea que guarda en memoria el dato que le des, en Big endian forzando a 1 el bit más significativo.

Si hicieras DW 1234h
En memoria habría
12 osea 00010010
34 osea 00110100


Mientras que haciendo DWA 1234h
Eso es lo mismo que hacer
12+128
DB 92h osea 10010010
Y luego el byte bajo
DB 34h osea 00110100

Código:
IP4:
        POP AF                          ;PURGE JUNK IN STACK
        RST 08H                         ;IS NEXT CH. ','?
        .DB ','
        .DB IP5-$-1
        JR IP1                          ;YES, MORE ITEMS.
IP5:
        RST 30H
No controlo el Z80...
DB ',' guarda en memoria el valor ascii de la coma
BD IP5-$-1
Guarda en memoria el valor de IP5, menos el valor del contador de programa $ menos 1, no me cuadra, debería de ser un valor de 16 bits, osea un DW, lo mismo este ensamblador usa DB para todo.

y lo mismo pasa en este pedazo:

Código:
EXPR1:
        LD HL,TAB8-1

Donde cargan a direccion una etiqueta y le restan un 1, no se exactamente por que.
Carga en el par de registros hl el valor de la etiqueta, que es una dirección menos uno. Eso apunta a la dirección inmediatamente anterior.
Después cargará cosas con ese valor de dirección, lo mismo por simplificar el código primero lo incrementa y luego hace el bucle.
Utilidad.
Yo pongo una cadena de texto
Cadena: DB "Mensaje de texto",0
Y luego llamo a una rutina que lo imprima
Ld hl, cadena
Call imprime
La rutina imprime saca caracteres de donde apunta hl hasta encontrar un 0 y los envía a la pantalla...
El -1 porque lo primero que hago en incrementar, o lo que sea.
Despues veo que usan una funcion llamada DS que desconosco su uso

Código:
LSTROM:                                 ;ALL ABOVE CAN BE ROM
                    ;HERE DOWN MUST BE RAM
        ORG  0800H
        .DB   0x00
        ORG  0F00H ; Last 256 bytes of RAM
VARBGN: .DS   55                         ;VARIABLE @(0)
BUFFER: .DS   64                         ;INPUT BUFFER
BUFEND: .DS   1                          ;BUFFER ENDS
STKLMT: .DS   1                          ;TOP LIMIT FOR STACK
        END
Se que las usan para mover o ajustar esas variables en un espacio de memoria de la RAM pero no se que hace DS
Me gustaria que pudieran ayudarme.

Hasta ahorita lo que he hecho es agarrar un .BIN y lo desensamble y lo e estado comparando con el codigo fuente pero me hubiera gustado modificar el codigo fuente.

Desensamblar el binario y el .ASM que me genero y volver a compilar si me genera un .HEX pero si compilo el codigo fuente, me marca 0 errores pero no me genera un .HEX :( no se por que.
DS reserva N bytes de memoria, nunca la usé, lo he tenido que buscar en Google porque no me acordaba.
Así que reserva 64 bytes, luego uno y luego otro pero define a donde apuntan esas etiquetas.
 
Atrás
Arriba