Форум программистов, компьютерный форум, киберфорум
Assembler: Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 20.02.2018
Сообщений: 15
1
NASM

Вывести число в терминал средствами существующих API или библиотек

16.08.2019, 16:44. Показов 2579. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Столкнулся с проблемой вывода знакового числа из регистра в терминал.
Существует ли способ вывода числа не переводя его в строку из символов вручную?
Может быть какой то системный вызов готовый уже существует, если нет, то подскажите как соответствующим образом вызвать функцию си
в ассемблерном коде. Спасибо!



Добавлено через 2 минуты
Попробовал использовать printf, но получил ошибку "undefined reference to `printf'"
код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
extern  printf  
 
section .data
    fmt db "%d",0Ah
section .bss
    input resb 512
    choise resb 1
   
section .text
    global _start
 
_start:
...
        mov [res],r8  
    push res
    push fmt
    call printf
...
терминал выглядит так:
Bash
1
2
nasm -f elf64 -g prog4.asm
ld prog4.o -g -o prog4
потом прочитал что нужен флаг -lc, но получается ошибка
ld: cannot find -lc
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2019, 16:44
Ответы с готовыми решениями:

Средствами чистого JS без библиотек,php,AJAX нужно вывести все теги a href вместе с их содержимым c другого сайта
Вообщем есть сайт, допустим site.com на которым средствами чистого JS без библиотек,php,AJAX нужно...

Где можно посмотреть список всех существующих библиотек для AS? (кроме GitHub)
Есть, например, OpenCV - библиотека алгоритмов компьютерного зрения, обработки изображений с...

Screenshot из Windows Media Player средствами .NET или API Windows
Здравствуйте! Запарился искать в Инете, решил попробовать здесь спросить. Есть небольшой...

Вывод в Notification API только не существующих данных при их обновлении.
Доброго времени суток! У меня есть функция новостей,которая через определенное время...

3
438 / 367 / 132
Регистрация: 09.09.2011
Сообщений: 1,334
22.08.2019, 23:15 2
полностью команду c ld приведите
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
23.08.2019, 05:01 3
Цитата Сообщение от BabyRooJr Посмотреть сообщение
потом прочитал что нужен флаг -lc
-lc это параметр для компилятора си, а не компоновщика.
0
50 / 6 / 1
Регистрация: 08.02.2020
Сообщений: 19
09.02.2020, 20:50 4
Соглашение о вызове функции x86-64:

x86-64 передает аргументы в регистрах, что является более эффективным, чем соглашение стековых аргументов i386 System V. Это позволяет избежать задержек и дополнительных инструкций по сохранению аргументов в памяти (кеш), а затем снова загружать их в вызываемый объект. Это хорошо работает, потому что доступно больше регистров, и лучше для современных высокопроизводительных процессоров, где важны задержки и неупорядоченное выполнение. (I386 ABI очень старый).

В этом новый Механизм: Сначала параметры делятся на классы. Класс каждого параметра определяет способ, которым он передается вызываемой функции.

Для получения полной информации см. «3.2 Последовательность вызова функций» Двоичный интерфейс приложения System V Приложение для архитектуры AMD64 который читает, частично:

После классификации аргументов регистры присваиваются (в
порядок слева направо) для прохождения следующим образом:

Если класс MEMORY, передайте аргумент в стек.
Если класс INTEGER, следующий доступный регистр
используется последовательность% rdi,% rsi,% rdx,% rcx,% r8 и% r9
Так %rdi, %rsi, %rdx, %rcx, %r8 and %r9 регистры с целью используется для передачи параметров целочисленного значения / указателя (т.е. класса INTEGER) в любую функцию libc из сборки. % rdi используется для первого параметра INTEGER. % rsi для 2-го,% rdx для 3-го и так далее. затем call инструкция должна быть дана. Стек (%rsp) должен быть выровнен по 16B, когда call выполняет.

Если имеется более 6 параметров INTEGER, 7-й параметр INTEGER и более поздние передаются в стек. (Звонящий звонит, так же, как x86-32.)

Первые 8 аргументов с плавающей запятой передаются в% xmm0-7, а затем в стеке. Здесь нет сохраняемых при вызове векторных регистров. (Функция с сочетанием FP и целочисленных аргументов может иметь более 8 аргументов в регистре.)

Вариадические функции (подобные printf) всегда нужно %al = количество аргументов регистра FP.

Существуют правила для того, когда упаковывать структуры в регистры (rdx:rax по возвращении) против памяти. Посмотрите ABI для деталей и проверьте выходные данные компилятора, чтобы убедиться, что ваш код согласен с компиляторами о том, как что-то должно быть передано / возвращено.
Вам нужно поместить fmt в rdi
выводимое число в rsi
очистить eax
потом вызывать printf
2
09.02.2020, 20:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2020, 20:50
Помогаю со студенческими работами здесь

Текстовое число через api функцию в EAX или ячейку памяти
Программирую на FASM - е. К примеру у меня есть текстовое число , которое записано по байтам так:...

Win32 API ввести/вывести дробное число в edit control
Есть функции GetDlgItemText и GetDlgItemInt. Первая для получения текста, вторая для числа типа...

Как привести словосочетание в именительный падеж, единственное число? (php или api)
Добрый день, может кто сталкивался с такой проблемой мне нужно из предлежания неизвестно в каком...

Правильно вызвать API функцию из библиотек на C
Добрый день! Скажите пожалуйста, я вызываю ряд функций API из библиотек на C. ...

Вывести сообщение: чётное число или нечётное число
Дано целое число. Вывести сообщение: чётное число или нечётное число.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru