Bagaimana Anda mendapatkan waktu saat ini di Arm ASM menggunakan localtime()?

Saya menggunakan raspberry pi 3 dan ingin mendapatkan waktu komputer lokal dengan localtime(), tapi saya tidak tahu bagaimana cara melakukannya. Guru saya mencoba membantu saya, tetapi dia bahkan tidak tahu caranya dan akhirnya mengerjakan kodenya

#include <stdio.h>
#include <time.h>
int main () {
   time_t rawtime;
   struct tm *info;
   time( &rawtime );
   info = localtime( &rawtime );
   printf("Current local time and date: %s", asctime(info));
   return(0);
}

dan kemudian dikompilasi menjadi perakitan, tapi menurut saya itu karena hal-hal yang rumit dan ingin tahu apakah ada cara yang lebih mudah untuk menemukan waktu lokal dalam perakitan senjata. Terima kasih


person Zboyz    schedule 10.12.2019    source sumber
comment
Di Linux? Panggilan sistem mentahnya adalah clock_gettime, tetapi jika Pi 3 memiliki sumber waktu yang dapat dibaca langsung oleh ruang pengguna, memanggilnya melalui VDSO mungkin merupakan cara terbaik Anda untuk menghindari peralihan dari pengguna ke kernel dan sebaliknya (Kernel mengekspor beberapa halaman kode dan data yang berisi implementasi ruang pengguna dari panggilan sistem seperti getpid. Pembungkus pustaka C normal menggunakannya secara default jika diperlukan. Satu langkah ke dalamnya dengan debugger)   -  person Peter Cordes    schedule 10.12.2019


Jawaban (2)


Di Majelis ARM, Anda dapat menggunakan panggilan syscall waktu, atau gettimeofday (yang mengembalikan Epoch) untuk mengambil waktu, berdasarkan kebutuhan Anda.

person Uninitialized    schedule 10.12.2019
comment
Bagaimana saya bisa mendapatkan nilai pengembalian dan memasukkannya ke dalam register? Atau ke mana nilainya dikembalikan, jadi saya bisa memindahkannya ke register, menurut saya - person Zboyz; 11.12.2019
comment
@Zboyz: nilai pengembalian panggilan sistem ada di r0. Baca tentang cara melakukan panggilan sistem ARM Linux secara langsung. Apa antarmuka untuk panggilan sistem ARM dan di mana definisinya di kernel Linux? - person Peter Cordes; 11.12.2019
comment
Ya, saya bisa mendapatkan Epoch Time dari r0 dan menyimpannya di tempat lain. Sekarang pertanyaan baru saya adalah bagaimana cara mengubahnya menjadi waktu lokal saat ini saja? Saya mencoba strftime , tetapi mendapat kesalahan segmentasi. - person Zboyz; 11.12.2019

Pertama-tama, saya terlalu menyederhanakan seluruh proses agar dapat menjawab pertanyaan Anda dengan lebih baik; Saya harap saya berhasil meyakinkan Anda untuk tidak melompat dari tebing dan tidak hanya memberikan jawaban tanpa jawaban :)

localtime() adalah fungsi yang disediakan oleh perpustakaan runtime C yang biasanya dikirimkan bersama dengan kompiler C. Salah satu langkah yang dilakukan kompiler ketika membuat program yang dapat dijalankan dari kode C/C++ Anda adalah menautkan ke pustaka runtime C, jadi ketika program Anda perlu memanggil suatu fungsi, ia akan mengetahui di mana menemukan file dll/jadi, memuat itu ke dalam memori dan memberikan kontrol ke fungsi yang diperlukan. Sebagian besar pemuatan perpustakaan dan langkah-langkah yang dijelaskan dilakukan oleh sistem operasi melalui fungsi-fungsi terkenal (misalnya (dlopen)[https://linux.die.net/man/3/dlopen]).

Anda dapat menulis semua boilerplate itu, tetapi Anda harus mendapatkan pemahaman yang lebih baik tentang sistem operasi dan runtime C, atau Anda dapat menggunakan kompiler c terpercaya Anda dan membuat kodenya berfungsi.

Jika tujuan tugas Anda adalah mempelajari lebih lanjut tentang bahasa rakitan ARM dan prosesor ARM, Anda mungkin harus membaca lembar data prosesor dan melihat bagaimana prosesor tersebut menahan waktu secara internal.

person Claudiu Guiman    schedule 10.12.2019
comment
Tidak, dlopen hanya digunakan secara manual jika tidak menentukan perpustakaan pada waktu kompilasi. Tautan dinamis waktu kompilasi menyiapkan metadata sehingga hal itu terjadi pada Anda secara otomatis, dan Anda cukup bl localtime@plt, atau dalam non-PIE yang dapat dieksekusi bahkan hanya bl localtime dan tautannya benar-benar menangani bahkan pembuatan PLT dan GOT untuk Anda. Tidak sulit untuk memanggil fungsi libc dari asm selama Anda menulis main dan menghubungkan dengan gcc. (Dan lebih rumit atau setidaknya kurang aman jika Anda menulis _start sendiri dan menautkannya secara manual dengan ld.) - person Peter Cordes; 10.12.2019
comment
Apa sebenarnya kode untuk mengeluarkannya dengan printf? Apakah saya harus memuat beberapa nilai sebelum cabang dengan waktu lokal? Apakah saya bl waktu lokal, lalu bl printf? Di situlah kebingungan juga berasal. Bagaimana cara saya mengkodekan pernyataan ini, dan kemudian menggunakan informasi hasilnya. Bisakah saya menyimpan nomor tersebut di register setelah dikembalikan, dll. - person Zboyz; 11.12.2019