2016-10-02 247 views
0

所以我試圖花時間使用ARM程序集,並且遇到了麻煩。這是我的代碼: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

[-38是'-ENOSYS'](http://lxr.free-electrons.com/source/include/uapi/asm-generic/errno.h #L17),這表明可能需要查找正在運行的內核版本的_actual_適當的系統調用號碼,而不是從一個瘋狂的過期參考中猜測。 – Notlikethat

+0

我試圖尋找有關的信息,但我沒有運氣。你如何建議我應該去尋找實際合適的系統呼叫號碼? – gshawm

+0

下面是我找到的更精確的表示形式:https://w3challs.com/syscalls/?arch=arm_thumb – gshawm

回答

0

這是一種替代解決方案。如無代表噪聲所示,看起來你的代碼是正確的;我得到了和你一樣的結果。

儘管如此,替代解決方案可能是使用gettimeofday系統調用;它確實返回時代;只要這是你的目標。互聯網上的一些評論表明,時間和gettimeofday可能使用不同的來源;所以gettimeofday可能並不準確。

我已經嘗試使用時間()與空和非空指針和所有結果分別在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} 

OUTPUT:

$ ./stuff 
4294967258 
1475617987