2016-10-02 4 views
0

だから、私はARMアセンブリを使用して時間を得ようとしているので、そうすることに問題があります。これは私が持っているコードされています。GDBを使用したときに最初のシステムコールは常に0xffffffdaされた後しかし、可変時間のアドレスの値は常に0 r0の戻り値であるARMアセンブリ時間システムコールが予期しない値

.data 
    .balign 4 
    time: 
    .word 0 

.text 
    .global _start 

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

    mov r7, #1 
    svC#0 

。それは決して変わらず、私はそれがエポックからの時間ではないと仮定することができます。

私はからこれを収集した情報は次のとおりです。「時間」私はシステムコールを呼び出すしようとしています https://w3challs.com/syscalls/?arch=arm_strong

私はRaspberry Pi 2モデルBでプログラミングしています。arm_strongアーキテクチャへのリンクと、現在作業中のアーキテクチャはARMv7です。しかし、基本的にr7の要件で9を0に置き換えると、私が望むシステムコールが得られます。だから "時間"私は0x90000dの代わりに0xdを使用します。

私が間違っていることは、戻り値もポインタもシステムコールに渡されても、私が期待する価値が得られないことです。最終的に私がやりたいことは、価値を持ってコンソールに出力することです。

+0

[-38が '-ENOSYS'ある](http://lxr.free-electrons.com/source/include/uapi/asm-generic/errno.h #L17)、これは、あなたが実行しているカーネルバージョンの_実際の適切なシステムコール番号を調べる価値があるかもしれないことを示唆しています。 – Notlikethat

+0

私はそれについての情報を探すことを試みたが、私は運がなかった。実際の適切な電話番号を探すためにどうすればいいのですか? – gshawm

+0

ここに私が見つけたより正確な表現があります:https://w3challs.com/syscalls/?arch=arm_thumb – gshawm

答えて

0

これは別の解決策です。 @artlessノイズで示されるように、コードが正しいと思われます。私はあなたと同じ結果を得ています。

それにもかかわらず、代わりの解決方法はgettimeofdayシステムコールを使用することです。エポックを返す。これがあなたの目標であるならば。インターネット上のいくつかのコメントは、時間とgettimeofdayが異なるソースを使用している可能性があることを示唆しています。 gettimeofdayは正確ではないかもしれません。

私はヌルポインタではなくnullでないポインタで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} 

OUTPUT:

$ ./stuff 
4294967258 
1475617987 
関連する問題