ฉันกำลังอ่านโค้ดอีมูเลเตอร์บางอย่างและฉันได้ตอบโต้สิ่งที่แปลกอย่างแท้จริง:
switch (reg){
case 'eax':
/* and so on*/
}
เป็นไปได้อย่างไร? ฉันคิดว่าคุณทำได้เฉพาะswitchในประเภทอินทิกรัล มีกลอุบายมาโครบางอย่างเกิดขึ้นหรือไม่?
intดังนั้นจึงถูกต้อง อย่างไรก็ตามค่าของค่าคงที่หลายอักขระถูกกำหนดให้ใช้งานได้ดังนั้นโค้ดอาจไม่ทำงานตามที่คาดไว้ในคอมไพเลอร์อื่น ยกตัวอย่างเช่นeaxอาจจะมี0x65, 0x656178, 0x65617800, 0x786165, 0x6165หรือสิ่งอื่น
'eax' != 'ebx'แน่นอนดังนั้นมันจึงล้มเหลวเพียงหนึ่งหรือสองตัวอย่างของคุณ แม้ว่าอาจมีโค้ดบางส่วนที่มีผลบังคับใช้*(int*)("eax") == 'eax'และทำให้ตัวอย่างส่วนใหญ่ของคุณล้มเหลว
'eax'อาจเปรียบเทียบเท่ากับ'ebx'หรือถึง'ax'และคำสั่ง switch จะไม่ทำงานตามที่ตั้งใจไว้
'eax'และแจกแจงค่าจำนวนเต็มคงที่