[英]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部分:
rep stosw重復存儲從ax到es:di的單詞,並且您的es:di是B800:0,在保護模式下是任意的,並且可能未映射到程序中,因此會產生分段錯誤。 它看起來像一個古老的代碼。 如果您使用DOS,則可能會正常工作
Windows不允許直接訪問視頻內存。 如果要在控制台中工作,則應使用與控制台相關的API 。
這是DOS代碼。 對於學習Win32匯編,“經典”是Iczelion的教程。 在這里看看
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.