Я работаю над утилитой на ассемблере (x86, NASM 2.13, g cc 7.50, Ubuntu 18.X), которая будет вызываться из C. Проблема, с которой я столкнулся, заключается в том, что адреса строковых констант, похоже, теряются в процессе создания, поэтому сообщения не печатаются. Я вижу строковые константы в окончательном двоичном файле.
Это пример кода ассемблера
SECTION .data
error_len_message: db "test", 10
error_len_message_len: equ $-error_len_message
SECTION .text
global test_func
test_func:
mov eax, 4
mov ebx, 1
mov ecx, error_len_message
mov edx, error_len_message_len
int 80H
Заголовочный файл был бы тривиальным, так как ему нужна была бы только подпись, используемая в main. c
#include "....."
int main(void) {
test_func();
return 0;
}
make-файл исполняемого файла выглядит следующим образом:
util_tests: ../asm/utilities/utilities.o
gcc -Wall -o ./build/$@ main.c $?
../asm/utilities/utilities.o:
cd ../asm/utilities && make && cd ../../util_tests;
clean:
cd ../asm/utilities && make clean && cd ../../util_tests;
make-файл утилит выглядит следующим образом:
utilities.o: test/test.o
ld $? -o $@
test/test.o:
cd test && make && cd ..;
clean:
cd test && make clean && cd ..;
rm *.o
make файл тестового кода ассемблера:
test.o: test.asm
nasm -f elf64 -g -F dwarf $?
clean:
rm *.o
У меня нет проблем с превращением его в исполняемый файл, используя только ассемблер и выводя строки, определенные в разделе .data. Сделайте файл:
test: test.o
ld -o test $^
test.o: *.asm
nasm -f elf64 -g -F stabs $?
clean:
rm *.o
Я могу успешно определять и использовать переменные в разделе .bss (для краткости не показано)
Я считаю, что проблема в том, как я создаю утилита. Заранее спасибо!