C语言再学习1-定义变量

变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。在指令式语言中,变量通常是可变的

使用一块内存来存储我们的数据,再使用的时候通过变量地址(汇编层面)或者变量名(来访问)

  int         x      =     10;
变量类型     变量名    =    变量值;
char 8BIT 1字节
short 16BIT 2字节
int 32BIT 4字节
log 32BIT 4字节

当我们在c语言里创建一个变量的时候

int x = 5;
int y = 6;

00C517B8  mov         dword ptr [x],5  
00C517BF  mov         dword ptr [y],6  

实际上在汇编层面,我们通过MOV指令把变量的值放到x的位置

printf("%x",&x);       //0xdca034
我们的代码实际上是
mov dword ptr[0xdca034],5

如何证实这个汇编代码就是我们的定义变量?

我们先在全局变量定义一个x=5
int x = 5;
然后打印一次x的值
printf("%x\n", x);    //5
然后我们通过汇编指令mov来修改x的值
mov dword ptr ds:[x],0x12345678
printf("%x\n", x);   //0x12345678

在这里插入图片描述
当我们定义一个变量的时候
实际上就是使用汇编指令

当我们使用mov指令内联汇编强行修改x的变量是成功的,说明int x=5,和我们的汇编是一个作用
mov dword ptr ds:[x],5				int x=5;
mov dword ptr ds:[x],0x12345678 		    x=0x12345678;

上代码

#include "pch.h"
#include <iostream>

int x = 5;

int main()
{
	printf("%x\n", x);
	__asm
	{
		mov dword ptr ds:[x],0x12345678
	}
	printf("%x\n", x);
}

反汇编

#include "pch.h"
#include <iostream>

int x = 5;

int main()
{
00EC41E0  push        ebp  
00EC41E1  mov         ebp,esp  
00EC41E3  sub         esp,0C0h  
00EC41E9  push        ebx  
00EC41EA  push        esi  
00EC41EB  push        edi  
00EC41EC  lea         edi,[ebp-0C0h]  
00EC41F2  mov         ecx,30h  
00EC41F7  mov         eax,0CCCCCCCCh  
00EC41FC  rep stos    dword ptr es:[edi]  
	
	printf("%x\n", x);
00EC41FE  mov         eax,dword ptr [x (0ECA014h)]  
00EC4203  push        eax  
00EC4204  push        offset string "%x\n" (0EC7BCCh)  
00EC4209  call        _printf (0EC1375h)  
00EC420E  add         esp,8  
	__asm
	{
		mov dword ptr ds:[x],0x12345678
00EC4211  mov         dword ptr ds:[x (0ECA014h)],12345678h  
	}
	printf("%x\n", x);
00EC421C  mov         eax,dword ptr [x (0ECA014h)]  
00EC4221  push        eax  
00EC4222  push        offset string "%x\n" (0EC7BCCh)  
00EC4227  call        _printf (0EC1375h)  
00EC422C  add         esp,8  
}
00EC422F  pop         edi  
00EC4230  pop         esi  
00EC4231  pop         ebx  
00EC4232  add         esp,0C0h  
00EC4238  cmp         ebp,esp  
00EC423A  call        __RTC_CheckEsp (0EC1212h)  
00EC423F  mov         esp,ebp  
00EC4241  pop         ebp  
00EC4242  ret  

猜你喜欢

转载自blog.csdn.net/qq_35425243/article/details/82771407