所以我试图利用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。
我做错了,返回值和我传入系统调用的指针都没有得到我期望的值?最终我想要做的是获取值并将其打印到控制台。
答案 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