2009-09-01 10 views
0

とCを使用して、私はちょうどので、私はいくつかのチュートリアルを中心に閲覧したと私は、この発見テストとアセンブラは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を読み取るアクセス違反。 2行目

、MOV ES、斧//läggstartadressen I ES

それはプログラムが16ビットであることと、VS 2008は、32ビットのプログラムにコンパイルしていることだろうか?もしそうなら、あなたはそれを別にコンパイルするようにVS 2008を強制することができますか?

誰も良い内部アセンブラチュートリアルを知っていますか?

+1

誰もが彼らに –

答えて

4

これは長い間真実ではない多くのことを前提とした16ビットのDOSコードです。他のチュートリアルを探してみてください。

+0

を理解できるように、英語にコメントを翻訳してください誰もが良いを知っています内部アセンブラチュートリアル? – Patrick

+0

私はそれを学んだので、それは長い時間です。私が正しく覚えていれば、Randall HydeのAssembly Languageの芸術は、たとえその作者がペットを覗いていたとしても、悪くはありませんでした。 http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/index.html彼の現在のウェブ上の場所に見える – AProgrammer

0

rep stoswはaxからes:diへの単語の格納を繰り返し、es:diは保護モードでは任意で、プログラムにはマップされない可能性があります。それは古代のコードのように見えます。 DOSをお持ちの場合は、正常に動作するかもしれません。

0

Windowsはビデオメモリに直接アクセスできません。コンソールで作業する場合は、console related APIを使用してください。

0

これはDOSコードです。 Win32アセンブリを学ぶために、「古典」はIczelionのチュートリアルです。ありがとうございましたhere

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環境内で行われます。 80×86アセンブリへ

ギャビン・ガイド - パート7:ここで上記にさらに多くの同様の例があります

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