C語言再學習-定義變數
阿新 • • 發佈:2018-12-10
當我們在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