Insertar $ en un LABEL BYTE

Iniciado por zonahurbana, 1 Mayo 2014, 16:21 PM

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

zonahurbana

En el DATA SEGMENT se tiene la declaración de algunas cadenas y además:
Código (asm) [Seleccionar]
CADENA LABEL  BYTE
TOTAL DB 21
ACTUAL DB ?
CADE DB 21 DUP(?)

; Escribimos 21 ya que el ENTER ocupa un byte.
DOLAR DB "$"

CADINV DB 21 DUP(?),"$"

CADINV es donde pretendo guardar la cadena ingresada luego de ser invertida.
De momento el programa lee una cadena en un LABEL BYTE y muestra un mensaje diciendo "LA CADENA INGRESADA ES: " y la cadena misma de forma correcta.

El problema ocurre cuando se ingresan menos de 20 caracteres. Ya que hay un retorno de carro que hace que el cursor regrese al inicio de esa línea y continue escribiendo los caracteres faltantes (que no fueron ingresados) y borre parte del mensaje, pudiendo quedar por ejemplo "ENA INGRESADA ES: ".

En mis primeras clases vimos un poco acerca del debug.exe donde agregábamos instrucciones una por una. Y como en el foro me explicaron que podía usarse para analizar los programas, intenté hacerlo y allí fue cuando supe que el caracter era el retorno de carro.

Lo que quiero hacer es usar el byte llamado ACTUAL (en realidad no sé cómo referirme a los DB, ¿decir que son variables?) y allí mismo asignar el $, es decir, ya no esperar necesariamente al final de los 21 caracteres.
Pero según estuve viendo ACTUAL guarda un número, por ejemplo 11 y no un desplazamiento.

Entonces intenté esto:
Código (asm) [Seleccionar]
CALL INGRESO    ; Lectura de cadena
LEA BX,CADENA
ADD BL,ACTUAL
MOV [BX],"$"


Se llama al procedimiento para leer la cadena, luego pretendí asignar a BX el desplazamiento del LABEL BYTE y sumarle la posición actual para luego a ese desplazamiento asignarle "$". Pero no funciona.

Por favor, espero que puedan ayudarme. Mi principal problema es que no reconozco aún muy bien qué es lo que se asgina y puede asignarse entre los registros y las variables.

Gracias de antemano.
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Eternal Idol

No tengo un MASM tan antiguo a mano. ¿Que error te da en concreto? ¿error A2070:invalid instruction operands?

Tenes que especificar que queres usar un puntero a byte (para escribir un solo caracter):
http://www.c-jump.com/CIS77/ASM/Instructions/I77_0250_ptr_pointer.htm
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

zonahurbana

Me indicaba este error:
Argument needs type override
En esta línea:
MOV [BX],"$"

Cambié la línea por:
MOV BYTE PTR[BX],"$"
Y ya compila sin problemas, pero al mostrar la cadena no muestra sus 2 últimos caracteres. Es decir, ya no se sobrepone a los caracteres al inicio de la línea, pero la cadena ingresada aparece cortada en 2 caracteres.

Creí que [BX] haría referencia al retorno de carro y que lo reemplazaría por $.
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Eternal Idol

Bueno, ahora es cuando tenes que depurar (no tenemos tu codigo asi que no podemos mas que tratar de adivinar que valor tiene ACTUAL) para ver cual es exactamente el problema.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

zonahurbana

Muchas gracias por la ayuda.

Con esto conseguí que funcionara:
Código (asm) [Seleccionar]
CALL INGRESO   ; Lectura de cadena
LEA BX,CADE     ; Cargamos dir de inicio
ADD BL,ACTUAL ; Se le suma el valor de ACTUAL
MOV [BX], BYTE PTR "$"


Antes en BX cargaba la dirección de inicio del LABEL BYTE. De ese modo apuntaba a TOTAL y le seguía ACTUAL, al sumarle 3 (cuando ingresaba la cadena "123") quedaba apuntando al número 2 y luego sobre éste ingresaba el "$". Por eso se mostraba sólo el 1 y se perdían 2 caracteres.

Cambié CADENA (nombre del label byte) por CADE (dir de inicio desde donde se empieza a almacenar la cadena) y ya funciona.

Mi duda sería acerca de BYTE PTR:
[BX] que es el desplazamiento destino, ¿no hace referencia a un byte?
Y el símbolo de $ al igual que otro caracter es también un byte, ¿verdad?
Supuestamente ambos operandos son de 1 byte y no debería ser necesario escribir BYTE PTR, o eso creo.
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Eternal Idol

[BX] hace referencia a un direccion de memoria, cuanto se escriba en ella despues depende de lo que uno quiera hacer, puede ser un BYTE o un WORD por ejemplo.

http://www.c-jump.com/CIS77/ASM/Instructions/I77_0200_ptr_directive.htm
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

zonahurbana

Ya me funciona, de la forma en que escribí la última vez, pero... ¿por qué no funciona si en vez de poner el caracter directamente uso el nombre de una variable DB?
Código (asm) [Seleccionar]
CALL INGRESO    ; Lectura de cadena
LEA BX,CADE             
ADD BL,ACTUAL        
MOV [BX],DOLAR


Me indica "Need register in expression" en la última línea, y lo mismo si cambio la última línea citada por:
Código (asm) [Seleccionar]
MOV [BX],BYTE PTR DOLAR
Código (asm) [Seleccionar]
MOV BYTE PTR[BX],DOLAR

Por otra parte he intentado:

Código (asm) [Seleccionar]
MOV CADE[ACTUAL],DOLAR
Y supongo que esto falla porque no puedo usar una variable dentro de los corchetes. Sólo acepta DI, SI, BX o BP, ¿verdad?

Código (asm) [Seleccionar]
MOV DI,ACTUAL
MOV CADE[DI],DOLAR

Luego intenté esto y también resulta en error, debe ser porque DI y ACTUAL tienen tamaño distinto. Y por eso mismo tampoco funciona cuando a DI le asigno 0 y trato de usar ADD para sumarle ACTUAL.

Esto sí que funciono, pero no quedó en una línea como creí que podría hacerse:
Código (asm) [Seleccionar]
MOV BX,0
ADD BL,ACTUAL
MOV CADE[BX],BYTE PTR "$"


Lo que no entiendo es porqué en ningún caso puedo usar DOLAR, si supuestamente ya ha sido definido como dato de un solo byte...
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

zonahurbana

¿Cuál sería el significado de r/m, Sreg, imm y  moffs?

O tal vez pueda decirme cuál de estos se corresponde con alguno de ellos  :silbar::
Código (asm) [Seleccionar]
[BX]
DOLAR
CADE[DI]
BX
AL
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Eternal Idol

register/memory, segment register, immediate y move offset segment supongo ... fijate que opcodes genera el ensamblador para las correspondencias.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón