Ensamblador - Necesito Ayuda deun Experto en ASM, 2 parte

 
Vista:

Necesito Ayuda deun Experto en ASM, 2 parte

Publicado por Yo de nuevo, Sebastian (1 intervención) el 17/09/2000 00:00:00
Primero q todo quiero dar las gracias pedro pablo que me respondio y me ayudo en la pregunta del joystick.

bueno ahora necesito ayuda de algun amigo ensambladero.

I) Estoy en busca de alguna int que pueda visualizar la memoria del pc, osea, que con un programa en asm pueda revizar y mostrar las localidades de memoria, pero yo se q asm trabaja con segmentos de memoria y aun no encuento la forma de visualizar, yo que el DEBUG visualiza las zonas pero yo necesito hacer lo mismo pero con un programa de asm.

II) amigo ensambladero necesito la ayuda de como puedo colocar un simbolo o letra en una area especifica de la memoria de video.
la area de memoria de video es del 0A000H hasta 0AFFFh??????? si o no


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

Respuesta parte I

Publicado por Pedro Pablo (21 intervenciones) el 17/09/2000 00:00:00
Vaya, me alegro que mi explicación te haya servido de ayuda. A ver si logro que esta también
te ayude ;-)

Respecto a la primera pregunta, no hay ninguna interrupción para poder acceder... simplemente
accedes y obtienes el valor almacenado. Lo de representarlo es cosa del propio programa.
En ASM se trabaja, en efecto, con segmentos. Pero puedes trabajar con el segmento que
quieras: para eso están los registro de semento (CS, DS, ES y SS). Cada dirección de
memoria se identifica con un par segmento:desplazamiento, por ejemplo
A000:C057

El procesador lo utiliza para acceder a memoria. Para eso, multiplica el segmento por 16
(le "añade" un 0 más a la derecha en hexadecimal) y le suma el desplazamiento:
A0000
C057 +
---------
AC057 <--- Dirección real a la que se accede

(así una misma dirección se puede acceder de varias formas, por ejemplo la anterior también
se accede con A001:C047)

Para acceder a cualquier valor, primero tienes que establecer en el registro de segmento que
vayas a utilizar para acceder a la memoria el valor del segmento. Por defecto, al acceder a la
memoria se usa el registro DS, por lo que cargaremos en DS el valor:
MOV AX, 0A000h
MOV DS, AX

(no vale MOV DS, 0A000h directamente...)

luego accedes al valor del desplazamiento:
MOV AX, [C057]

Si el segmento estuviera en ES, sería MOV AX, ES:[C057]

Una vez que tienes en AX el valor, te toca a tí pasarlo a caracteres para mostrarlo.
Puedes hacer esto utilizando el módulo 10 y metiendo cada resultado en la pila. Cuando
acabes, vas sacando los resultados y tendrás los dígitos de izquierda a derecha. Para
obtener el valor del caracter en ASCII le sumas al valor 30h y ya está. Si quieres mostrarlo
en hexadecimal puedes hacer lo mismo con módulo 16h (o mejor aún, utilizar rotaciones y
AND´s para ir obteniendo los valores de cada grupo de 4 bits) y luego mostrar el número
utilizando lo anterior, pero vigilando que si el valor supera el 9 tienes que sumarle 55d
(para que el 10 sea la A, el 11 la B, etc).
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

Respuesta parte II

Publicado por Pedro Pablo (21 intervenciones) el 17/09/2000 00:00:00
Respecto a la segunda pregunta, la respuesta es no. La posición de la memoria de video
varía según el modo de video.
En modo 13h (un modo gráfico) está en el segmento A000h. En los modos de texto suele estar
en el segmento B800h. Para poner una letra accediendo a memoria fácilmente, el modo tiene
que ser de texto (por ejemplo, modo 03h). La memoria de video asigna dos bytes para cada
letra: el primero para el valor ASCII de la letra, y el segundo para el color (del cual los
cuatro bits bajos son el del caracter, y los cuatro altos el del fondo). Así, si quieres poner
una A en la esquina superior izquierda en blanco con fondo negro:
MOV AX,0B800h
MOV ES,AX
MOV WORD PTR ES:[0], 0F41h

y si es a su derecha:
...
MOV WORD PTR ES:[2], 0F41h

Por supuesto, también puedes usar DS. Cargarías en DS el valor del segmento, y luego
no tienes que poner DS:, pues se asume que se utiliza ese registro de segmento.
Además, tienes que tener cuidado porque estamos poniendo dos bytes de golpe en la
memoria, y el Intel las mete al revés: en vez de poner el byte 0Fh en la posición 0 de
memoria y el byte 41h en la posición 1 del segmento, lo hace al revés. Eso pasa por
almacenar de golpe una palabra de 16 bits y por el modo de almacenar los dos bytes que
tiene el procesador, dentro de la memoria.

Otra cosa más. Esto solo lo puedes hacer en modo texto, en el que la tarjeta gráfica
interpreta como letras y colores los valores almacenados. En los modos gráficos se
interpretan como pixeles, por lo que poner una letra supone "dibujarla" con pixeles, lo que
supone numerosos accesos a memoria, además de una tabla de caracteres.

Una última observación. Si estas utilizando ensamblador desde C o Pascal... o desde cualquier
otro lenguaje de alto nivel, tienes que tener mucho cuidado con los cambios de los registros
de segmento. Los registros de segmento se utilizan para acceder a los datos, por lo que
si el compilador no cuenta con los posibles cambios en sus valores, podría fallar el
programa (al acceder a las variables globales estaría accediendo a un segmento erróneo,
por lo que podrías hacer fallar todo el programa, e incluso colgar el ordenador).

Espero haberte ayudado.
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:Respuesta parte II

Publicado por danny gardhell (1 intervención) el 10/12/2000 00:00:00
oye de casualidad no tienes un programa de programacion hibrida de lo mas sencillo que tengas mandamelo ya ejecutado los obj y los fuente sale por favor
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