Использование функций stdlib.h непосредственно в сборке - PullRequest
1 голос
/ 28 сентября 2019

Мне нужно создать программу на ассемблере (x86), которая берет 2 длинных числа из пользовательского ввода, добавляет их с помощью функции и затем печатает результат.Когда я использую системный вызов read, я получаю строку в шестнадцатеричном коде ASCII и не могу добавить такие числа.Поэтому я хотел использовать atol, который является функцией stdlib.h, чтобы преобразовать строку в long.Как включить библиотеки в сборку?Есть ли другой способ сделать это?

Я уже пробовал:

  1. .file "stdlib.h" (у меня есть библиотека в текущем каталоге)

ошибка: неопределенная ссылка на atol'

компиляция stdlib.h вместе с файлом .s с использованием clang

ошибка: stdlib.h: файл не распознан: формат файла не распознан

создание файла .c только с #include<stdlib.h> и компиляция его с файлом .s

ошибка: неопределенная ссылка на `atol '

используемые мной команды

clang function.s -c -g
ld function.o -o function

Ответы [ 3 ]

2 голосов
/ 28 сентября 2019

Компоновщик жалуется, что atol не был найден, потому что это функция в библиотеке C, но вы не сказали компоновщику добавить библиотеку C в вашу программу во время компоновки.Чтобы это исправить, передайте компоновщику -lc, чтобы добавить библиотеку C во время компоновки:

ld -o function function.o -lc

Очень важно, чтобы -lc был последним, иначе ссылка может не работать.Это связано с тем, что компоновщик выбирает функции из библиотек в указанном вами порядке.Когда вы указываете -lc перед function.o, она игнорирует библиотеку, поскольку сейчас ей ничего не нужно.Затем он видит function.o с неопределенным atol и не находит определения, что приводит к сбою ссылки.

Наконец, когда вы используете библиотеку C, вы должны запустить свою программу с main функция (т. е. переименование _start в main) как обычная программа на C и связь через компилятор C:

clang -g -o function function.s

Это приводит к автоматическому связыванию библиотеки C и ее правильной инициализации,предотвращение некоторых странных ошибок.Если вы используете какие-либо функции ввода-вывода, например printf, из библиотеки C, вам также следует завершить свою программу, вызвав exit, чтобы стандартные потоки ввода-вывода были сброшены правильно.

Обратите внимание, что файл stdlib.h являетсякрасная сельдьЗаголовочные файлы не нужны для программирования в сборке.Их цель - сообщить компилятору C, какой тип некоторых функций.Это не нужно, если вы не используете компилятор Си.Директива .file не делает то, что вы ожидаете.

0 голосов
/ 29 сентября 2019

Может быть, вы можете использовать extern, например: extern printf или что вы хотите в stdlib.h библиотеке

Это работает на nasm или masm ассемблере.

0 голосов
/ 28 сентября 2019

Вы добавили модуль компиляции (файл .c) в проект.Это вводит прототип функций во включенный заголовочный файл "stdlib.h".То, что вы хотите, это ссылка на эту функцию.Это должно быть введено в файл ассемблера, который должен использовать функцию.

Добавление оператора extern в файл ассемблера должно сделать эту работу.Вам не нужен файл C с включенным.Вам нужно будет добавить соответствующую библиотеку в настройках компоновщика.Но даже если вы успешно свяжете EXE-файл, вы, вероятно, столкнетесь с проблемой, поскольку некоторые функции в stdlib нуждаются в инициализации.Вы также должны вызвать функцию инициализации C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...