งงกับคำสั่ง x86 MOV

จากคู่มือ Intel64 & IA-32 เล่ม 2a มีการใช้งานที่เป็นไปได้มากมายสำหรับคำสั่ง 'mov' เช่น:

mov r64, m64      # move m64 to r64

mov rax, moffs64  # move quadword at (offset) to RAX

ฉันเขียนโค้ดเพื่อทดสอบ (แก๊ส, ไวยากรณ์ของ Intel):

movabs rax, label

movabs rax, offset label

...
label:
    .quad 0x112233445566

หลังจากแอสเซมบลี ลิงก์ และ objdump ฉันได้รับแอสเซมบลีที่เกี่ยวข้อง:

mov rax, qword ptr ds:0xffff80000000008e
mov rax, 0xffff80000000008e

แน่นอนว่าคำสั่งที่สองที่ฉันเขียนไม่ใช่คำสั่งที่คาดหวังให้เป็นคู่มือ คำแนะนำสำหรับรูปแบบในคู่มือคืออะไร?


person Gary Yin    schedule 22.07.2014    source แหล่งที่มา
comment
แอสเซมเบลอร์จะเลือกระหว่างสองเวอร์ชันนั้นโดยอัตโนมัติ แอสเซมบลีจะเหมือนกัน movabs rax, offset label ของคุณไม่ใช่ทั้งสองอย่าง มันคือ mov r64, imm64 หากคุณต้องการดูเวอร์ชันแรก นั่นคือ mov r64, m64 ให้ใช้รีจิสเตอร์อื่นที่ไม่ใช่ rax เช่น mov rdx, label   -  person Jester    schedule 22.07.2014


คำตอบ (1)


moffs หมายถึงตัวถูกดำเนินการหน่วยความจำ นี่คือคำอธิบายจากคู่มือ Intel:

moffs8, moffs16, moffs32, moffs64 — ตัวแปรหน่วยความจำอย่างง่าย (ออฟเซ็ตหน่วยความจำ) ประเภทไบต์ คำ หรือคำคู่ที่ใช้โดยตัวแปรบางตัวของคำสั่ง MOV ที่อยู่จริงจะได้รับจากการชดเชยอย่างง่ายที่สัมพันธ์กับฐานส่วน ไม่มีการใช้ ModR/M ไบต์ในคำสั่ง ตัวเลขที่แสดงด้วย moffs ระบุขนาด ซึ่งกำหนดโดยแอตทริบิวต์ขนาดที่อยู่ของคำสั่ง

ตัวดำเนินการ offset ซึ่งใช้โดยแอสเซมเบลอร์ เช่น MASM และ TASM ช่วยให้คุณ "ชดเชยในส่วนที่เกี่ยวข้องของ [ตัวถูกดำเนินการ]" (ที่มา) ดังนั้นสิ่งที่คุณได้รับจาก offset label คือออฟเซ็ตของ label ซึ่งเป็นค่าที่อยู่ตรงหน้า คุณกำลังดูสองสิ่งที่แตกต่างกัน: การรับค่าที่จัดเก็บไว้ในที่อยู่เฉพาะ กับการรับที่อยู่นั้นเอง

ฉันไม่รู้ว่าไวยากรณ์ GAS จะเป็นอย่างไรเพื่อให้ได้ตัวแปร moffs64 แต่ด้วย NASM คุณสามารถเขียน mov rax,[qword label] ได้ (โปรดทราบว่าการเข้ารหัสนี้จะยาวกว่าที่คุณเพิ่งเขียน mov rax,[label] - เช่น mov r64, r/m64)

person Michael    schedule 22.07.2014
comment
ไวยากรณ์ GAS จะเป็นเพียงแค่ movabs label, %rax สิ่งนี้ประกอบเป็น opcode 48 a1 ซึ่งเป็นคำสั่ง mov เดียวที่รองรับ moffs64 - person ilpelle; 17.02.2016