0

基本上,我使用 NASM 创建简单的 .COM 文件来使用。对于其中一个文件(ttcb.asm),它从清除屏幕开始。这是通过调用另一个文件中的例程来完成的,所以我使用了%include 'video.asm'. 这包括预期的文件。当我包含此文件时,即使我不调用单独的例程%include,原始文件(包含的文件)中的语句之后也不会执行任何其他操作。video.asm我还看到 video.asm 中的代码会自动执行。但是当我删除该%include语句时,一切运行正常。我什至尝试删除video.asm 中的所有内容,但它仍然没有工作。然后我尝试将 video.asm 制作为一个空白文件,并且它起作用了,但这毫无意义。然后我尝试移动 include 语句,但也失败了。有什么解决方案,还是我必须将子程序直接插入到原始文件中?

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 回答