x86汇编与C代码指针解引用及乘法操作讲解请求
你的理解存在多处偏差,以下是逐条修正:
原理解1:EAX存储y对应内存区域的值
纠正:如果后续涉及EAX的解引用操作(即访问[eax]),那EAX存储的是y的内存地址(指针),而非y的值。只有当执行mov eax, y这类指令时,EAX才会直接加载y的值;若加载的是指针,指令逻辑会是获取y的内存地址(汇编中通常通过lea eax, y或直接引用指针变量实现)。原理解2:ECX存储EAX指向内存区域的值,即y的指针
纠正:[eax]是x86汇编的解引用操作,表示取EAX中地址指向的内存内容。如果EAX是y的指针,那么mov ecx, [eax]会把y的数值加载到ECX,而非y的指针——你完全搞反了解引用的作用。原理解3:imul指令将EAX指针(y的指针)与x的值相乘
纠正:imul指令针对数值运算,很少直接对指针地址做乘法(除非是计算数组偏移,但那通常是乘元素字节数)。合理的逻辑是EAX存储的是y的数值,imul eax, x执行的是EAX = EAX * x,把y和x的乘积存回EAX。你混淆了指针和数值的操作场景。原理解4:将y的指针存入EDX,再将乘法结果存入y的指针指向的位置
纠正:如果要把乘法结果存回y的内存,正确的逻辑是:若EDX存储的是y的指针(地址),执行mov [edx], eax会把EAX中的乘积写入y的内存区域。但前提是前面的imul操作的是数值,而非指针地址。
举个对应C代码y = y * x;的汇编示例,更直观:
mov eax, [y] ; 加载y的数值到EAX imul eax, [x] ; EAX = y * x mov [y], eax ; 把乘积写回y的内存
如果是指针场景(比如*y_ptr = *y_ptr * x;),汇编逻辑是:
mov eax, y_ptr ; EAX存储y的指针(地址) mov ecx, [eax] ; ECX加载y的数值(解引用指针) imul ecx, [x] ; ECX = y * x mov [eax], ecx ; 写回y的内存
内容的提问来源于stack exchange,提问作者UnusualCommonSense

