Página 1 de 1

literal EQU string

Publicado: 22 Nov 2018, 10:30
por Bubu
¡Jarl, torpedos!

Estoy pogramando con el ensamblador (en concreto uso PASMO) y me encuentro el siguiente poblema: necesito que un literal equivalga a una cadena. Hasta ahora, cuando un literal quiero que equivalga a un número, pues hago esto:

Código: Seleccionar todo

YEAR EQU 2018


y ya sabéis que cá vez que en el pograma aparece YEAR, el compilador lo sustituye por 2018. Pero ahora necesito asignarle a un litaral no un número, sino una cadena de texto, algo tal que así:

Código: Seleccionar todo

NOMBRE EQU "BUBU"


No encuentro que esto se pueda hacer. ¿Sabéis si se puede o no hacer?

Re: literal EQU string

Publicado: 22 Nov 2018, 13:57
por zup

Código: Seleccionar todo

micadena:     db 'hola mundo'


Ten en cuenta que equ es "virtual" (si defines algo pero no se usa, no come memoria), mientras que db define una sucesión de bytes muy real.

La etiqueta te sirve para poder apuntar al inicio de la cadena.

Por otra parte, la cadena que he puesto no tiene ningún terminador, ni 0 (estilo C) ni $ff (estilo +3DOS) ni carácter+128

Re: literal EQU string

Publicado: 22 Nov 2018, 14:27
por Bubu
DB no me vale. Tié que ser EQU. Es que lo quiero para tener por un lado una librería genérica:

Código: Seleccionar todo

sprite0: incbin file0
sprite1: incbin file1
sprite2: incbin file2

ld hl, sprite0
ld b, 8
ld a, (hl)
bla bla bla...


Y para usar esta librería, el pogramador tendría 3 archivos con los nombres que quiera, y entóns en su pograma hacer:

Código: Seleccionar todo

file0 EQU "protagonista.bin"
file1 EQU "enemigo.bin"
file2 EQU "coche.bin"


Con esto el pogramador no está obligado a tener los archivos con los nombres que le exija mi librería, sino que con lo del EQU le dice a mi librería (mapea) como se llaman los archivos del pogramador.

Re: literal EQU string

Publicado: 22 Nov 2018, 14:34
por explorer
Según la documentación, no se puede:
EQU
EQUate. Must be preceded by a label. The argument must be a numeric expression, the result is assigned to the label. The label used can't be redefined.


En otros ensambladores se suele usar SET o el operador '=' para hacer asignación de constantes, pero parece ser que en este ensamblador tampoco existen. Solo comenta que los literales pueden ir entre comillas simples y dobles.

Re: literal EQU string

Publicado: 22 Nov 2018, 16:08
por explorer
Bubu escribió:Con esto el programador no está obligado a tener los archivos con los nombres que le exija mi librería, sino que con lo del EQU le dice a mi librería (mapea) como se llaman los archivos del programador.

Puedes hacerlo de otra manera: que la libreríabiblioteca recibe los PUNTEROS a los tres nombres de los archivos, que el programador ha escrito como etiquetas en los INCBIN. De esa manera le das la libertad al programador para que decida él dónde quiere colocar esos archivos.

Sí, la biblioteca podría encargarse de hacer los INCBIN, pero... no tendríamos mucho control del lugar donde están. Imagínate que en alguna ocasión, por temas de velocidad, el programador deseara que uno de esos archivos comenzase en dirección múltiplo de $0100.

Re: literal EQU string

Publicado: 22 Nov 2018, 16:32
por explorer
Creo que lo puedes hacer... con una MACRO.

Código: Seleccionar todo

pintarsprite MACRO file0,file1,file2
    local sprite0,sprite1,sprite2
    ld hl, sprite0
    ld b, 8
    ld a, (hl)
    ...
    ret
sprite0: incbin file0
sprite1: incbin file1
sprite2: incbin file2
        ENDM

Mírate el ejemplo macro.asm del Pasmo para saber más sobre las macros.

Re: literal EQU string

Publicado: 11 Ene 2019, 00:13
por Bubu
¡Ajá!

En esto de las macros es que soy un poco bastante novato, jiji, he de estudiar. ¿Y con las macros se podría tamién sustituir mnemónicos? P.ej.:

- Cá vez que necesite IX+1 quiero escribir _ancho
- Cá vez que necesite IX+2 quiero usar _alto
etc:

Código: Seleccionar todo

ld b, (_ancho)
ld c, (_alto)


Aunque pensándolo bien, es muy parecido a esto:

Código: Seleccionar todo

_ancho EQU +1
_alto EQU +2

ld b, (ix + _ancho)
ld c, (ix + _alto)