elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Duda en Ejemplo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda en Ejemplo  (Leído 4,368 veces)
Binary_Death

Desconectado Desconectado

Mensajes: 214



Ver Perfil
Duda en Ejemplo
« en: 10 Julio 2010, 21:37 pm »

Verán... he comprado el libro "Ensamblador para DOS, Linux y Windows" de Francisco Charte Ojeda, y estoy cursando el quinto capítulo.
En él, hay el código fuente de un programa en ensamblador y el mismo programa ya compilado. Dicho programa lo testeé en Windows XP y Windows Vista, y en ambos NO funciona. De lo que estoy seguro es de que el ejemplo del libro, definitivamente no puede estar errado.
Bien, les comento mi duda. El ejemplo trata sobre el acceso al segmento de pantalla de DOS: 0B800h. En la explicación cuenta que en ese segmento, el desplazamiento 0 contiene el código de carácter a escribir, el 1 el atributo del caracter, el 2 el siguiente código de carácter y el 3 el atributo de éste.
Antes de proseguir les dejaré el código de ejemplo del libro:

Código:

        ; Definimos el segmento de datos
        segment Datos
       
; definiendo varios campos
Asterisco db '*'
Blanco    db 0f0h
Posicion  dw 3280 ; l:20,c:40
Valor32   dd 0       

        ; Segmento para la pila
        segment Pila stack
          resb 256
InicioPila:

        ; Segmento de código
        segment Codigo
..start:

        ; inicializamos ds
        mov ax, Datos
        ; para acceder a los datos
        mov ds, ax

        ; preparamos el registro es
        ; para acceder al segmento
        ; donde está el contenido de
        ; la pantalla       
        mov ax, 0b800h
        mov es, ax

        ; recuperamos en AL el
        ; valor que hay en Asterisco
        mov al,[Asterisco]
       
        ; en AH el color
        mov ah,[Blanco]

        ; y en BX la posición
        mov bx,[Posicion]

        ; transferimos el contenido
        ; de AX a la dirección ES:BX
        mov [es:bx], ax

        ; escribimos directamente en
        la pantalla un valor inmediato
        mov word [es:5*160+35*2], 00a41h
       
        ; salimos al sistema
        mov ah, 4ch
        int 21h

AX se descompone en AH y AL, que contienen los bits más y menos significativos respectivamente, ¿cierto? Bien, si fuera como el libro dijo, en AH debería situarse el código del carácter y en AL su atributo. Pero no es así, sino al revés. La duda es precisamente esa, ¿por qué?

Y no estaría de más que alguien me pudiera decir por qué no me funciona en mi sistema, porque me encataría testear los ejemplos =/

En fin, ¡gracias y saludos!


En línea

Debci
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


Ver Perfil WWW
Re: Duda en Ejemplo
« Respuesta #1 en: 10 Julio 2010, 22:36 pm »

Se que puede parecer una tonteria mi respuesta, pero no tendra algo que ver little endian?

Saludos


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Duda en Ejemplo
« Respuesta #2 en: 11 Julio 2010, 01:07 am »

Usa una maquina virtual con MS-DOS, un MS-DOS real o DosBox tal vez, para probarlo.

Tiene que ver que sea little endian:
http://en.wikipedia.org/wiki/Endianness
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
Binary_Death

Desconectado Desconectado

Mensajes: 214



Ver Perfil
Re: Duda en Ejemplo
« Respuesta #3 en: 11 Julio 2010, 01:20 am »

Está bien, creo que comprendí.
Si AH vale, por ejemplo, 04 y AL, por ejemplo, FF, al mover esos datos a una posición de memoria, son almacenados en orden inverso, de forma que quedaría FF04h. ¿Estoy en lo cierto? Mmm... eso me pareció entender...
En línea

Debci
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


Ver Perfil WWW
Re: Duda en Ejemplo
« Respuesta #4 en: 11 Julio 2010, 11:07 am »

Está bien, creo que comprendí.
Si AH vale, por ejemplo, 04 y AL, por ejemplo, FF, al mover esos datos a una posición de memoria, son almacenados en orden inverso, de forma que quedaría FF04h. ¿Estoy en lo cierto? Mmm... eso me pareció entender...
Eso es lo que sugeri pero no me hagas mucho caso, no tengo mucha idea de ASM...

Saludos
En línea

Binary_Death

Desconectado Desconectado

Mensajes: 214



Ver Perfil
Re: Duda en Ejemplo
« Respuesta #5 en: 15 Julio 2010, 22:04 pm »

En fin, muchas gracias por la ayuda. Imagino que algo así será.
Saludos!
En línea

ño_ño

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Duda en Ejemplo
« Respuesta #6 en: 15 Julio 2010, 22:42 pm »

Código:
mov AX, 0
mov DS, AX
mov BX, 0B8000h
mi_apodo:
   db "Binary_Death"
fin_mi_apodo:
mov CX, mi_apodo
imprimir_mi_apodo:
mov AL, [DS:CX]
mov byte [DS:BX], AL
add BX, 2
inc CX
cmp CX, fin_mi_apodo
jne imprimir_mi_apodo
;Aqui sales del entorno como te dice el libro

Eso si, tal vez debas calcular una que otra direcciones de memoria, pero ahi no te puedo ayudar mucho, porque no trato con entorno de OS, y nunca me he interesado por como se debe hacer.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda c_str() en ejemplo libro Prata
Programación C/C++
skan 7 4,017 Último mensaje 14 Agosto 2013, 18:14 pm
por 0xDani
Duda con ejemplo del libro k&r
Programación C/C++
fruz 3 2,177 Último mensaje 21 Abril 2019, 23:51 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines