int* pnVar;
和
char* pcVar;
这两个指针在做加法的时候,计算机怎么知道是加1个还是4个byte
对应的汇编代码:
|
1
2
3
4
5
6
7
8
|
pnVar++;00413031
mov eax,dword ptr [pnVar]00413034
add eax,400413037
mov dword ptr [pnVar],eaxpcVar++;0041303A
mov eax,dword ptr [pcVar]0041303D
add eax,100413040
mov dword ptr [pcVar],eax |
[理解]
“类型” 的概念只存在于编译前,编译器会识别出各种数据类型,然后生成目标文件,obj里面就包含了每条语句的汇编实现,所以pnVar++或者pcVar++,在生成的PE文件.text节里面早已写死。
在运行期不需要关心所谓的“类型”。
[反思]
之前想不通此问题的原因:
认为汇编语言和C语言一样,变量在操作前需要知道数据类型
而没有切换到汇编的思维,在汇编眼里,或者说CPU眼里,取指(opcode)执行时,只认识bit流,opcode告诉bus一次取多少位数据,cpu就取多少位,压根不用知道所谓的类型
[结论]
从汇编 reversing 到高级语言,需要自如的切换思维
本文深入探讨了C语言中指针加法的底层实现原理,解释了编译器如何根据指针类型确定加法操作的数据单位,并通过具体的汇编代码示例进行说明。
778

被折叠的 条评论
为什么被折叠?



