1. 程式人生 > >C語言再學習-定義變數

C語言再學習-定義變數

當我們在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