2016-09-04 1 views
3

Ich habe einen modularen Bootloader, mit dem ich spiele. Ich hatte das Gefühl, dass es mehr ein Schmerz sein würde, Gas zu verwenden als nasm zu portieren. Es scheint nicht so zu sein. NAsm kann die Include-Datei nicht finden. Was vermisse ich?Warum kann nasm keine Anweisungen von cmake finden

Der gesamte Code kann hier in This Github Repo

zu finden ist das Projekt Layout:

. 
├── CMakeLists.txt 
└── Failing_module 
    ├── CMakeLists.txt 
    ├── Print.inc 
    └── Stage1 
     └── Stage1.asm 

./CMakeLists.txt:

cmake_minimum_required(VERSION 3.6) 
project(fails C ASM_NASM) 
add_subdirectory(Failing_module) 

Failing_module/CMakeLists.txt:

enable_language(ASM_NASM) 
set(CMAKE_ASM_NASM_OBJECT_FORMAT bin) 

set(module_SRCS Stage1/Stage1.asm) 

set(CMAKE_NASM_LINK_EXECUTABLE nasm) 
add_executable(Stage1.bin ${module_SRCS}) 
set_target_properties(Stage1.bin PROPERTIES LINKER_LANGUAGE NASM) 
install(TARGETS Stage1.bin DESTINATION bin) 

Failing_module/Stage1/Stage1.asm:

bits 16 

jmp main 

%include "Print.inc" 
msgHello db "Hello World", 0x00 

main: 
    mov s, msgHello 
    call Print 

Failing_module/Print.inc

Print: 
    lodsb 
    or al, al 
    jz PrintDone 
    mov ah, 0x0E 
    int 0x10 
    jmp Print 
PrintDone: 
    ret 

Der Ausgang des Cmake ist folgende:

Failing_module/Stage1/Stage1.asm:6: fatal: unable to open include file `Print.inc' 
make[2]: *** [Failing_module/CMakeFiles/Stage1.bin.dir/build.make:63: Failing_module/CMakeFiles/Stage1.bin.dir/Stage1/Stage1.asm.o] Error 1 
make[1]: *** [CMakeFiles/Makefile2:86: Failing_module/CMakeFiles/Stage1.bin.dir/all] Error 2 
make: *** [Makefile:128: all] Error 2 

EDIT Sollte kompilieren mit manuellen Mitteln jetzt. Dies macht es zu einem SSCCE

+0

Sie absolut sicher, dass die genauen Dateinamen 'Print.inc' existieren speziell in' Failing_module' Verzeichnis? Selbst wenn Sie über diesen Fehler hinauskommen, wird Ihr Code nicht zusammengefügt, da dies ungültig ist. Mov si "Hello World". Sie müssen eine Zeichenkette an einer Beschriftung (nach Ihrem Code) mit 'Hallo Welt' darin erstellen und den Namen dieser Beschriftung mit etwas wie' mov si, hallo' verwenden. –

+0

Sicher, dass die Print.inc tatsächlich ist benannte das und an der richtigen Stelle. Ich habe dies als Beispiel geschrieben. Ich habe den tatsächlichen Code durch manuelle Mittel kompilieren lassen. –

+0

Sie sind sicher, dass dies die Fehlermeldung ist, die Sie erhalten, und nicht etwas anderes: Es gibt keine Möglichkeit, dass die erste NASM-Datei, die Sie angegeben haben, zusammengefügt worden wäre, da sie eine falsche Syntax hatte. –

Antwort

1

Ich glaube, das Problem hier ist, dass einige Strenge in CMake schlecht mit einem Fehler in NASM interagiert. CMake besteht darauf, dass Suchpfade (wie %include Pfade) keinen abschließenden Schrägstrich haben. nasm besteht darauf, dass Suchpfade (gegeben mit einer -I Option) einen Schrägstrich haben. CMake wird nicht geändert werden; seine Entwickler do not regard this as a CMake bug. Sie haben Recht: nasm sollte nicht bestehen, dass Include-Pfade einen abschließenden Schrägstrich haben. The nasm fault ist seit mehreren Jahren bekannt.

konnte ich durch Ausblenden des Suchpfades als normale Kompilierung Option, um dieses Problem zu umgehen:

add_compile_options(-I ${CMAKE_CURRENT_SOURCE_DIR}/) 
add_library(my_lib STATIC "my_source.asm") 
+0

Das funktioniert! zumindest im minimalen Beispiel. –

Verwandte Themen