Usando C con un problema en línea principiante ensamblador
-
20-09-2019 - |
Pregunta
Estoy probando y tratando de aprender cómo funciona el ensamblador con C. Así que estaba navegando en torno a algunos tutoriales y me encontré esto:
__asm
{
mov ax,0B800h //startaddress for the screen memory (in textmode)
mov es,ax //add the startaddress to es
xor di,di //reset di (start at the beginning of the screen)
mov al, 65 //65 = ascii for the 'A' character to al
mov ah, 16*4+1 //Attribute = blue text on a red background to ah.
mov cx,2000 //25*80 = 2000 characters on the screen
rep stosw //write ax to the screen memory and count di up 2000 times
}
El problema que tengo es que no puedo correr, puedo compilar dentro de mi método principal de Microsoft Visual Studio 2008, pero cuando lo ejecuto, se produce este error:
Excepción no controlada en 0x00da3660 en Prueba.exe: 0xc0000005:. Acceso violación lectura de ubicación 0xffffffff
en la segunda línea, es mov, hacha // Añadir A startadressen i es
¿Es posible que el programa es de 16 bits y que VS 2008 compila en un programa de 32 bits? Si es así, se puede forzar VS 2008 para compilar de manera diferente?
¿Alguien sabe de un buen tutorial ensamblador dentro?
Solución
Es de 16 bits de código DOS asumiendo una gran cantidad de cosas que no son verdad ya desde hace mucho tiempo. Usted debe mejor buscar algún otro tutorial.
Otros consejos
Hola He encontrado un tutorial muy bueno !, se explica con diagramas simples cada detalle.
Es exactamente lo que busca:!)
http://rodrigosavage.blogspot.com /2010/07/hello-world-with-inline-asm.html
vuelvo a escribir el código como:
[BITS 16]
[ORG 7C00h]
main:
mov ax,0B800h
mov es,ax
xor di,di
mov al, 65
mov ah, 16*4+1
mov cx,2000
rep stosw
times 510-($-$$) db 0
dw 0xAA55
A continuación, guardarlo como xxx.asm, y compilarlo usando "nasm xxx.asm", y posteriormente ejecutar este KVM en el interior: "xxx KVM", o puede también "dd" en su disco duro y arrancar directamente desde el el código y ver en funcionamiento. Todo se hace dentro de entorno de Ubuntu. Hay muchos ejemplos más similar a la anterior aquí:
Guía de Gavin a Asamblea 80x86 - Parte 7:
rep stosw repite almacenar una palabra de hacha ES: DI, y sus ES: DI es B-800: 0, lo que es arbitrario en modo protegido y no puede ser mapeada en su programa, por lo que da un fallo de segmentación. Se parece a un antiguo código. Si tiene DOS, que sólo podría trabajar
Windows no permite el acceso directo a la memoria de vídeo. Si quieres trabajar en la consola, se debe utilizar consola API relacionada.
Este es el código de DOS. Para el aprendizaje de montaje Win32, los 'clásicos' son tutoriales de Iczelion. Echar un vistazo aquí