基本上,我使用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
video.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
;-----------------------------------
;===================================
答案 0 :(得分:2)
对于COM文件,使用org 100h
指定二进制基址。 .text
部分将是代码起始地址。因此,在主程序块结束后,将所有函数放入。
以下是代码。编译:{{1}}
nasm -fbin -o ttcb.com ttcb.asm
PS)在纯DOS下,没有[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
(版权)字符。