[英]Using C with inline assembler beginner problem
我只是在测试并试图了解汇编程序如何与C配合使用。所以我在浏览一些教程时发现:
__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
}
我的问题是我无法运行它,可以在Microsoft Visual Studio 2008的主要方法中编译它,但是当我运行它时,它会产生此错误:
Test.exe中0x00da3660处未处理的异常:0xC0000005:访问冲突读取位置0xffffffff。
在第二行上,mov es,ax // //开始播放
可能是该程序是16位的,而VS 2008将其编译为32位程序吗? 如果是这样,您可以强制VS 2008进行不同的编译吗?
有人知道好的汇编程序内部教程吗?
它是16位DOS代码,假定很多事情在很长一段时间不再是真的。 您最好搜索其他教程。
您好,我找到了一个很好的教程!,它用简单的图表说明了每个细节。
这正是您要寻找的:)!
http://rodrigosavage.blogspot.com/2010/07/hello-world-with-inline-asm.html
我将您的代码重写为:
[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
然后将其另存为xxx.asm,并使用“ nasm xxx.asm”进行编译,然后在kvm中运行该程序:“ kvm xxx”,或者也可以将其“ dd”安装到硬盘上,并直接从代码和看到它运行。 全部在Ubuntu环境中完成。 这里还有更多与上述类似的示例:
加文的80x86汇编指南-第7部分:
rep stosw重复存储从ax到es:di的单词,并且您的es:di是B800:0,在保护模式下是任意的,并且可能未映射到程序中,因此会产生分段错误。 它看起来像一个古老的代码。 如果您使用DOS,则可能会正常工作
Windows不允许直接访问视频内存。 如果要在控制台中工作,则应使用与控制台相关的API 。
这是DOS代码。 对于学习Win32汇编,“经典”是Iczelion的教程。 在这里看看
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.