实数
C语言在函数内创建的局部变量一般保存在工作栈中,在工作栈中为该变量开辟一个存储空间,并进行赋值。
局部变量的运算需要寄存器的参与,也就是需要把变量从工作栈中载入到寄存器中,运算完成后再把结果从寄存器存回栈空间内。
int a = 20;
int b = 30;
printf("the number is %dn",a+b);
mov [ebp+var_14], 14h // int a = 20; 将立即数20放到栈[ebp+var_14]
mov [ebp+var_18], 1Eh //int b = 30; 将立即数30放到栈[ebp+var_18]
mov edx, [ebp+var_14] //将栈中[ebp+var_14]的值mov到edx寄存器
add edx, [ebp+var_18] //将栈中[ebp+var_18]的值加到edx寄存器中
push edx //为调用printf函数,将参数(a+b)压栈
字符串
C语言把函数内的字符串(即数组)变量存储在可执行文件中,当需要的时候直接从可执行文件内直接加载。
char name[] = "Wang Jianyong";
printf("Hello %s!n",name);
mov eax, ds:dword_42201C //从可执行文件偏移量0x0042201C的Wang四个字符加载到eax寄存器
mov [ebp+var_10], eax
mov ecx, ds:dword_422020 //从可执行文件偏移量0x00422020的" Jia"四个字符加载到eax寄存器
mov [ebp+var_C], ecx
mov edx, ds:dword_422024 //从可执行文件偏移量0x00422024的"nyon"四个字符加载到eax寄存器
mov [ebp+var_8], edx
mov ax, ds:word_422028 //从可执行文件偏移量0x00422024的"g"四个字符加载到eax寄存器
mov [ebp+var_4], ax
lea ecx, [ebp+var_10] //将Wang Jianyong栈中首地址赋值给ecx寄存器,然后压栈,即完成了字符串Wang Jianyong首地址传递给printf函数的工作。
![a71a35dde882be9eba92ac78b6c7c5bb.png](https://i-blog.csdnimg.cn/blog_migrate/f0127845d44aa967fe444e6fcf57b0fa.jpeg)
push ecx
push offset aHelloS ; "Hello %s!n"
call _printf
Wang Jianyong在可执行文件中的物理地址:
![2b550b785befe800fa2b471b162f0b58.png](https://i-blog.csdnimg.cn/blog_migrate/a2b200fe39567fedc77429ea4267504d.png)