在原始文件中包含单独的文件会导致原始文件无法运行

时间:2012-09-01 15:27:39

标签: assembly x86 dos nasm

基本上,我使用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

;-----------------------------------
;===================================

1 个答案:

答案 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 (版权)字符。