0
A
回答
2
是,
您的代碼:
mov rax,rdx
mov eax,edx
將執行以下操作。
rax <= rdx
high 32 bits of rax <= 0, low 32 bits of rax <= edx.
分配32位寄存器將使該寄存器的較高部分爲零。
與此相反的:
mov rax,rdx : rax <= rdx
mov ax,dx : High 48 bits of rax is unchanged!, low 16 bits of rax <= dx
這同樣適用於字節寄存器。
32位爲64位寄存器的上半部分指定零的原因是它阻止了部分寄存器更新,這會導致指令流水線延遲。
在32或64位模式中使用16比特的碼導致延遲在以下情形:
mov rax,-1 //1 cycle
mov ax,dx //1 cycle
//stall, the values of rax-upper and ax need to be combined
mov r8,rax //2 cycles
一個更好的選擇是
mov rax,-1 //1 cycle
movzx eax,dx //runs concurrent with previous instruction, 0 cycles
mov r8,rax //1 cycle
//Total 2 cycles, twice as fast.
此代碼是不等同於它上面的樣品,但這就是整個觀點。儘可能避免部分寄存器更新。 另請注意,由於上述原因,movzx eax,dx
相當於movzx rax,dx
。在x64上它縮短了一個字節,因此是首選的形式。
請注意,我沒有使用ATT的語法,原則
+0
「更好的選擇」的確速度更快,但不等同於原始的延遲代碼。 'movzx'使初始的'mov'完全多餘。另外,由於本答案前半部分給出的理由,可以更有效地將'movzx'編寫爲'movzx eax,dx'。 –
相關問題
- 1. 32位寄存器將64位分成兩個32位寄存器
- 2. 在32位和64位進程之間共享共享內存段
- 3. 零輸出64位寄存器的前32位
- 4. 大會:與32位寄存器的64位乘法
- 5. 在32位窗口下的64位寄存器
- 6. 寄存器長度,內存大小和32/64位計算(MIPS)
- 7. 64位的dll寄存器
- 8. 將分離64位操作系統上的32位進程共享相同的地址空間?
- 9. 負載32位寄存器
- 10. Nexus/Maven可以同時存儲32位和64位工件嗎?
- 11. SSE 64位寄存器
- 12. 混淆了32位和64位共享對象/庫
- 13. 展位乘法器在64位寄存器的高32位中放置1
- 14. 32位寄存器作爲8位寄存器
- 15. 32位和64位Python會碰撞嗎?
- 16. ASCII和64位寄存器彙編
- 17. 32位和64位的ODP.NET
- 18. 大廈32位共享庫的64位Linux與cmake的
- 19. Solr索引時間32位和64位
- 20. asp.net中的64位和32位機器
- 21. 共享庫-64位上的Java 32位Ubuntu
- 22. 如何取消存儲在32位寄存器對中的64位整數?
- 23. 使用64位整數迭代器的32位地址空間?
- 24. 做popup.html和background.html共享相同的本地存儲空間嗎?
- 25. 具有相同GUID的32位和64位ActiveX?
- 26. 32位和64位的WebService編程有不同嗎?
- 27. 64位debian和32位酒
- 28. C# - 在32位和64位
- 29. 在32位和64位
- 30. 32位和64位性能
是的問題,但不是你想的原因。你也可以試試它。 – Jester
當然可以。無論您是使用8/16/32/64位模式尋址,它都是相同的寄存器。這是一個很好的圖表:http://stackoverflow.com/a/228367/14955 – Thilo
@Jester「不是你想的原因。」請詳細說明。 – Thilo