【问题标题】:ARM Assembly Time System Call Unexpected ValuesARM 汇编时系统调用意外值
【发布时间】:2016-10-02 18:58:19
【问题描述】:

所以我正在尝试使用 ARM 程序集来获得时间,但在这样做时遇到了麻烦。这是我的代码:

.data
    .balign 4
    time:
    .word 0

.text
    .global _start

_start:
    ldr r0, =time
    mov r7, #0xd
    svc #0

    mov r7, #1
    svc #0

但是,在使用GDB时,变量time的地址处的值始终为0。第一次系统调用后r0中的返回值始终为0xffffffda。它永远不会改变,我可以假设现在不是时代以来的时间。

我从中收集到的信息是: https://w3challs.com/syscalls/?arch=arm_strong

我正在尝试调用系统调用“时间”。

请注意,我正在使用 Raspberry Pi 2 模型 B 进行编程。链接指向 arm_strong 架构,而我正在使用的架构是 ARMv7。但本质上用 r7 要求中的 0 替换 9 可以获得我想要的系统调用。所以对于“时间”,我使用 0xd 而不是 0x90000d。

我做错了什么,返回值和传递给系统调用的指针都没有得到我期望的值?最终我想要做的是获取值并将其打印到控制台。

【问题讨论】:

  • -38 is -ENOSYS,这表明可能值得为您正在运行的内核版本查找 实际 适当的系统调用号,而不是从一个疯狂的猜测-日期参考。
  • 我试图寻找有关这方面的信息,但我没有运气。你建议我如何寻找实际合适的系统调用号?
  • 这是我发现的更准确的表示:w3challs.com/syscalls/?arch=arm_thumb
  • time 的零是因为运行时链接。执行程序时,动态链接器将填充它们。
  • 一切对我来说都是正确的。我建议您只需将“R0”设置为 NULL (0),并且不要让 Linux 为您写入用户空间内存。 time_t 适合 R0,您可以直接使用它。您可以这样做并查看错误代码是否更改?或者你成功了。您可以使用 Linux 'asm/unistd.h' 并从那里获取 0xd 常量作为__NR_time(和__NR_exit)。该问题可能与常量池和数据引用有关。您可能想要设置退出代码。我猜这个可执行文件在没有 SEGV 的情况下运行?

标签: linux assembly arm system-calls


【解决方案1】:

这是另一种解决方案。 正如@artless noise 所指出的,您的代码似乎是正确的;我得到和你一样的结果。

尽管如此,替代解决方案可能是使用 gettimeofday 系统调用;确实返回 Epoch;前提是这是您的目标。 Internet 中的一些 cmets 建议 time 和 gettimeofday 可能使用不同的来源;所以 gettimeofday 可能不那么准确。

我尝试使用带有空指针和非空指针的 time(),所有结果分别在 r0 中返回 0xffffffda。

  1 /*
  2         David @InfinitelyManic
  3         http://stackoverflow.com/questions/39820523/arm-assembly-time-system-call-unexpected-values
  4
  5         $ uname -a
  6         Linux raspberrypi 4.4.21-v7+ #911 SMP Thu Sep 15 14:22:38 BST 2016 armv7l GNU/Linux
  7
  8         $ cat /etc/os-release
  9         PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
 10
 11         $ less /usr/share/gdb/syscalls/arm-linux.xml
 12         <syscall name="time" number="13"/>
 13
 14         arm/EABI   swi 0x0              r7          r0
 15
 16         gcc -g stuff.s -o stuff
 17 */
 18
 19 .bss
 20 .data
 21         fmt:    .asciz  "%lu\n"
 22         t:      .zero 8
 23 .text
 24         .global main
 25         .include "mymac.s"
 26
 27 main:
 28         nop
 29         ldr r9,=t
 30
 31         bl _time0
 32         mov r1, r0
 33         bl write
 34
 35         bl _time1
 36         ldr r1, [r9]
 37         bl write
 38
 39 exit:
 40         mov r7, #1
 41         svc 0
 42
 43 write:
 44         push {r1-r3,lr}
 45         ldr r0,=fmt
 46         bl printf
 47         pop {r1-r3,pc}
 48
 49 _time0:
 50         push {r1-r3,lr}
 51         mov r7, #13             // time
 52         eor r0, r0
 53         svc 0
 54         pop {r1-r3,pc}
 55
 56 _time1:
 57         push {r1-r3,lr}
 58         mov r7, #78             // gettimeofday
 59         ldr r0,=t
 60         eor r1, r1
 61         svc 0
 62         pop {r1-r3,pc}

输出:

$ ./stuff
4294967258
1475617987

【讨论】:

    猜你喜欢
    • 2016-01-16
    • 2010-12-18
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多