Autor
|
Tema: Insertar $ en un LABEL BYTE (Leído 5,436 veces)
|
zonahurbana
Desconectado
Mensajes: 178
RS, JC.
|
En el DATA SEGMENT se tiene la declaración de algunas cadenas y además: 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: 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.
|
|
|
En línea
|
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.937
Israel nunca torturó niños, ni lo volverá a hacer.
|
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
|
|
|
En línea
|
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
Desconectado
Mensajes: 178
RS, JC.
|
Me indicaba este error: Argument needs type override En esta línea: Cambié la línea por: 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 $.
|
|
|
En línea
|
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.937
Israel nunca torturó niños, ni lo volverá a hacer.
|
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.
|
|
|
En línea
|
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
Desconectado
Mensajes: 178
RS, JC.
|
Muchas gracias por la ayuda. Con esto conseguí que funcionara: 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.
|
|
|
En línea
|
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.937
Israel nunca torturó niños, ni lo volverá a hacer.
|
[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
|
|
|
En línea
|
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
Desconectado
Mensajes: 178
RS, JC.
|
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? 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: MOV [BX],BYTE PTR DOLAR
MOV BYTE PTR[BX],DOLAR
Por otra parte he intentado: 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? 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: 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...
|
|
|
En línea
|
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.937
Israel nunca torturó niños, ni lo volverá a hacer.
|
|
|
|
En línea
|
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
Desconectado
Mensajes: 178
RS, JC.
|
¿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 : [BX] DOLAR CADE[DI] BX AL
|
|
|
En línea
|
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.937
Israel nunca torturó niños, ni lo volverá a hacer.
|
register/memory, segment register, immediate y move offset segment supongo ... fijate que opcodes genera el ensamblador para las correspondencias.
|
|
|
En línea
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
de byte a long
Programación Visual Basic
|
claus86
|
3
|
3,088
|
7 Marzo 2010, 18:27 pm
por LeandroA
|
|
|
Te voy a dar un byte
« 1 2 »
Foro Libre
|
Foxy Rider
|
17
|
7,747
|
16 Septiembre 2011, 18:35 pm
por ion dissonance2
|
|
|
[Sources Code] RotBits [Byte TO Byte ]
Programación Visual Basic
|
x64core
|
8
|
5,380
|
22 Octubre 2011, 00:46 am
por BlackZeroX
|
|
|
Take screenshot of byte help?
Programación Visual Basic
|
Harmmy
|
5
|
2,526
|
22 Diciembre 2012, 00:08 am
por Harmmy
|
|
|
Filestream . Byte a Byte
.NET (C#, VB.NET, ASP)
|
blaron
|
3
|
2,987
|
5 Abril 2014, 02:01 am
por Eleкtro
|
|