MOV 目标,源
目标:内存地址或者寄存器
(注:似乎不是内存地址,应该是一个变量,说地址感觉是指针,实际不是指针,例如下面的代码就不正确)
int a = 0;
int* b = &a;
_asm {
mov eax,5;
sub eax,4;
mov b,eax;// 此处使用了指针,结果是错误的
}
std::cout << a << std::endl;
源:立即数,内存地址,或者寄存器
MOV指令不会对标志位影响
_asm mov AL, 0xCC;
unsigned a;
_asm mov a, EAX;
// 会打印出XXXXXXCC,其中前6个X不一定是什么,因为是别的程序留下来的
std::cout << std::hex << a << std::endl;
上述代码中的AL寄存器是低8位,所以超过8位的代码MOV命令将不会理会
_asm mov AL, 0xCCC;
unsigned a;
_asm mov a, EAX;
// 依然打印出CC,而不会打印出CCC
std::cout << std::hex << a << std::endl;
日记:通过vs查看反汇编的时候会看见DWORD,BYTE,WORD这三个数据,它们的意思是
typedef unsigned long DWORD;
typedef unsigned char BYTE;
typedef unsigned short WORD;
即:
BYTE:8位
WORD: 16位
DWORD: 32位
int c() {
int ca = 666;
return ca;
}
通过反汇编查看是下面这样子的
int ca = 666;
// 将666这个数放到变量ca所在的内存处
00561EB8 mov dword ptr [ca],29Ah
return ca;
// 将ca所在的内存处的值,取出来,放到eax寄存器中
00561EBF mov eax,dword ptr [ca]
日记:[]中括号表示ca所在的内存地址里的值,dword ptr [xxx]是一个常见格式,表示操作xxx内存地址中的值