Ne peut pas inclure un fichier dans MSNA
J'essaie d'inclure un fichier dans ma botte.asm fichier à l'aide de
%include "input.asm"
Mais à chaque fois que j'essaie de compiler, je reçois un message d'erreur indiquant que msna ne pouvez pas ouvrir le fichier include.
input.inc
EST dans le même répertoire que le démarrage.asm
J'étais à la recherche ici et sur google pour avoir des réponses, mais aucun ne m'a aidé.
Est-il une façon spéciale inclure les fichiers doivent être compilées/mise en forme avant de les inclure? Ou est-ce juste mon msna aboyer à moi?
EDIT: Voici le code:
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
d'entrée.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
Msg d'erreur:
D:\ASMT\boot.asm:14: fatal: impossible d'ouvrir le fichier include `entrée.asm'
Juste essayé avec mon MSNA version (0.98), et ça fonctionne parfaitement, comme prévu... Peut-être un bug dans votre version. Avez-vous essayé d'ajouter un .asm extension de votre .fichier inc?
Oui, peu importe ce que j'essaie il dit qu'il ne peut pas être ouvert. Inclure.inc est une réaction normale de fichier asm avec quelques étiquettes et code attaché à eux.
mon erreur, si j'ai écrit d'entrée.inc. Aussi, j'ai juste mis à jour pour MSNA 2.10.09 (a l'aide de 2.07 précédent) et j'obtiens toujours la même erreur
Peut-être essayer avec YASM à la place...
Oui, peu importe ce que j'essaie il dit qu'il ne peut pas être ouvert. Inclure.inc est une réaction normale de fichier asm avec quelques étiquettes et code attaché à eux.
%include "input.inc"
ne va pas inclure un fichier appelé Include.inc
.mon erreur, si j'ai écrit d'entrée.inc. Aussi, j'ai juste mis à jour pour MSNA 2.10.09 (a l'aide de 2.07 précédent) et j'obtiens toujours la même erreur
Peut-être essayer avec YASM à la place...
OriginalL'auteur TheMorfeus | 2013-08-06
Vous devez vous connecter pour publier un commentaire.
Il semble que
NASM
inclure les fichiers à partir du répertoire courant :Si vous êtes l'exécution de
NASM
à partir d'un autre répertoire queD:\ASMT
dans votre cas, il est normal que cela ne fonctionne pas.Source : http://www.nasm.us/doc/nasmdoc4.html#section-4.6.1
OriginalL'auteur Pierre Fourgeaud
MSNA fournit les fonctionnalités pour vous d'inclure d'autres fichiers source dans votre code. La méthode pour y parvenir est d'utiliser le
%include
directive, comme suit:%include "input.asm"
Le seul inconvénient est que, MSNA suppose que tous les fichiers sont dans le répertoire de travail en cours, par exemple, le répertoire de MSNA qui est en cours d'exécution. Si un fichier est transmis à la
%include
la directive, et le fichier ne peut pas être situé dans le répertoire de travail courant, MSNA renvoie l'erreur suivante:fatal: unable to open include file
Une solution, comme il a déjà donné dans la accepté de répondre, est de spécifier n'importe quel de plus référencé répertoires sur le MSNA de la ligne de commande, à l'aide de la
-i
option. Comme exemple, supposons qu'un "include" fichier, appelé "print_string", est situé dans le répertoire 'procedure_library', et que ce répertoire est pas MSNA 'lancer' annuaire. Dans ce cas, nous dirons simplement MSNA où il peut chercher d'autres fichiers source, comme suit:nasm -i/home/user/asmwork/procedure_library/-f elf64 -g -F dwarf sourecode.asm
*(un espace entre
-i
et le nom du chemin d'accès est autorisé, et en option).C'est la meilleure façon de maintenir les projets. Cependant, c'est plutôt une commande longue, d'autant que les frappes sont concernés. Bien que l'utilisation d'un
Makefile
permettrait de résoudre ce problème.n.b. MSNA ne comprend pas les conventions de nommage de fichiers de l'OS, il est en cours d'exécution; la chaîne que vous fournissez comme un argument de la
-i
option sera analysé exactement comme écrit. Par conséquent, le trailing slash dans l'exemple ci-dessus est nécessaire. Sous Windows, une barre oblique inverse serait tout aussi nécessaire.Noter également, le répertoire de travail, le répertoire à partir duquel vous appelez MSNA, aura encore besoin de contenir votre "main" le fichier de code source, c'est à dire la commande elle-même nécessite une entrée de fichier comme argument. Par exemple, l'invocation ci-dessus, aurait encore besoin d'un code source.asm " dans le répertoire de travail, quel que soit le supplémentaires
-i
argument d'option. Si ‘source.asm’ est de résider dans le répertoire optionnel ‘procedure_library’, MSNA serait de retourfatal: unable to open input file
. Lei
option peut être considéré comme un % la recherche de fichier en argument.............................................................................................................................................................
De coder en dur le Chemin d'accès du Fichier:
Comme une alternative à la méthode donnée, vous pouvez simplement coder en dur le chemin d'accès au fichier, directement dans le fichier source. Suffit de passer la relative ou absolue, le chemin d'accès du fichier de la
%include
directive. Par exemple:%include “/home/user/asmwork/procedure_library/input.asm”
Ou, en supposant que votre répertoire de travail courant, d'où vous appelez MSNA, est
/home/user/asmwork/
:%include “/procedure_library/input.asm"
............................................................................................................................................................
Bibliothèques Externes:
Encore une autre option, et peut-être un meilleur choix, pour la gestion de la complexité du code, serait d'assembler la procédure de la bibliothèque, de l'extérieur, comme son propre objet fichier, et le lien entre les deux fichiers lors de la création de votre programme exécutable final. Celui-ci, peut également faire vos procédures réutilisables dans différents programmes.
Rappelez-vous, vous devrez fournir à l'relatif/absolu chemin, dans votre linker script, si le fichier lié n'est pas dans le répertoire de travail. Selon le programme que vous utilisez, vous pouvez ou ne pouvez pas besoin de passer un argument supplémentaire lors de l'invocation. Éditeur de liens GNU, par exemple, ne nécessite pas d'autres arguments optionnels, il demande simplement que vous passez une pratique chemin d'accès du fichier:
executable: sourcecode.o
ld -o executable sourcecode.o /home/case/asmwork/procedure_library/input.o
............................................................................................................................................................
Directive Emplacement:
Bien que dans ce cas, il est absolument parfait pour inclure la directive n'importe où dans votre code source, il est généralement conseillé d'utiliser les
%include
directive près du haut de votre code source. Considérons par exemple si vous avez été d'inclure un fichier de macro, eh bien, dans ce cas MSNA vous remettre une erreur, le long des lignes deerror: parser: instruction expected
, comme toutes les macros doivent être entièrement défini avant ils sont invoqués.OriginalL'auteur Andrew Hardiman