0

我只是在测试并尝试学习汇编程序如何与 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ägg startadressen i es

难道程序是16位的,VS 2008编译成32位的程序?如果是这样,您可以强制 VS 2008 以不同方式编译它吗?

有谁知道一个好的内部汇编教程?

4

6 回答 6

4

它是 16 位 DOS 代码,假设很多事情在很长一段时间内都不再正确。您最好搜索其他一些教程。

于 2009-09-01T11:26:49.813 回答
1

您好,我找到了一个非常好的教程!它用简单的图表解释了每个细节。

这正是您正在寻找的:)!

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

于 2010-07-16T02:39:58.980 回答
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

于 2011-01-18T05:26:51.117 回答
0

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

于 2009-09-01T11:34:43.790 回答
0

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

于 2009-09-01T11:36:22.133 回答
0

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

于 2009-09-01T11:47:14.810 回答