inc和dec
执行增加和减少的操作,如果是INC指令的话,就加1,如果是DEC指令的话,就减1。
ADD
ADD指令有两个操作数,相加后的结果存放到第一个操作数中。ADD EAX,1等价于INC EAX。 ADD也将两个寄存器相加,我们可以到OD里面看一看。
ADC(带进位的加法)
两个操作数的和加上进位标志(C)的值,结果存放到第一个操作数中。
SUB
与ADD刚好相反-它将第一个操作数减去第二个操作数的值存放到第一个操作数中。
SBB
该指令跟ADC正好相反,它计算两个操作数的差值,并且还要减去进位标志,结果存放到第一个操作数中。
MUL(无符号数的乘法)
有两种乘法,第一个种是MUL,这种是无符号数乘法,只有一个操作数,另一个操作数是EAX,结果存放到EDX:EAX中。
例如:
MUL ECX
这里是无符号数EAX,ECX相乘,结果存放到EDX:EAX中。
比如 乘后的结果 位数大于 Eax存放的32位 就会把存放不下的存放在EDX中
IMUL(有符号数的乘法)
IMUL指令用法类似于MUL。
IMUL ECX
该指令将有有符号数ECX乘以EAX,结果存放到EDX:EAX中。
除了上面一条指令外,IMUL还允许使用多个操作数,这是与MUL不同的地方。
IMUL EBP, DWORD PTR [ESI+74], FF800002将DWORD PTR [ESI+74]和FF800002 乘法后的值存放在ebp中
DIV(无符号除法)/IDIV(有符号除法)
类似 mul和imul
XADD(交换并相加)
这个指令其实就是XCHG和ADD两个简单指令的组合。
XADD EAX,ECX
NEG
该指令的目的是将操作数的符号取反,即如果我们有一个32位的16进制数,用NEG操作以后,结果就会取反。
AND
只有两个二进制位都为1的时候结果才为1,其他情况,结果都为0。
OR
该指令AND的不同之处在于,两位中只要有一位为1,结果就取1。
XOR
该指令时异或运算,当两位不同时取1,相同时取0。
NOT
该指令是简单的按位取反。
这里讨论下 无符号位的加法和减法
这里比如 4+2
00000100+
00000010=00000110=6
减法 4-2
00000100-
00000010=0000010=2
减法2-4
这里发现 2比4要小 这里减法 改成 有符号位加法 (+)2+(-4)
这里 4的2进制00000100 补码表示法=反码+1=11111011+1=11111100
00000010+
11111100=11111110=FE