![](/img/trans.png)
[英]C - adding two single-precision floating point normal numbers, can't get result to infinity
[英]Understanding/Writing C code for Assembly with single precision floating point numbers
我無法破譯這個給定的匯編代碼:
1 unknown5:
2 pxor %xmm0, %xmm0
3 movl $0, %eax
4 jmp .L13
5 .L14:
6 movss (%rdx,%rax,4), %xmm1
7 mulss (%rsi,%rax,4), %xmm1
8 addss %xmm1, %xmm0
9 addq $1, %rax
10 .L13:
11 cmpq %rdi, %rax
12 jb .L14
13 rep ret
我認為正在發生的事情:
我不知道 function 的可能參數是什么,也不知道每個寄存器代表什么。 我知道 %rdi、%rsi 和 %rdx 是第一個、第二個和第三個參數(由於單精度操作可能是浮點指針?),而 %xmm0、%xmm1 是第一個和第二個浮點參數(或本地變量?)。 我也知道 %rax 是 64 位返回寄存器,但我不確定為什么在這里使用它。 有人可以詳細說明並糾正我的理解嗎? 謝謝你。
一些提示:
%xmm0, %xmm1
用於傳遞浮點參數,如果 function 實際上需要任何參數。 但是他們在進入 function 時所擁有的值是否真的以任何方式使用過?
不要認為%rax
天生就是“返回寄存器”。 這只是一個寄存器。 If the function is meant to return an integer or pointer then yes, %rax
(or one of its sub-registers) is where that return value will go, but in the meantime it's just a register that the code can use as it likes,就像你說的局部變量。 %xmm0
。
考慮到它們在movss/mulss
memory 操作數中的使用方式,您對%rdx
和%rsi
作為指針的猜測是不錯的。 這些指令究竟是從哪里加載值的? 另一方面, %rdi
不會出現在這樣的上下文中; 它是如何使用的?
注意movss (%rdx,%rax,4), %xmm1
不會設置%xmm1
等於通過將%rax
乘以 4 並添加%rdx
得到的值。 相反,它使用%rdx+%rax*4
作為地址,從 memory 中的該地址獲取單精度浮點數,並將其加載到%xmm1
中。 這就是( )
的含義——間接的 memory 參考。 如果您願意,它大致相當於 C 中的一元*
解引用運算符。
同樣,以下mulss
中相乘的值也取自 memory。
僅從代碼中沒有確定的方法來判斷它是打算返回一個int
(在%eax
中的返回值)還是long
( %rax
)或float/double
( %xmm0
)。 但你可以做出一個很好的猜測。 想想當 function 返回時每個寄存器的值。 function 為其調用者計算的值似乎更合理?
請注意,此 function 中沒有寫入 memory 的指令,因此它沒有“副作用”; 它的唯一目的必須是計算並返回一些值。
這個 function 似乎正在執行熟悉的數學運算。 你能說出它是什么嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.