减法运算对应于汇编指令SUB,虽然计算机只会做加法,但是可以通过补码转换将减法转换为加法形式来完成。
//C++源码
int nVarOne = argc;//变量定义
int nVarTwo = 0;
scanf("%d",&nVarTwo);//获取变量nVarTwo的数据,使用scanf防止变量被常量化
nVarOne = nVarOne - 100;//变量减常量的减法运算
nVarOne = nVarOne + 5 - nVarTwo;//减法与加法混合运算
printf("nVarOne = %d\n",nVarOne);
//C++源码与反汇编代码讲解
//C++
nVarOne = nVarOne -100;
//反汇编
mov eax,dword ptr [ebp-4]//取变量nVarOne的数据到eax中
sub eax,64h//使用sub指令,对eax执行减100操作
mov dword ptr [ebp-4],eax//将结果赋值回nVarOne中
//C++
nVarOne = nVarOne + 5 - nVarTwo;
//反汇编
//按照自左向右顺序依次执行
mov ecx,dword ptr [ebp-4]
add ecx,5
sub ecx,dword ptr [ebp-8]
mov dword ptr [ebp-4],ecx
减法运算没有使用加负数的表现形式。在实际的分析中,根据加法操作数的情况,当加数为负数时,执行的并非加法而是减法操作。
另外,编译器优化策略与加法相同。