gpt4 book ai didi

c - 使用单精度 float 理解/编写用于汇编的 C 代码

转载 作者:行者123 更新时间:2023-12-04 07:50:08 25 4
gpt4 key购买 nike

我无法破译这个给定的汇编代码:

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:函数名为 unknown5()
  • 2:设置浮点返回寄存器为0
  • 3:设置 32 位返回寄存器为 0
  • 4:跳转到 10:
  • 11: 如果 %rdi > %rax, 转到 5:, 否则转到 13:
  • 6:%xmm1 = %rdx+%rax+4
  • 7:%xmm1 *= %rsi+%rax+4
  • 8:%xmm0 += %xmm1
  • 9:%rax += 1
  • 13: 返回 %eax、%rax 或 %xmm0??

  • 我不知道函数的可能参数是什么,也不知道每个寄存器代表什么。我知道 %rdi、%rsi 和 %rdx 是第一个、第二个和第三个参数(由于单精度运算,这可能是浮点指针?),而 %xmm0、%xmm1 是第一个和第二个浮点参数(或本地变量?)。我也知道 %rax 是 64 位返回寄存器,但我不确定为什么在这里使用它。有人可以详细说明并纠正我的理解吗?谢谢你。

    最佳答案

    一些提示:

  • %xmm0, %xmm1用于传递浮点参数,如果函数实际接受任何参数。但是他们在进入函数时所拥有的值是否以任何方式实际使用过?
  • 不要想%rax因为本质上是“返回寄存器”。这只是一个寄存器。如果该函数旨在返回整数或指针,则是,%rax (或其子寄存器之一)是返回值所在的位置,但与此同时,它只是代码可以随意使用的寄存器,就像您所说的局部变量。 %xmm0 也是如此.
  • 您对 %rdx 的猜测和 %rsi考虑到它们在 movss/mulss 中的使用方式,作为指针是一个很好的选择。内存操作数。这些指令从哪里加载值?另一方面,%rdi不会出现在这种情况下;它是如何使用的?
    备注 movss (%rdx,%rax,4), %xmm1未设置 %xmm1等于%rax相乘得到的值通过 4 并添加 %rdx .相反,它使用 %rdx+%rax*4作为地址,从内存中的该地址获取单精度浮点数,并将其加载到 %xmm1 .这就是( )表示 - 间接内存引用。如果您愿意,它大致相当于一元 * C中的解引用运算符。
    同样,在以下 mulss 中乘以的值也是从内存中提取的。
  • 仅凭代码无法确定是否打算返回 int (返回值在 %eax 中)或 long ( %rax ) 或 float/double ( %xmm0 )。但是你可以很好地猜测。考虑函数返回时每个寄存器的值。作为要为其调用者计算的函数的值,哪个似乎更合理?
    请注意,此函数中没有写入内存的指令,因此它没有“副作用”;它的唯一目的必须是计算并返回一些值。
  • 此函数似乎在执行熟悉的数学运算。你能说出它是什么吗?
  • 关于c - 使用单精度 float 理解/编写用于汇编的 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67030292/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com