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

时间:2009-09-01 11:20:55

标签: c assembly x86 inline-assembly access-violation

我只是测试并试图了解汇编程序如何与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中的main方法中编译它,但是当我运行它时,它会产生这个错误:

Test.exe中0x00da3660处的未处理异常:0xC0000005:访问冲突读取位置0xffffffff。

在第二行,mov es,ax //läggstartadresseni es

该程序是16位还是VS 2008将其编译成32位程序?如果是这样,你能否强迫VS 2008以不同的方式编译它?

有没有人知道一个好的内部汇编程序教程?

6 个答案:

答案 0 :(得分:4)

这是16位DOS代码,假设很多事情已经很长时间不再存在了。你应该更好地搜索其他一些教程。

答案 1 :(得分:1)

您好我发现了一个非常好的教程!它用简单的图解释了每个细节。

这正是你要找的东西:)!

http://rodrigosavage.blogspot.com/2010/07/hello-world-with-inline-asm.html

答案 2 :(得分:1)

我将您的代码重写为:

[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环境中完成。上面有更多类似的例子:

Gavin的80x86装配指南 - 第7部分:

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

答案 3 :(得分:0)

rep stosw重复将一个单词从ax存储到es:di,你的es:di是B800:0,它在保护模式下是任意的,它可能没有映射到你的程序中,所以它给出了一个分段错误。它看起来像一个古老的代码。如果你有DOS,它可能只是工作

答案 4 :(得分:0)

Windows不允许直接访问视频内存。如果您想在控制台中工作,则应使用console related API

答案 5 :(得分:0)

这是DOS代码。为了学习Win32程序集,“经典”是Iczelion的教程。看看here