变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。在指令式语言中,变量通常是可变的
使用一块内存来存储我们的数据,再使用的时候通过变量地址(汇编层面)或者变量名(来访问)
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