簡體   English   中英

理解/編寫 C 代碼,用於單精度浮點數的匯編

[英]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

認為正在發生的事情:

  • 1: function 命名為 unknown5()
  • 2:設置浮點返回寄存器為0
  • 3:設置32位返回寄存器為0
  • 4:跳轉到 10:
  • 11:如果 %rdi > %rax,則 go 為 5:,否則 go 為 13:
  • 6: %xmm1 = %rdx+%rax+4
  • 7: %xmm1 *= %rsi+%rax+4
  • 8: %xmm0 += %xmm1
  • 9: %rax += 1
  • 13:返回 %eax、%rax 或 %xmm0??

我不知道 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM