Я пытаюсь сделать простую программу сборки, которая печатает "Hello!"один раз, ждет одну секунду, затем печатает снова.Поскольку функции сна относительно сложны в сборке, и я не очень хорош в этом, я решил, что использование C ++ было бы подходящим способом для создания функции Sleep.Вот программа на C ++:
// Sleep.cpp
#include <thread>
#include <chrono>
void Sleep(int TimeMs) {
std::this_thread::sleep_for(std::chrono::milliseconds(TimeMs));
}
Затем я скомпилировал эту функцию сна в программу сборки, используя "gcc -S Sleep.cpp", затем скомпилировал ее в объектный файл, используя "gcc -c Sleep.s"
Я пытаюсь вызвать эту подпрограмму C ++ из сборки.Я слышал, что вы предоставляете параметры для подпрограмм C ++, помещая их в стек, вот мой код сборки на данный момент:
global _main
extern _puts
extern Sleep
section .text
_main:
push rbp
mov rbp, rsp
sub rsp, 32
;Prompt user:
lea rdi, [rel prompt] ; First argument is address of message
call _puts ; puts(message)
push 1000 ; Wait 1 second (Sleep time is in milliseconds)
call Sleep
lea rdi, [rel prompt] ; Print hello again
call _puts
xor rax, rax ; Return 0
leave
ret
section .data
prompt:
db "Hello!", 0
Оба эти файла сохранены в Desktop / Program.Я пытаюсь скомпилировать его, используя NASM и GCC, мой вызов компилятора:
nasm -f macho64 Program.asm && gcc Program.o Sleep.s -o Program && ./Program
Но я получаю ошибку:
"Sleep", referenced from:
_main in Program.o
(maybe you meant: __Z5Sleepi)
"std::__1::this_thread::sleep_for(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l> > const&)", referenced from:
void std::__1::this_thread::sleep_for<long long, std::__1::ratio<1l, 1000l> >(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l> > const&) in Sleep-7749e0.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Изменение кода на "extern __Z5Sleepi" ивызов "__Z5Sleepi" вместо Sleep, похоже, не решает проблему.(Я получаю то же сообщение об ошибке только без бита «Возможно, вы имели в виду __Z5Sleepi». Я также безуспешно пытался использовать _Sleep вместо Sleep.) Что я делаю не так?Как правильно использовать и связать эту подпрограмму C ++ с моей программой сборки?Является ли метод, который я использую до сих пор, чтобы сделать это просто неправильно с нуля?
Любая помощь очень ценится, переполнение стека просмотра, кажется, есть много вопросов по этому поводу, но ни один из них на самом деле не идетв процессе связывания.(И они, кажется, спрашивают о связывании сборки с C ++, а не C ++ с помощью сборки.) Я использую NASM и GCC для компиляции, и моя платформа - Mac OSX.