11

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

%include "input.asm"

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

在包含之前是否应该编译/格式化包含文件的特殊方式?或者它只是我的 nasm 对我吠叫?

编辑:这是包含的代码:

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

输入.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'

4

2 回答 2

14

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

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

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

来源: http: //www.nasm.us/doc/nasmdoc4.html#section-4.6.1

于 2013-08-06T11:41:29.367 回答
10
于 2018-08-09T16:06:08.703 回答