ARM组装时间系统调用意外值

时间:2016-10-02 18:58:20

标签: linux assembly arm system-calls

所以我试图利用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时,变量时间地址的值始终为0.第一次系统调用后r0中的返回值始终为0xffffffda。它永远不会改变,我可以假设它不是自纪元以来的时间。

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

我正在尝试拨打系统电话"时间。"

请注意,我在Raspberry Pi 2模型B上编程。链接链接到arm_strong体系结构,我正在使用的体系结构是ARMv7。但基本上用r7要求中的0取代9可以得到我想要的系统调用。所以对于"时间"我使用0xd而不是0x90000d。

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

1 个答案:

答案 0 :(得分:0)

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

尽管如此,另一种解决方案可能是使用gettimeofday系统调用;哪个回归大纪元;只要这是你的目标。互联网上的一些评论表明,时间和获取时间可能使用不同的来源;所以gettimeofday可能不那么准确。

我尝试将time()与null和非空指针一起使用,所有结果分别在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