汇编语言05-MOV指令(BYTE/WORD/DWORD/PTR)

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内存地址中的值

猜你喜欢

转载自blog.csdn.net/u011624903/article/details/110436612
今日推荐