void *p = &&abc;
ฉันมาข้ามชิ้นส่วนของรหัส ความสำคัญของ&&
ที่นี่คืออะไร? ฉันรู้เกี่ยวกับการอ้างอิง rvalue แต่ฉันคิดว่า&&
ใช้ในบริบทนี้แตกต่างกัน อะไร&&
บ่งชี้ในvoid *p = &&abc;
?
void *p = &&abc;
ฉันมาข้ามชิ้นส่วนของรหัส ความสำคัญของ&&
ที่นี่คืออะไร? ฉันรู้เกี่ยวกับการอ้างอิง rvalue แต่ฉันคิดว่า&&
ใช้ในบริบทนี้แตกต่างกัน อะไร&&
บ่งชี้ในvoid *p = &&abc;
?
คำตอบ:
&&
เป็นส่วนขยายของ gccเพื่อรับที่อยู่ของป้ายกำกับที่กำหนดไว้ในฟังก์ชันปัจจุบัน
void *p = &&abc
ผิดกฎหมาย C99 และ C ++ มาตรฐาน
ซึ่งรวบรวมด้วย g ++
void*
หากพวกเขาคิดค้นไวยากรณ์ใหม่สำหรับตัวชี้ฉลากพวกเขาควรจะคิดค้นรูปแบบใหม่สำหรับมันเช่นเดียวแทนการใช้
__forceinline
เหรอ? __declspec(naked)
เหรอ? MSVCisms หนึ่งที่ฉันชอบคือ: template<typename T> class X { friend T; }
ซึ่งไม่ถูกต้อง C ++ 03
นั่นเป็นอยู่ของฉลากและมันเป็นเฉพาะคุณสมบัติในการGCC
int main(void) {
void* startp;
s:
startp = &&s;
printf("the assignment above starts at address %p\n", startp);
return 0;
}
คุณสามารถหาได้ด้วยตัวเองโดยการทดสอบ:
int main(void) {
void* startp;
int a;
startp = &&a;
printf("startp=%p\n", startp);
return 0;
}
ในกรณีนี้ GCC กล่าวว่า:
ข้อผิดพลาด: ใช้ป้ายกำกับ 'a' แต่ไม่ได้กำหนด
คุณต้องรู้จักแอสเซมเบลอร์เพื่อที่จะเข้าใจสิ่งนี้ แต่ฉันจะพยายามอธิบายให้คุณทราบว่าที่อยู่ของป้ายกำกับหมายถึงอะไร
หลังจากระบบปฏิบัติการโหลดไฟล์. exe จากดิสก์ส่วนประกอบของระบบปฏิบัติการที่เรียกว่า "ตัวโหลด" (windows มี "PE Loader", linux มี "ELF loader" หรืออาจจะเป็นไฟล์อื่น ๆ หากคอมไพล์อยู่ใน เคอร์เนล) ทำ "เวอร์ชวลไลเซชัน" ของโปรแกรมนั้นโดยเปลี่ยนเป็นกระบวนการ
กระบวนการนี้คิดว่าเป็นเพียงหน่วยเดียวใน RAM และสามารถเข้าถึง RAM ทั้งหมดได้ (นั่นคือ 0x00000000-0xFFFFFFFF บนเครื่อง 32 บิต)
(ข้างต้นเป็นเพียงมุมมองสั้น ๆ ของสิ่งที่เกิดขึ้นคุณต้องเรียนรู้การประกอบเพื่อให้เข้าใจอย่างถ่องแท้ดังนั้นอดทนกับฉัน)
ตอนนี้ป้ายกำกับในซอร์สโค้ดนั้นโดยพื้นฐานแล้วคือที่อยู่ "ป้าย goto;" ไม่ทำอะไรอื่นนอกจากการข้ามไปยังที่อยู่นั้น (ลองนึกถึงตัวชี้คำสั่งในชุดประกอบ) ป้ายนี้เก็บที่อยู่ RAM นี้และนั่นคือวิธีที่คุณสามารถค้นหาที่อยู่นั้นได้
หลังจากที่คุณได้เรียนรู้ ASM แล้วคุณจะรู้ว่าที่อยู่นั้นชี้ไปที่คำสั่งภายใน.text
ส่วนของไฟล์ปฏิบัติการ .text
ส่วนคือหนึ่งซึ่งถือ (binary) คุณโปรแกรมรหัสที่จะดำเนินการ
คุณสามารถตรวจสอบสิ่งนี้ได้ด้วย:
objdump -x a.out
ตามที่อธิบายไว้ในGCCคุณสามารถใช้เพื่อเริ่มต้นตารางกระโดด เครื่องกำเนิดสแกนเนอร์บางรุ่นเช่นre2c (ดู-g
พารามิเตอร์) ใช้เพื่อสร้างเครื่องสแกนที่มีขนาดกะทัดรัดมากขึ้น บางทีอาจมีตัวสร้างพาร์เซอร์ที่ใช้เทคนิคเดียวกัน