簡體   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