11

を使用して boot.asm ファイルにファイルを含めようとしています

%include "input.asm"

しかし、コンパイルしようとするたびに、nasm がインクルード ファイルを開けないというエラーが表示されます。
input.incis 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

入力.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 に答える