คุณจะได้รับเวลาปัจจุบันใน Arm ASM โดยใช้ localtime () อย่างไร

ฉันใช้ Raspberry Pi 3 และต้องการรับเวลาของคอมพิวเตอร์ท้องถิ่นด้วย localtime() แต่ฉันไม่รู้จะทำยังไง ครูของฉันพยายามช่วยฉัน แต่เขาไม่รู้ด้วยซ้ำว่าต้องทำอย่างไรและจบลงด้วยการเขียนโค้ด

#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);
}

แล้วก็รวบรวมเป็น Assembly แต่ผมคิดว่าเรื่องที่ซับซ้อนแล้วอยากทราบว่ามีวิธีหาเวลาท้องถิ่นใน Arm Assembly ที่ตรงไปตรงมามากกว่านี้หรือไม่ ขอบคุณ


person Zboyz    schedule 10.12.2019    source แหล่งที่มา
comment
ภายใต้ลินุกซ์? การเรียกระบบดิบคือ clock_gettime แต่ถ้า Pi 3 มีแหล่งเวลาที่พื้นที่ผู้ใช้สามารถอ่านได้โดยตรง การเรียกผ่าน VDSO น่าจะเป็นค้างคาวที่ดีที่สุดของคุณเพื่อหลีกเลี่ยงการเปลี่ยนจากผู้ใช้เป็นเคอร์เนลและย้อนกลับ (เคอร์เนลส่งออกสองสามหน้า ของโค้ดและข้อมูลที่มีการใช้งานพื้นที่ผู้ใช้ของการเรียกระบบเช่น getpid wrapper ไลบรารี C ปกติจะใช้เป็นค่าเริ่มต้นตามความเหมาะสม ขั้นตอนเดียวในนั้นด้วยดีบักเกอร์)   -  person Peter Cordes    schedule 10.12.2019


คำตอบ (2)


ใน ARM Assembly คุณสามารถใช้ time syscall หรือการเรียก gettimeofday (ซึ่งส่งคืน Epoch) เพื่อดึงข้อมูลเวลาตามความต้องการของคุณ

person Uninitialized    schedule 10.12.2019
comment
ฉันจะรับค่าส่งคืนและนำไปลงทะเบียนได้อย่างไร หรือค่าจะส่งคืนที่ไหน ดังนั้นฉันสามารถย้ายมันไปไว้ในรีจิสเตอร์ที่ฉันควรจะพูดได้ - person Zboyz; 11.12.2019
comment
@Zboyz: ค่าส่งคืนการเรียกของระบบอยู่ใน r0 อ่านเกี่ยวกับวิธีการโทรของระบบ ARM Linux โดยตรง อินเทอร์เฟซสำหรับการเรียกระบบ ARM คืออะไร และถูกกำหนดไว้ที่ใดในเคอร์เนล Linux - person Peter Cordes; 11.12.2019
comment
ใช่แล้ว ฉันสามารถหาเวลายุคจาก r0 และเก็บไว้ที่อื่นได้ ตอนนี้คำถามใหม่ของฉันคือ ฉันจะแปลงเป็นเวลาท้องถิ่นปัจจุบันได้อย่างไร ฉันพยายาม strftime แต่มีข้อผิดพลาดในการแบ่งส่วน - person Zboyz; 11.12.2019

ก่อนอื่น ฉันได้ทำให้กระบวนการทั้งหมดง่ายขึ้นมากเกินไปเพื่อหวังว่าจะตอบคำถามของคุณได้ดียิ่งขึ้น ฉันหวังว่าฉันจะสามารถโน้มน้าวคุณไม่ให้กระโดดหน้าผาและไม่ใช่แค่ให้คำตอบที่ไม่มีคำตอบ :)

localtime() เป็นฟังก์ชันที่จัดทำโดยไลบรารีรันไทม์ของ C ซึ่งโดยปกติจะจัดส่งพร้อมกับคอมไพเลอร์ C ขั้นตอนหนึ่งที่คอมไพเลอร์ดำเนินการเมื่อสร้างโปรแกรมที่รันได้จากโค้ด C/C++ ของคุณคือการลิงก์ไปยังไลบรารีรันไทม์ C ดังนั้นเมื่อโปรแกรมของคุณต้องการเรียกใช้ฟังก์ชัน มันจะรู้ว่าจะหาไฟล์ dll/so ได้ที่ไหน โหลด ลงในหน่วยความจำและควบคุมการทำงานที่ต้องการ โหลดไลบรารีส่วนใหญ่และขั้นตอนที่อธิบายไว้ดำเนินการโดยระบบปฏิบัติการผ่านฟังก์ชันที่รู้จัก (เช่น (dlopen)[https://linux.die.net/man/3/dlopen])

คุณสามารถเขียนสำเร็จรูปทั้งหมดได้ แต่คุณจะต้องมีความเข้าใจที่ดีขึ้นเกี่ยวกับระบบปฏิบัติการและรันไทม์ของ C หรือคุณสามารถใช้คอมไพเลอร์ c ที่เชื่อถือได้ของคุณและเพียงแค่ทำให้โค้ดทำงานได้

หากเป้าหมายของงานของคุณคือการเรียนรู้เพิ่มเติมเกี่ยวกับภาษาแอสเซมบลี ARM และโปรเซสเซอร์ ARM คุณควรศึกษาเอกสารข้อมูลของโปรเซสเซอร์และดูว่าภาษานั้นจับเวลาภายในได้อย่างไร

person Claudiu Guiman    schedule 10.12.2019
comment
ไม่ dlopen จะใช้ด้วยตนเองเฉพาะในกรณีที่ไม่ได้ระบุไลบรารีในขณะคอมไพล์ การลิงก์แบบไดนามิกในเวลาคอมไพล์จะตั้งค่าข้อมูลเมตาเพื่อให้เกิดขึ้นกับคุณโดยอัตโนมัติ และคุณสามารถ bl localtime@plt หรือในไฟล์ปฏิบัติการที่ไม่ใช่ PIE แม้แต่เพียง bl localtime และตัวลิงก์จะดูแลแม้กระทั่งการสร้าง PLT และ GOT ให้คุณจริงๆ การเรียกใช้ฟังก์ชัน libc จาก asm ไม่ใช่เรื่องยากเลย ตราบใดที่คุณเขียน main และเชื่อมโยงกับ gcc (และซับซ้อนมากขึ้นหรืออย่างน้อยก็ปลอดภัยน้อยลง หากคุณเขียน _start ของคุณเองและเชื่อมโยงด้วยตนเองด้วย ld) - person Peter Cordes; 10.12.2019
comment
รหัสที่จะใช้กับ printf คืออะไร? ฉันต้องโหลดค่าบางค่าก่อนสาขาตามเวลาท้องถิ่นหรือไม่ ฉันจะ bl localtime แล้ว bl printf หรือไม่ นั่นคือที่มาของความสับสนเช่นกัน ฉันจะเขียนโค้ดคำสั่งนี้ได้อย่างไร แล้วใช้ข้อมูลผลลัพธ์ ฉันสามารถเก็บหมายเลขไว้ในทะเบียนหลังจากส่งคืนแล้วได้หรือไม่ - person Zboyz; 11.12.2019