字符串偏移量_C语言局部变量:实数、字符串

实数

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

push ecx

push offset aHelloS ; "Hello %s!n"

call _printf

Wang Jianyong在可执行文件中的物理地址:

2b550b785befe800fa2b471b162f0b58.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值