質問

win32でx86アセンブリの学習を始めたばかりで、.asmファイルのideに付属するカスタムビルドルールを使用してVisual Studio 2008でmasmを使用しました。 DOS割り込みを使用してコンソールに印刷しようとしましたが、代わりに次のメッセージが表示されます。 8行目。単一のASCII文字「A」(41h)を出力しようとしています。masmコードは次のとおりです。

.386
.MODEL flat, stdcall

.CODE
start:
    mov dl, 41h
    mov ah, 2
    int 21h
    ret
end start

debug.exeを使用し、「a」コマンドを使用してすべての.CODE命令を入力し、実行(「g」)すると、正常に動作します。

DOS割り込みを正しく使用する方法を教えてもらえますか?ありがとう!

編集:win32でプログラミングする場合、Managuは、DOS割り込みを使用する代わりに、WriteConsoleAのようなWindows API呼び出しを使用するのが正しいと考えています。 これは有用なリソースでした。誰かがこれを行うためのコードを探している場合(私がそうであったように)、ここにあります:

.386
.MODEL flat, stdcall

; Windows API prototypes
GetStdHandle proto :dword
WriteConsoleA proto :dword, :dword, :dword, :dword, :dword
ExitProcess proto :dword

STD_OUTPUT_HANDLE equ -11

.DATA
HelloWorldString db "hello, world", 10, 0

.CODE

strlen proc asciiData:dword
    ; EAX used as count, EBX as ascii char pointer, EDX (DL) as ascii char
    mov eax, -1
    mov ebx, asciiData
    mov edx, 0

    BeginLoop:
    inc eax       ; ++count (init is -1)
    mov dl, [ebx] ; *dl = *asciiptr
    inc ebx       ; ++asciiptr
    cmp dl, 0     ; if (*dl == '\0')
    jne BeginLoop ; Goto the beginning of loop

    ret
strlen endp

main proc
    invoke GetStdHandle, STD_OUTPUT_HANDLE
    mov ecx, eax
    invoke strlen, addr HelloWorldString
    invoke WriteConsoleA, ecx, addr HelloWorldString, eax, 0, 0
    ret
main endp

end

(エントリポイントをメインに設定)

役に立ちましたか?

解決

debug.exeを使用してこのコードを入力すると、16ビット(8086アーキテクチャ、「リアルモード」)dosプログラムが組み立てられます。指定したセマンティクスは、このようなプログラムに適しています。ただし、ここで入手したプログラムをMASMでアセンブルしてからリンクすると、32ビット(i386アーキテクチャ、「保護モード」)Windowsプログラムを作成しようとしています。誤解される可能性はありますが、後者の場合はint 21hを合法的に呼び出すこともできないと思います。

他のヒント

「ret」命令が原因で発生する可能性があります。どこに戻りますか?記憶の中の未知の場所だと思います。

代わりに、int 20hを使用してみてください。それは" gracefully。"

を終了します。

(おそらく)デバッグで動作するのは、それがより「管理」されているためです環境。

16ビットDOS-*。comアプリケーションを起動すると、DOSは" int 20"のオペコードを入力します。 PSP内のオフセット0の命令と追加のDOSは、DOSがアプリケーションを実行する前にスタックにゼロの単語をプッシュします。したがって、単純な「ret」を配置できます。コードの最後の命令。ただし、スタックポインターが破損しておらず、コードセグメントが変更されていないことを確認する必要があります。

MASM 6+を使用して16ビットアプリケーションをリンクするには、16ビットリンカーが必要です。

ftp://ftp.microsoft.com/softlib/mslfiles/lnk563.exe

Dirk

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top