繁体   English   中英

将C与内联汇编程序初学者问题一起使用

[英]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部分:

http://stuff.pypt.lt/ggt80x86a/asm8.htm

rep stosw重复存储从ax到es:di的单词,并且您的es:di是B800:0,在保护模式下是任意的,并且可能未映射到程序中,因此会产生分段错误。 它看起来像一个古老的代码。 如果您使用DOS,则可能会正常工作

Windows不允许直接访问视频内存。 如果要在控制台中工作,则应使用与控制台相关的API

这是DOS代码。 对于学习Win32汇编,“经典”是Iczelion的教程。 在这里看看

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM