常用的数学运算指令

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(交换并相加)

这个指令其实就是XCHGADD两个简单指令的组合。

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






posted @ 2015-04-20 15:38  饺子吃遍天  阅读(449)  评论(0编辑  收藏  举报