Assembly Can';不要在NASM中包含文件
我尝试使用将一个文件包含到boot.asm文件中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
%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),我仍然得到