0

基本的に、NASM を使用して、使用する単純な .COM ファイルを作成しています。ファイルの 1 つ (ttcb.asm) では、画面をクリアすることから始めます。これは、別のファイルでルーチンを呼び出すことによって行われるため、%include 'video.asm'. これには、期待どおりにファイルが含まれます。%includeこのファイルをインクルードすると、別のルーチンを呼び出さなくても、元のファイル (インクルードされたファイル)のステートメントに続くものは何もvideo.asm実行されません。また、video.asm のコードが自動的に実行されていることもわかります。しかし、%includeステートメントを削除すると、すべてが正常に実行されます。video.asm のすべてを削除しようとしました、それでもうまくいきませんでした。次に、video.asm を空のファイルにしようとしましたが、うまくいきましたが、それは無意味です。次に、インクルードステートメントを移動しようとしましたが、それも失敗しました。これに対する解決策はありますか、それともサブルーチンを元のファイルに直接挿入する必要がありますか?

ttcb.asm:

[BITS 16]


section .text

%include 'video.asm'

call screen_clear

jmp $    ;should've frozen the .COM, but it didn't, meaning it failed to execute.


section .data

welcomeMsg db 'Welcome to the TitaniumCube ©.',13,10,0,'$'

section .bss

ビデオ.asm:

;===================================
;-----------------------------------
;Clears the screen to black
;No input or output
;-----------------------------------

screen_clear:
mov ah,0Fh
int 10h
push ax
mov ah,00
mov al,00
int 10h
pop ax
mov ah,00
int 10h
ret

;-----------------------------------
;===================================
4

1 に答える 1

2

COMフ​​ァイルの場合、を使用org 100hしてバイナリベースアドレスを指定します。.textセクションはコードの開始アドレスになります。したがって、メインプログラムブロックが終了した後にすべての関数を配置します。

以下はコードです。コンパイル:nasm -fbin -o ttcb.com ttcb.asm

[BITS 16]


org 100h ;set base address. must be 100h for COM files


section .text ;start of code is always start address for COM files

call screen_clear

mov ax, word welcomeMsg ;put welcomeMsg offset in register AX
;if above "org 100h" isn't specified, the above instruction would produce:
;"mov ax, 001Ch" instead of "mov ax, 011Ch"

;jmp $    ;should've frozen the .COM, but it didn't, meaning it failed to execute.
int 20h ;terminate program

%include 'video.asm'


section .data

welcomeMsg db 'Welcome to the TitaniumCube ©.',13,10,0,'$'


section .bss

PS)純粋なDOSでは、©(著作権)文字はありません。

于 2012-09-02T00:45:28.420 に答える