assembly 逐步说明指针取消引用和乘法的基本C / x86汇编代码

f4t66c6m  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(108)

我今天来这里是因为我目前正在一所大学学习汇编语言x86的入门知识。因为我们之前学习了C语言,所以老师要求我们解释这部分代码。

我对它的基本理解是:

  • EAX将包含与y关联的存储器区域的值。
  • ECX将包含与EAX关联的存储区的值,即指向y的指针。
  • IMU1将把指针EAX(即指向Y的指针)的值与X的值相乘。
  • 我们在EDX中移动y的指针,然后将乘法的值移动到y的指针。

我说的对吗?如果不对,有没有人能给予我一个更好的解释我误解的部分?
先谢谢你了。

zphenhs4

zphenhs41#

与任何汇编程序一样,您几乎需要手边有伊萨手册,因为每个指令都有很多不同的风格,这取决于您传递给它的内容。
首先检查What does dword ptr mean?,基本上,这32位访问特定地址的内容。
因为y是一个指针,所以y的内容是*y所在的地址,所以首先y地址将被移到eax,然后刚刚上传到eax的地址的内容将被移到ecx
带有两个操作数的imul如下所示:

  • 双操作数形式.使用这种形式,目的操作数(第一个操作数)乘以源操作数(第二个操作数).目的操作数是通用寄存器,源操作数是立即数,通用寄存器或内存位置.乘积存储到目的操作数位置.

所以它将ecx与存储在dword ptr[x]中的内容相乘,也就是x的内容,并将结果存储在ecx中。
然后地址y再次被上传到寄存器edx(可能是优化缺陷,因为eax已经保存了它),然后存储在exc中的乘法结果被移到该位置。

i7uaboj4

i7uaboj42#

带注解的代码:

mov     eax,dword ptr [y]         ;eax = y
        mov     ecx,dword ptr [eax]       ;ecx = *y
        imul    ecx,dword ptr [x]         ;ecx = (*y) * x
        mov     edx,dword ptr [y]         ;edx = y
        mov     dword ptr[edx], ecx       ;(*y) = (*y) * x

相关问题