Monday, September 28, 2026

x86_64 Linux Yasm: Push and Pop

1. โปรแกรม Push และ Pop

 

 ภาพที่ 1 โปรแกรมแสดงการทำงาน

 

2. แสดงค่า numbers  หรือ renum ในโปรแกรม DDD

    (gdb) graph display *(long long *)(&number) 

    (gdb) graph display *(long long *)((unsigned long long) (&number + 8) 

ภาพที่ 2 การแสดงค่า numbers แล renum 

 

3. ขนาดข้อมูล ในโปรแกรมประกาศเป็น dq / resq (Quad Word) ดังนั้นใน GDB จะต้องใช้ long long

    3.1 &renum จะส่งค่า address ของ renum

    3.2 *(&renum) จะส่งค่า Value ในตัวแปร renum

    3.3 (long long *) เป็นการ cast ค่า (&renum) เพื่อบอกว่าเป็น ประเภท Pointer ( * ) มีขนาด 64-bits คือ long long

    3.4 (unsigned long long) เป็นการ cast ค่าของ &renum  และตัวถัดๆ ไป ->  โดยจะใช้โครงสร้าง(unsigned long long)&renum

รวมเป็น  *(long long *)(unsigned long long)&renum

    3.5 เมื่อต้องการดูค่าถัดไป ให้เริ่มจากค่า address ของตัวถัดไป (&renum + <byte>) เช่น &renum[1] = (&renum + 8)

 รวมเป็น *(long long *)((unsigned long long)&renum + 8)

 

4. ก่อนการ push

 

ภาพที่ 4 ตำแหน่ง rsp ก่อนการ push 

การดูค่าใน Stack : (gdb) graph display *(long long *)((unsigned long long) ($rsp)  

(gdb) x/dg $rsp 

5. ตำแหน่ง rsp หลังการ push ครั้งที่ 1$

 

ภาพที่ 5 ตำแหน่ง rsp หลังการ push ครั้งแรก 

6 ตำแหน่ง rsp หลังจาก push ครั้งที่ 2

 

 ภาพที่ 6 ตำแหน่ง push ครั้งที่สอง

 7 ตำแหน่ง rsp หลังจาก pop ครั้งที่ 1

 

 ภาพที่ 7 การ pop จะทำให้ rsp บวกขึ้นไป

No comments:

Post a Comment