【问题标题】:How would you get the current time in Arm ASM using localtime()?如何使用 localtime() 获取 Arm ASM 中的当前时间?
【发布时间】:2020-04-03 08:08:27
【问题描述】:

我使用的是树莓派 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);
}

然后只是编译成汇编,但我认为这太复杂了,想知道是否有一种更直接的方法可以在 arm 汇编中找到本地时间。 谢谢

【问题讨论】:

  • 在 Linux 下?原始系统调用是clock_gettime,但如果 Pi 3 有一个用户空间可以直接读取的时间源,那么通过 VDSO 调用它可能是避免从用户切换到内核并返回的最佳方法(内核导出一个几页代码和数据,其中包含系统调用的用户空间实现,例如getpid。正常的 C 库包装器在适当的情况下默认使用它。使用调试器单步进入它们)

标签: c++ c assembly arm localtime


【解决方案1】:

在 ARM Assembly 中,您可以根据需要使用时间系统调用或 gettimeofday 调用(返回 Epoch)来检索时间。

【讨论】:

  • 我如何才能获得返回值并将其放入寄存器中?或者值在哪里返回,所以我可以将它移动到我应该说的寄存器中
  • @Zboyz:系统调用返回值在r0 中。阅读有关如何直接进行 ARM Linux 系统调用的信息。 What is the interface for ARM system calls and where is it defined in the Linux kernel?
  • 是的,我实际上能够从 r0 获取纪元时间并将其存储在其他地方。现在我的新问题是如何将其转换为当前本地时间?我试过 strftime ,但出现分段错误。
【解决方案2】:

首先,我已经简化了整个过程,希望能更好地回答您的问题;我希望我设法说服你不要跳崖,而不仅仅是提供一个不回答的答案:)

localtime() 是一个由 C 运行时库提供的函数,通常与 C 编译器一起提供。 编译器从 C/C++ 代码生成可运行程序时执行的步骤之一是链接到 C 运行时库,因此当您的程序需要调用函数时,它会知道在哪里可以找到 dll/so 文件,加载它进入内存并控制所需的功能。大多数库加载和描述的步骤是由操作系统通过众所周知的函数(例如 (dlopen)[https://linux.die.net/man/3/dlopen]) 执行的。

您可以编写所有样板文件,但您必须更好地了解操作系统和 C 运行时,或者您可以只使用您可信赖的 c 编译器并让代码正常工作。

如果您的任务目标是了解有关 ARM 汇编语言和 ARM 处理器的更多信息,您可能应该查阅处理器的数据表并了解它在内部如何保持时间。

【讨论】:

  • 否,dlopen 仅在编译时未指定库时手动使用。编译时动态链接设置元数据,以便自动为您发生,您可以只使用bl localtime@plt,或者在非 PIE 可执行文件中,甚至只是 bl localtime,链接器确实会处理甚至创建 PLT 和 GOT为你。只要您正在编写main 并与gcc 链接,从asm 调用libc 函数真的不难。 (如果您正在编写自己的 _start 并手动与 ld 链接,则更复杂或至少不太安全。)
  • 用 printf 输出的代码到底是什么?我是否必须在本地时间的分支之前加载一些值?我是本地时间,然后是 printf?这确实是混乱的来源。我如何实际编码此语句,然后使用结果信息。我可以在返回等后将号码存储在寄存器中吗?
猜你喜欢
  • 2013-12-25
  • 1970-01-01
  • 2014-04-15
  • 2011-04-06
  • 2013-12-30
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 2011-02-16
相关资源
最近更新 更多