MOVSX符号扩展传送和MOVZX零扩展传送

命令解释
movzx将用0来扩展填充操作数A的余下空间。操作数B空间必须小于操作数A;如, mov al,0xFF movzx ecx,al 执行后ecx结果为000000FF
movsx将用操作数B的符号位扩展填充操作数A的余下空间,如果是负数则符号位为1,如果是正数则和MOVZX功能相同,操作数B空间必须小于操作数A; 如: mov al,0xFF movsx ecx,al FF的符号位为1,执行之后ecx的值为FFFFFFFF; mov al,0x7F movsx ecx,al 7F的符号位为0,ecx的值为000000FF
void Function()
{
	char c = 0xff;		
	short s = c;	
		
	//汇编代码为:
	//movsx  ax,byte ptr [ebp-4]
	//mov   word ptr [ebp-8],ax
	//默认为有符号数,使用movsx指令执行
 
 	//======================
 	unsigned char uc = 0xff;
 	unsigned short us = uc;
	
	//汇编代码为:
	//movzx ax,byte ptr [ebp-4]
	//mov word ptr [ebp-8],ax
	//定义为无符号数,使用movzx执行
}

movsx 和 movzx都是将较小的操作数复制到较大的容器中,下面是将较大的操作数复制到较小的容器中

void Function()
{
	int i = 0x12345678;
	short s = i;			//s的值为5678
	char c = i;				//c的值为78
	
	//汇编代码如下
	//mov dword ptr [ebp-4],23456789h
	//mov ax,word ptr [ebp-4]
	//mov word ptr [ebp-8],ax
	//mov cl,byte ptr [ebp-4]
	//mov byte ptr [ebp-0Ch],cl
}

可以看出如果较大的操作数复制到较小的容器中会丢失部分数据


运算中如果两个容器大小不一样运算时会自动转为较大容器运算,如果有符号数和无符号数运算会转成无符号数:

void Function()
{
	//大小不一样相加运算
	char c = 10;
	int i = 20;
	printf("%d\n",c+i);

	//汇编代码:
	//mov byte ptr [ebp-4],0Ah
	//mov dword ptr [ebp-8],14h
	//movsx eax,byte ptr [ebp-4]	//在这里将byte转换成了dword
	//add  eax,dword ptr [ebp-8]	
	
	//===========================

	//有符号和无符号相加
	char c = 10;
	unsigned uc = 20;
	printf("%d",uc+c);
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值