x86-64 Assembly: สองรีจิสเตอร์ในวงเล็บ? movsd (%rdx,%rsi,8), %xmm0 [ซ้ำกัน]

movsd   (%rdx,%rsi,8), %xmm0    ## xmm0 = mem[0],zero

เส้นนี้ทำอะไร? โดยเฉพาะอย่างยิ่ง (%rdx,%rsi,8)? (คอมพิวเตอร์สถาปัตยกรรม x86-64) ฉันสร้างไฟล์ Assembly จากโค้ด C ที่ทำการคูณเมทริกซ์ซึ่งเกี่ยวข้องกับ 3 ลูป ฉันพบคู่มือมากมาย แต่ไม่มีข้อมูลที่เชื่อถือได้จริงๆ แม้แต่คู่มือที่ดู "เป็นทางการ" ก็ตาม

Mac OS X ของฉันกำลังสร้างสิ่งนี้ในรูปแบบ GAS ดังนั้น mov คำสั่งของรูปแบบต่างๆ จึงเป็นดังนี้:

mov source dest

แต่ไม่มีใครอธิบายว่าจะเกิดอะไรขึ้นเมื่อจู่ๆ (%rdx,%rsi,8) ก็เข้าร่วมปาร์ตี้

โปรดช่วยฉันเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ ขอบคุณ

ลิงค์ด้านล่าง สไลด์ 7 เป็นข้อมูลที่เกี่ยวข้องมากที่สุดที่ฉันหาได้ (แต่อาจอยู่ในไวยากรณ์ของ Intel ซึ่งมีแหล่งที่มาและปลายทางพลิกกลับ) https://www.bowdoin.edu/~sbarker/teaching/courses/spring16/its/lectures/lec15.pdf


person Leonard    schedule 20.07.2018    source แหล่งที่มา
comment
ดูตัวอย่าง คู่มือการใช้แก๊ส หรือการอ้างอิง at&t นับพันล้านรายการ รวมถึง วิกิแท็กไวยากรณ์ at&t นอกจากนี้คุณยังสามารถเปลี่ยนคอมไพเลอร์ของคุณเพื่อสร้างไวยากรณ์ของ Intel   -  person Jester    schedule 20.07.2018
comment
ว้าว แทบจะหาไม่ได้เลย ขอบคุณ ! ฉันคิดว่าคิดออกแล้ว ฉันไม่เข้าใจว่าทำไมใครๆ ก็ลงคะแนนเสียงคำถามของฉันโดยไม่มีคำอธิบาย   -  person Leonard    schedule 20.07.2018
comment
@Leonard คุณกำลังถามคำถามเกี่ยวกับไวยากรณ์ของภาษาการเขียนโปรแกรมโดยไม่เคยตรวจสอบการอ้างอิงสำหรับภาษาการเขียนโปรแกรมนั้น นั่นเป็นเหตุผลที่ผู้คนลงคะแนนให้คุณ: หากคุณค้นหาและอ่านข้อมูลอ้างอิงสำหรับไวยากรณ์ของ AT&T คุณจะไม่ต้องถามคำถามนี้   -  person fuz    schedule 21.07.2018
comment
@Leonard: หากคุณ ได้ พยายามค้นคว้าแต่ไม่พบอะไรเลย จะไม่มีใครรู้เรื่องนี้ได้ เว้นแต่คุณจะพูดอะไรเกี่ยวกับมัน SO ได้รับคำถามที่ไม่ดีมากมายทุกวันจากสิ่งที่ (ต่างจากสิ่งนี้) เข้าถึง Google ได้ง่าย ดังนั้น idownvotedbecau.se/noresearch มักจะมีเหตุผล ลิงก์นั้นอธิบายวิธีแสดงว่าคุณพยายามค้นหาคำตอบ การอ้างว่าคู่มืออย่างเป็นทางการไม่มีข้อมูลที่เชื่อถือได้นั้นไม่น่าเป็นไปได้ เว้นแต่คุณจะพบเพียงคู่มือสำหรับไวยากรณ์ของ Intel เท่านั้น   -  person Peter Cordes    schedule 22.07.2018
comment
ไม่. พวกคุณทุกคนกำลังคิดว่าฉันไม่ได้ทำการค้นคว้า และจริงๆ แล้วนั่นทำให้รู้สึกมีอุปการะคุณ เพียงจำไว้ว่า: ผู้เริ่มต้นคือคนที่ไม่รู้ว่าตัวเองไม่รู้อะไร แม้ว่าผู้เริ่มต้นจะดูคู่มือ แต่ก็อาจหรือไม่สามารถระบุข้อมูลที่จำเป็นและทำการเชื่อมต่อระหว่างข้อมูลเหล่านั้นได้ ฉันดูเอกสารแต่ไม่พบสิ่งที่ต้องการเพราะฉันไม่มีความรู้เพียงพอ นั่นน่าจะเป็นเหตุผลเพียงพอสำหรับฉันที่จะถามคำถาม   -  person Leonard    schedule 26.07.2018
comment
อีกอย่างที่หาซ้ำได้ง่ายกว่า: เลขฐานสิบหกที่มีการลงทะเบียนในวงเล็บหมายถึงอะไรใน Assembly   -  person phuclv    schedule 09.08.2018


คำตอบ (1)


สิ่งนี้เรียกว่า ไวยากรณ์ AT&T (หรือ GAS) มันเป็นทางเลือกแทนไวยากรณ์ของ Intel ที่ได้รับความนิยมมากกว่า ในไวยากรณ์ AT&T ไวยากรณ์ตัวถูกดำเนินการที่อยู่คือ:

segment:displacement(base register, index register, scale factor)

โดยที่ส่วนใหญ่เป็นทางเลือก ในตัวอย่างของคุณ %rdx คือรีจิสเตอร์พื้นฐาน %rsi คือรีจิสเตอร์ดัชนี และ 8 คือตัวประกอบสเกล

สิ่งที่ต้องทำคือโหลดส่วนล่าง 64 บิตของการลงทะเบียน xmm0 จากที่อยู่ rdx + rsi * 8 ในรูปแบบไวยากรณ์ของ Intel มันจะเป็น:

movsd   xmm0, [rdx+rsi*8]

ซึ่งใช้งานง่ายกว่าเล็กน้อย (อย่างน้อยสำหรับฉัน)

person cyco130    schedule 20.07.2018
comment
ขอบคุณ หากทำได้คุณช่วยโหวตคำถามของฉันได้ไหม ไม่ใช่เพื่อความนิยม แต่เพื่อให้คนอื่นสามารถค้นหาโพสต์นี้และรับความช่วยเหลือได้จริง - person Leonard; 20.07.2018
comment
มีคนตัดสินใจลงคะแนนเสียงคำถามนี้โดยไม่มีคำอธิบาย ซึ่งหยาบคายมาก ดังนั้นฉันจึงกังวลว่าคนอื่นจะไม่พบสิ่งนี้และขอความช่วยเหลือ - person Leonard; 20.07.2018
comment
ดู เหตุใดจึงไม่บังคับให้แสดงความคิดเห็นเกี่ยวกับการลงคะแนนเสียงลงคะแนน และเหตุใดแนวคิดต่างๆ จึงแนะนำให้ปิดฉากดังกล่าว และคาดหวังให้ไม่เปิดเผยตัวตนมากกว่านี้ด้วย downvotes เนื่องจากจรรยาบรรณใหม่ - person Jester; 20.07.2018
comment
@Leonard คำถามนี้มีคำถามซ้ำกัน 100% ที่นี่ (แต่ฉันขี้เกียจเกินไปที่จะค้นหามัน ... รวมถึงลงคะแนนให้คุณโดยไม่ค้นหา ... ฉันแค่แสดงความคิดเห็นนี้ JFYI ฉันสงสัยว่าทำไมคุณไม่ทำ ค้นหามันในขณะที่ค้นหา ... BTW ฉันแค่ลองสนุก Google x86 at&t ไวยากรณ์ตัวถูกดำเนินการหน่วยความจำ -› ลิงก์แรก en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax - อยู่ตรงนั้น จุดที่ 4 ไวยากรณ์ที่อยู่ตัวถูกดำเนินการ ...) (ฉันเดาว่าคุณไม่สามารถเดาคำที่ถูกต้องได้ เพราะไม่เช่นนั้นคุณควรตรวจสอบ การเซ็นเซอร์ประเภทใดที่ใช้กับคุณหากเครื่องมือค้นหาของคุณไม่พบ) - person Ped7g; 20.07.2018
comment
@ Ped7g ด้วยความเป็นธรรมมันเป็นเรื่องยากที่จะหาข้อมูลใด ๆ โดยที่ไม่รู้ว่ามันเป็นไวยากรณ์ของ AT&T - person cyco130; 20.07.2018
comment
@ cyco130 อาจเป็นไปได้ว่าบวกแม้ว่าคุณจะรู้ว่าคุณกำลังค้นหาไวยากรณ์ของ AT&T และ GAS แต่คุณก็ยังไม่รู้คำเช่นตัวถูกดำเนินการหน่วยความจำและสิ่งที่คล้ายกัน ... โดยพื้นฐานแล้วมีคนใหม่ทั้งหมดในการประกอบต้องการหนังสือหรือที่ปรึกษาที่ดี (หรือทั้งสองอย่าง) หรือบทช่วยสอนคุณภาพสูงบางเรื่อง แต่นั่นเป็นเพียงการเริ่มต้นก่อนที่จะอ่านหนังสือดีๆ สักเล่ม และบทช่วยสอนส่วนใหญ่อาจไม่รบกวนคำศัพท์ทางเทคนิคมากนัก... การหาแหล่งข้อมูลที่ดีอาจเป็นเรื่องยาก นั่นคือจุดที่ stackoverflow.com/tags/x86/info อาจช่วยได้มาก เนื่องจากเต็มไปด้วยทรัพยากรที่ได้รับการตรวจสอบแล้ว - person Ped7g; 20.07.2018
comment
@ Ped7g สวัสดี Ped7g ฉันคิดว่ามันผิดมากที่จะถือว่าฉันหรือผู้ที่ถามคำถามที่นี่ทำการค้นคว้าเพียงเล็กน้อยหรือไม่มีเลย ปัจจัยสำคัญประการหนึ่งคือช่องว่างระหว่างประสบการณ์และความรู้ สำหรับผู้เริ่มต้นเช่นฉัน ฉันไม่เพียงแต่คุ้นเคยกับไวยากรณ์เท่านั้น แต่บ่อยครั้งที่ฉันไม่รู้ว่าต้องใช้คำใดเพื่อค้นหาสถานการณ์เฉพาะของตัวเอง สำหรับคนที่รู้แนวคิดและคีย์เวิร์ดจะค้นหาได้ง่าย แต่สำหรับมือใหม่ อาจแทบจะเป็นไปไม่ได้เลยเพียงเพราะฉันไม่รู้คีย์เวิร์ดคำเดียว ฉันคิดว่านี่เกี่ยวข้องกับ mov คำสั่งมากกว่าไวยากรณ์ของ GAS - person Leonard; 20.07.2018
comment
@ Ped7g และใช่ในขณะที่ฉันแสดงความคิดเห็นที่มีคนตอบ ผู้เริ่มต้นคือคนที่ไม่รู้ว่าเขาหรือเธอไม่รู้อะไร ฉันคิดว่ามันเป็นเรื่องธรรมดาที่คนๆ หนึ่งจะหันไปถามคำถามหลังจากใช้ความพยายามตามสมควร (และแถมคุณเคยช่วยฉันมาก่อนฉันเลยคิดว่าคุณรู้ว่าฉันไม่ได้ขี้เกียจขนาดนั้น :) ) - person Leonard; 20.07.2018
comment
@Leonard ฉันเข้าใจความสับสนของคุณ คำแนะนำทั่วไปของฉันสำหรับผู้เริ่มต้นคือ: หากคุณต้องการเรียนรู้ภาษา ให้ศึกษาบทช่วยสอนสำหรับภาษานั้นด้วยตัวเองและฝึกจากหน้าไปหลังก่อนที่จะถามคำถามใดๆ เลย คำถามมากมายที่คุณได้รับระหว่างการศึกษาจะได้รับการแก้ไขในส่วนต่อๆ ของบทช่วยสอน ส่วนบทช่วยสอนหลายข้อมักทิ้งส่วนที่ไม่ชัดเจนไว้ในส่วนเดียวเพื่อเป็นแรงจูงใจที่ดีในการแนะนำแนวคิดใหม่ในส่วนถัดไป โดยเฉพาะอย่างยิ่งกับแอสเซมบลี มันเป็นวิธีที่แย่มากในการเรียนรู้แนวคิดโดยเริ่มจากการสุ่มตัวอย่างโค้ดและพยายามค้นหาสิ่งต่าง ๆ ด้วยตัวเอง - person fuz; 21.07.2018
comment
ดังนั้นโปรดช่วยตัวเองและใช้บทช่วยสอนที่เหมาะสม หากคุณเพียงแค่พยายามที่จะขยายมันโดยการรวมตัวอย่างโค้ดแบบสุ่มเข้าด้วยกันและพยายามทำความเข้าใจ คุณอาจจะมีความเข้าใจผิดและช่องว่างมากมายในความเข้าใจของคุณ เพราะคุณจะมีช่วงเวลาที่ยากลำบากในการมองภาพใหญ่ โปรดอย่าพยายามเรียนรู้เช่นนี้ แม้ว่ามันจะน่าเบื่อ แต่คุณควรฝึกฝนผ่านบทช่วยสอนจริงๆ - person fuz; 21.07.2018