Время сборки 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 значение по адресу переменной time всегда равно 0. Возвращаемое значение в r0 после первого системного вызова всегда 0xffffffda. Он никогда не меняется и я могу предположить, что это не время с эпохи.

Информация, которую я собрал это из:
https://w3challs.com/syscalls/?arch=arm_strong

Я пытаюсь вызвать системный вызов » время.»

Обратите внимание, что я программирую на модели Raspberry Pi 2 B. ссылка на архитектуру arm_strong и архитектуру, с которой я работаю, является ARMv7. Но, по сути, замена 9 на 0 в требовании r7 дает мне системный вызов, который я хочу. Поэтому для «time» я использую 0xd вместо 0x90000d.

Что я делаю неправильно, что ни возвращаемое значение, ни указатель, который я передаю в системный вызов, не получают меня значение, которое я ожидаю? В конце концов, я хочу взять значение и распечатать его на консоли.

1 ответ

  1. Это альтернативное решение.
    Как указывает @artless noise, кажется, что ваш код верен; я получаю тот же результат, что и вы.

    Тем не менее, альтернативным решением может быть использование gettimeofday syscall; который возвращает эпоху; при условии, что это ваша цель. Некоторые комментарии в Интернете предполагают, что time и gettimeofday могут использовать различные источники; поэтому gettimeofday может быть не столь точен.

    Я пытался использовать time () с нулевым и не нулевым указателем, и все результаты возвращают 0xffffffda в r0, соответственно.

      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