Assembly Can';不要在NASM中包含文件

Assembly Can';不要在NASM中包含文件,assembly,nasm,Assembly,Nasm,我尝试使用将一个文件包含到boot.asm文件中 %include "input.asm" 但每次我试图编译它时,都会收到一个错误,说明nasm无法打开包含文件。 input.inc与boot.asm位于同一目录中 我在这里和谷歌上寻找答案,但没有一个能帮到我 在包含文件之前,是否有一种特殊的方法来编译/格式化包含文件?还是只是我的鼻涕在对我吠叫 编辑:以下是包含的代码: mov ax, 0x07C0 ; set up segments mov ds, ax mov es, ax mo

我尝试使用将一个文件包含到boot.asm文件中

%include "input.asm"
但每次我试图编译它时,都会收到一个错误,说明nasm无法打开包含文件。
input.inc
与boot.asm位于同一目录中 我在这里和谷歌上寻找答案,但没有一个能帮到我

在包含文件之前,是否有一种特殊的方法来编译/格式化包含文件?还是只是我的鼻涕在对我吠叫

编辑:以下是包含的代码:

mov ax, 0x07C0  ; set up segments
mov ds, ax    mov es, ax
mov si, welcome
call print_string
mov si, welcome2    
call print_string    
mov si, welcome4    
call print_string  
jmp .mainloop

%include 'input.asm'
mainloop:    ;loop here
input.asm:

 ; ================
 ; calls start here
 ; ================

 print_string:
   lodsb        ; grab a byte from SI

   or al, al  ; logical or AL by itself
   jz .done   ; if the result is zero, get out

   mov ah, 0x0E
   int 0x10      ; otherwise, print out the character!

   jmp print_string

 .done:
   ret

 get_string:
   xor cl, cl

 .loop:
   mov ah, 0
   int 0x16   ; wait for keypress

   cmp al, 0x08    ; backspace pressed?
   je .backspace   ; yes, handle it

   cmp al, 0x0D  ; enter pressed?
   je .done      ; yes, we're done

   cmp cl, 0x3F  ; 63 chars inputted?
   je .loop      ; yes, only let in backspace and enter

   mov ah, 0x0E
   int 0x10      ; print out character

   stosb  ; put character in buffer
   inc cl
   jmp .loop

 .backspace:
   cmp cl, 0    ; beginning of string?
   je .loop ; yes, ignore the key

   dec di
   mov byte [di], 0 ; delete character
   dec cl       ; decrement counter as well

   mov ah, 0x0E
   mov al, 0x08
   int 10h      ; backspace on the screen

   mov al, ' '
   int 10h      ; blank character out

   mov al, 0x08
   int 10h      ; backspace again

   jmp .loop    ; go to the main loop

 .done:
   mov al, 0    ; null terminator
   stosb

   mov ah, 0x0E
   mov al, 0x0D
   int 0x10
   mov al, 0x0A
   int 0x10     ; newline

   ret

 strcmp:
 .loop:
   mov al, [si]   ; grab a byte from SI
   mov bl, [di]   ; grab a byte from DI
   cmp al, bl     ; are they equal?
   jne .notequal  ; nope, we're done.



   cmp al, 0  ; are both bytes (they were equal before) null?
   je .done   ; yes, we're done.

   inc di     ; increment DI
   inc si     ; increment SI
   jmp .loop  ; loop!

 .notequal:
   clc  ; not equal, clear the carry flag
   ret

 .done:     
   stc  ; equal, set the carry flag
   call print_string
   ret
错误消息:

D:\ASMT\boot.asm:14:致命:无法打开包含文件'input.asm'


似乎
NASM
包含当前目录中的文件:

在当前目录(运行NASM时所处的目录,而不是NASM可执行文件的位置或源文件的位置)以及使用-i选项在NASM命令行上指定的任何目录中搜索包含文件

如果您正在从另一个目录执行
NASM
,在您的情况下,该目录是
D:\ASMT
,则它不工作是正常的


源代码:

NASM为您提供了将其他源文件包含到代码中的功能。实现这一点的方法是使用
%include
指令,如下所示:

%包括“input.asm”

需要注意的一点是,NASM假设所有文件都在当前工作目录中,例如,运行NASM的目录。如果文件被传递到
%include
指令,并且该文件无法在当前工作目录中找到,NASM将返回以下错误:

致命:无法打开包含文件

一种解决方案(已在接受的答案中给出)是使用
-i
选项在NASM命令行上指定任何额外引用的目录。例如,假设一个名为“print_string”的“include”文件位于“procedure_library”目录中,并且该目录不是NASM的“launch”目录。在本例中,我们只需告诉NASM在哪里可以查找其他源文件,如下所示:

nasm-i/home/user/asmwork/procedure\u library/-f elf64-g-f dwarf sourecode.asm

*(允许在
-i
和路径名之间留空格,可选)

这是维护项目的首选方法。然而,就击键而言,这是一个相当长的命令。尽管如此,使用
Makefile
可以解决这个问题

n、 b.NASM不了解其运行的操作系统的文件命名约定;作为
-i
选项的参数提供的字符串将被完全按照所写内容进行解析。因此,上述示例中的尾部正斜杠是必要的。在Windows下,同样需要一个尾随的反斜杠

另外请注意,工作目录(您从中调用NASM的目录)仍需要包含“main”源代码文件,即命令本身需要输入文件作为参数。例如,上述调用仍然需要工作目录中的“sourcecode.asm”,而不考虑附加的
-i
选项参数。如果“sourcecode.asm”驻留在可选目录“procedure\u library”中,NASM将返回
致命:无法打开输入文件
i
选项可以看作是%include文件搜索参数


硬编码文件路径:

作为给定方法的替代方法,您可以直接在源文件中硬编码文件路径。只需将文件的相对或绝对路径传递给
%include
指令即可。例如:

%include”/home/user/asmwork/procedure\u library/input.asm“

或者,假设调用NASM的当前工作目录是
/home/user/asmwork/

%include”/procedure\u library/input.asm“


外部库:

管理代码复杂性的另一个选择,也许是更好的选择,是在外部将过程库组装为自己的目标文件,并在创建最终可执行程序时链接这两个文件。后者还可以使过程在不同程序之间可重用

请记住,如果要链接的文件不在工作目录中,则需要在链接器脚本中提供相对/绝对路径。根据您使用的程序,您可能需要也可能不需要在调用过程中传递其他参数。例如,GNU链接器不需要任何其他可选参数,它是ply要求您传递一个可行的文件路径:

可执行文件:sourcecode.o ld-o可执行文件sourcecode.o/home/case/asmwork/procedure\u library/input.o


指令位置:


尽管在您的源代码中任何地方都包含指令是完全正确的,但是通常使用“<代码> %”包含在源代码顶部的指令是很好的做法。例如,如果您要包含宏文件,那么,在这种情况下,NASM会给您一个错误,沿着<代码>或者:parser:instruction应为,因为在调用所有宏之前必须完全定义它们。

刚刚在我的NASM版本(0.98)中试用过,它工作正常,正如预期的那样…可能是您版本中的一个错误。您是否尝试过向.inc文件添加.asm扩展名?是的,无论我尝试了什么,它仍然表示无法打开。Include.inc是一个普通的asm文件,附带了一些标签和代码。
%Include“input.inc“
不会包含名为
include.inc
@CharlesBailey的文件,我的错误是,我应该在那里写input.inc。另外,我刚刚更新到NASM 2.10.09(使用的是2.07 prev),我仍然得到