Programación General > ASM (Ensamblador)
Duda programa con desplazamiento de bloque en pantalla!
Eternal Idol:
--- Cita de: "Santi-Sfe" ---Muchas gracias, ahora cuando termino un par de ejercicios que me quedan me pongo con ese. Otra consulta, estoy haciendo un programa ahora que lea cuantas E hay en modo texto 80*25. Tengo lo siguiente, queria saber si estaba bien:
--- Fin de la cita ---
Bueno, esto no es un programa en realidad, sino instrucciones que ejecutas desde el depurador (debug).
--- Cita de: "Santi-Sfe" ---mov cx,7d0
mov ax,b800
mov ds,ax
xor bx,bx
pop ax
ds:
mov ah,[bx]
cmp ah,45
jnz 114
inc dx
add bx,2
push ax
loop 10a
int 20
--- Fin de la cita ---
El registro dx tiene un valor indefinido cuando lo incrementas - es cierto que el depurador le da como valor 0, pero en un programa eso no pasa - , tenes que ponerlo a cero al principio (xor dx, dx) para que al final tenga sentido. No estas preservando bien ax, tenes que ponerlo en la pila ANTES de modificarlo y restaurarlo cuando termine el bucle.
--- Cita de: "Santi-Sfe" ---Y ademas preguntar como hacer correr el programa haciendo que me queden guardados los resultados en los registros, yo lo corro con "g" pero no me guarda los resultados en los registros "r". Saludos!
--- Fin de la cita ---
En dx tendras el valor el numero de letras E encontradas.
Asi quedaria en un programa (fragmento):
--- Código: Text ---push axmov cx,7d0mov ax,0b800hmov ds,axxor bx,bxxor dx, dxbucle:mov ah,[bx]cmp ah,045hjnz seguiinc dxsegui:add bx,2loop buclepop ax
Santi-Sfe:
Si ahora que lo veo me di cuenta de mis errores, el xor dx,dx si faltaba, ahora los aperadores push y pop estan al reves pero en buena ubicacion, acordate que en ax guardaba la posicion B800 y cuango hago ds:mov ah,[bx] lo estoy modificando por eso estan bien ubicados.
Y otra cosa un programa es un conjuntos de instrucciones/receta/pasos a seguir para realizar una tarea especifica (definicion burda), si bien no sera "El Programa", es un programita jaja.
Gracias por tu atencion!
Eternal Idol:
--- Cita de: "Santi-Sfe" ---Si ahora que lo veo me di cuenta de mis errores, el xor dx,dx si faltaba, ahora los aperadores push y pop estan al reves pero en buena ubicacion, acordate que en ax guardaba la posicion B800 y cuango hago ds:mov ah,[bx] lo estoy modificando por eso estan bien ubicados.
--- Fin de la cita ---
Primero te habia respondido como seguir esa logica (tal como decis push al principio del bucle y pop justo antes del loop) y que ax fuera B800 siempre que hicieras mov ah,[bx] pero despues me di cuenta de que no tiene sentido ya que no necesitas que ax tenga ningun valor en particular, para eso esta DS, vos no lees de ax:dx sino de ds:dx y por lo tanto podes hacer lo que quieras con ax (el prefixo ds es redundante ya que es el por defecto en este caso, por eso lo saque en mi codigo, sacalo y al depurar el programa vas a ver que en la instruccion mov debug sigue mostrando a la derecha DS:0000=X; tambien podes ver la diferencia con las instrucciones mov ah, ds:[bx] y mov ah,cs:[bx], la primera no usa ningun prefijo y la segunda si). Otra cosa es restaurar el valor original del segmento de datos cosa que se logra tal como te mostre.
--- Cita de: "Santi-Sfe" ---Y otra cosa un programa es un conjuntos de instrucciones/receta/pasos a seguir para realizar una tarea especifica (definicion burda), si bien no sera "El Programa", es un programita jaja.
Gracias por tu atencion!
--- Fin de la cita ---
Me refiero a que no generas un programa ejecutable con un ensamblador.
Navegación
[*] Página Anterior
Ir a la versión completa