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のメインメソッド内でコンパイルできますが、実行すると次のエラーが発生します:

Test.exe の 0x00da3660 で未​​処理の例外: 0xC0000005: アクセス違反の読み取り場所 0xffffffff。

2 行目 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 に答える