Как бы вы получили текущее время в Arm ASM, используя localtime()?

Я использую Raspberry Pi 3 и хочу получить локальное время компьютера с помощью localtime(), но я не знаю, как это сделать. Мой учитель пытался мне помочь, но он даже не знал, как это сделать, и закончил писать код.

#include <stdio.h>
#include <time.h>
int main () {
   time_t rawtime;
   struct tm *info;
   time( &rawtime );
   info = localtime( &rawtime );
   printf("Current local time and date: %s", asctime(info));
   return(0);
}

а затем просто компилируется в сборку, но я думаю, что это слишком сложно, и я хотел знать, есть ли более простой способ найти местное время в сборке рук. Спасибо


person Zboyz    schedule 10.12.2019    source источник
comment
Под линуксом? Необработанный системный вызов — clock_gettime, но если Pi 3 имеет источник времени, который пользовательское пространство может считывать напрямую, вызов его через VDSO, вероятно, является лучшим способом избежать переключения от пользователя к ядру и обратно (ядро экспортирует пару страниц кода и данных, которые содержат реализации системных вызовов в пользовательском пространстве, таких как getpid. Обычные оболочки библиотеки C используют его по умолчанию там, где это уместно. Внесите в них один шаг с помощью отладчика)   -  person Peter Cordes    schedule 10.12.2019


Ответы (2)


В ARM Assembly вы можете использовать системный вызов time или вызов gettimeofday (который возвращает Epoch) для получения времени в зависимости от ваших требований.

person Uninitialized    schedule 10.12.2019
comment
Как я могу получить возвращаемое значение и поместить его в регистр? Или куда возвращается значение, чтобы я мог переместить его в регистр, я должен сказать - person Zboyz; 11.12.2019
comment
@Zboyz: возвращаемые значения системного вызова находятся в r0. Прочтите о том, как выполнять системные вызовы ARM Linux напрямую. Что такое интерфейс для системных вызовов ARM и где он определен в ядре Linux? - person Peter Cordes; 11.12.2019
comment
Да, я смог получить время эпохи из r0 и сохранить его где-нибудь еще. Теперь мой новый вопрос: как мне преобразовать его только в текущее местное время? Я попробовал strftime , но получил ошибку сегментации. - person Zboyz; 11.12.2019

Прежде всего, я слишком упрощаю весь процесс, чтобы, надеюсь, лучше ответить на ваш вопрос; Надеюсь, мне удалось убедить вас не прыгать с обрыва и не просто дать ответ без ответа :)

localtime() — это функция, предоставляемая библиотекой времени выполнения C, которая обычно поставляется вместе с компилятором C. Один из шагов, который компилятор выполняет при создании исполняемой программы из вашего кода C/C++, — это ссылка на библиотеку времени выполнения C, поэтому, когда вашей программе нужно вызвать функцию, она будет знать, где найти файл dll/so, загрузить в память и передать управление требуемой функции. Большая часть загрузки библиотеки и описанных шагов выполняется операционной системой через хорошо известные функции (например, (dlopen)[https://linux.die.net/man/3/dlopen]).

Вы могли бы написать весь этот шаблон, но вам нужно было бы лучше понять операционную систему и среду выполнения C, или вы могли бы просто использовать свой надежный компилятор C и просто заставить код работать.

Если целью вашей задачи является узнать больше о языке ассемблера ARM и процессорах ARM, вам, вероятно, следует обратиться к техническому описанию процессора и посмотреть, как он внутренне удерживает время.

person Claudiu Guiman    schedule 10.12.2019
comment
Нет, dlopen используется только вручную, если не указать библиотеку во время компиляции. Динамическая компоновка во время компиляции настраивает метаданные таким образом, что это происходит для вас автоматически, и вы можете просто bl localtime@plt, а в исполняемом файле, отличном от PIE, даже просто bl localtime, и компоновщик действительно позаботится даже о создании PLT и GOT для вас. На самом деле несложно вызывать функции libc из asm, пока вы пишете main и линкуетесь с gcc. (И более сложным или, по крайней мере, менее безопасным, если вы пишете свой собственный _start и связываете вручную с ld.) - person Peter Cordes; 10.12.2019
comment
Какой именно код будет выводиться с помощью printf? Должен ли я загружать некоторые значения перед веткой с локальным временем? Нужно ли bl localtime, а затем bl printf? Отсюда, собственно, и путаница. Как мне на самом деле закодировать этот оператор, а затем использовать информацию о результате. Могу ли я сохранить номер в регистре после его возврата и т. д. - person Zboyz; 11.12.2019