我只是测试并试图了解汇编程序如何与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以不同的方式编译它?
有没有人知道一个好的内部汇编程序教程?
答案 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部分:
答案 3 :(得分:0)
rep stosw重复将一个单词从ax存储到es:di,你的es:di是B800:0,它在保护模式下是任意的,它可能没有映射到你的程序中,所以它给出了一个分段错误。它看起来像一个古老的代码。如果你有DOS,它可能只是工作
答案 4 :(得分:0)
Windows不允许直接访问视频内存。如果您想在控制台中工作,则应使用console related API。
答案 5 :(得分:0)
这是DOS代码。为了学习Win32程序集,“经典”是Iczelion的教程。看看here