Ensamblador - problema con un bucle en codigo ensamblador

 
Vista:

problema con un bucle en codigo ensamblador

Publicado por ensambler (5 intervenciones) el 23/06/2008 16:28:24
Bueno he tenido un problema con un bucle en codigo ensamblador aqui os dejo el codigo

-A0100
0CC7:0100 JMP 125
0CC7:0102
-E 102 'HOLA' 0A 0D '$'
-A125
0CC7:0125 MOV BX,000A
0CC7:0128 MOV DX,102
0CC7:012B MOV AH,09
0CC7:012D INT 21
0CC7:012F DEC BX
0CC7:0130 JNZ 012D
0CC7:0132 INT 20
0CC7:0134

supuestamente devería funcionar pero no lo hace... lo he hecho mediante el debug de MS-DOS

este codigo tampoco me funciona:

-A0100
0CC7:0100 JMP 125
0CC7:0102
-E 102 'HOLA' 0A 0D '$'
-A125
0CC7:0125 MOV CX,000A
0CC7:0128 MOV DX,0102
0CC7:012B MOV AH,09
0CC7:012D INT 21
0CC7:012F LOOP 012D
0CC7:0131 INT 20
0CC7:0133

hay una linea común que especialmente no entiendo:

0CC7:012B MOV AH,09

creo que es como para elegir lo que imprime int 21 pero si me pudieses aclarar mejor os lo agradeceria

otra cosa que no entiendo es cuando le pones LOOP [loquesea] o JNZ [loquesea] ¿cómo sabe el registro que tiene que comprar? ¿si tiene que ser BX o CX? ¿con LOOP siempre es CX, y con JNZ siempre es BX?

muchas gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:problema con un bucle en codigo ensamblador

Publicado por MSH (120 intervenciones) el 23/06/2008 18:54:12
Por lo que trato de entender, es que quieres desplegar un mensaje en pantalla mediante DEBUG. En ese caso, las instrucciones LOOP y de salto condicional están de más

veamos si sirve esta forma:

a cs:0100
xxxx:0100 mov ah,09
xxxx:0102 mov dx,0109
xxxx:0105 int 21h
xxxx:0107 int 20h
xxxx:0109 db 'Hola ASM!','$'

(presionas enter)

-g

debe aparecer:

Hola ASM!
El programa ha finalizado de forma normal
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema con un bucle en codigo ensamblador

Publicado por Francisco (3 intervenciones) el 23/06/2008 21:47:15
Hola.
Aquí tienes algunos saltos y las condiciones que los controlan; tendrás que acondicionar las columnas para que sea más legible.

LOOP siempre salta si CX no es cero.

Jxx - Jump Instructions Table
Mnemonic Meaning Jump Condition
JA Jump if Above CF=0 and ZF=0
JAE Jump if Above or Equal CF=0
JB Jump if Below CF=1
JBE Jump if Below or Equal CF=1 or ZF=1
JC Jump if Carry CF=1

JCXZ Jump if CX Zero CX=0
JE Jump if Equal ZF=1
JG Jump if Greater (signed) ZF=0 and SF=OF
JGE Jump if Greater or Equal (signed) SF=OF
JL Jump if Less (signed) SF != OF
JLE Jump if Less or Equal (signed) ZF=1 or SF != OF
JMP Unconditional Jump unconditional

JNA Jump if Not Above CF=1 or ZF=1
JNAE Jump if Not Above or Equal CF=1
JNB Jump if Not Below CF=0
JNBE Jump if Not Below or Equal CF=0 and ZF=0
JNC Jump if Not Carry CF=0
JNE Jump if Not Equal ZF=0
JNG Jump if Not Greater (signed) ZF=1 or SF != OF

JNGE Jump if Not Greater or Equal (signed) SF != OF
JNL Jump if Not Less (signed) SF=OF
JNLE Jump if Not Less or Equal (signed) ZF=0 and SF=OF
JNO Jump if Not Overflow (signed) OF=0
JNP Jump if No Parity PF=0
JNS Jump if Not Signed (signed) SF=0
JNZ Jump if Not Zero ZF=0

JO Jump if Overflow (signed) OF=1
JP Jump if Parity PF=1
JPE Jump if Parity Even PF=1
JPO Jump if Parity Odd PF=0
JS Jump if Signed (signed) SF=1
JZ Jump if Zero ZF=1

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema con un bucle en codigo ensamblador

Publicado por Perceval.Ciro (23 intervenciones) el 29/06/2008 22:38:31
En el segundo caso hace esto

-A0100
0CC7:0100 JMP 125
0CC7:0102 db 'HOLA' 0A 0D '$'
-A125
0CC7:0125 MOV CX,000A
0CC7:0128 MOV DX,0102
0CC7:012B MOV AH,09
0CC7:012D INT 21
0CC7:012F LOOP 012D
0CC7:0131 INT 20
0CC7:0133
-g

Funciona.

Calculo que el primero es por lo mismo.
Cuando pones Loop lo que hace es Fijarse el valor de CX, y repetirlo la cantidad de veces ese valor... por lo tanto lo decrementa en una cada vez que realiza la operacion. Entonces en este codigo vale A en decimal es igual a 10... entonces la cadena 'Hola...'Etc, va a imprimirla 10 veces.

AH = 09, le indica el tipo de interrupcion que esta buscando hacer, en este caso imprimir una cadena finalizada en '$'.
Porque tenes varias funciones distintas que podes realizar con INT 21h, entonces, para distinguirlo el procesador toma como indicador el valor que tenga AH. Se entiende?

Y el JNZE, creo que era, al igual que los otros, ahi te dejo la tablita el camarada, Son para el flujo del programa, es decir haces una comparacion con los registros, de ser X condicion SALTA a determinado lugar... son Jump..

Las otras pregunta no son correctas.. espero que hayas entendido, si tienes alguna duda pregunta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema con un bucle en codigo ensamblador

Publicado por maick (1 intervención) el 23/10/2008 10:37:19
Ok mira aki te mando un codigo que realiza un bucle y dentro de ese mismo imprime el texto que desees,

-a0100
: jmp 125
-e0102 'hola mundo' 0d 0a '$'
-a0125
:mov cx,000f //cuantas veces se repetira el ciclo este es de 15
:mov dx,0102
:mov ah,09
:int 21
:int 20
-g

aparecera lo sig
hola mundo
hola mundo
hola mundo
hola mundo
hola mundo
hola mundo
hola mundo
hola mundo
hola mundo
hola mundo
hola mundo
hola mundo
hola mundo
hola mundo
hola mundo espero no haber escrito mas de 15
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar