2021年4月9日星期五

Understanding/Writing C code for Assembly with single precision floating point numbers

I am having trouble deciphering this given Assembly code:

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  

What I think is going on:

  • 1: function named unknown5()
  • 2: sets the floating point return register to 0
  • 3: sets the 32-bit return register to 0
  • 4: jumps to 10:
  • 11: if %rdi > %rax, go to 5:, else go to 13:
  • 6: %xmm1 = %rdx+%rax+4
  • 7: %xmm1 *= %rsi+%rax+4
  • 8: %xmm0 += %xmm1
  • 9: %rax += 1
  • 13: return %eax, %rax, or %xmm0??

What I have no clue of is what the possible parameters are of the function, nor what each register is representing. I know %rdi, %rsi, and %rdx are first, second, and third parameters (that might be floating point pointers due to single precision operations?), and %xmm0, %xmm1 are first and second floating point parameters (OR local variables?). I also know %rax is the 64-bit return register, but am unsure why it is used here as such. Could someone please elaborate and correct my comprehension? Thank you.

https://stackoverflow.com/questions/67030292/understanding-writing-c-code-for-assembly-with-single-precision-floating-point-n April 10, 2021 at 10:31AM

没有评论:

发表评论