逻辑运算指令
有如下的二进制级运算可以使用
操作符 | 意义 | 运算法则 |
AND | 与 | 0&0=0; 0&1= 0;1&0=0;1&1= 1 |
OR | 或 | 0|0= 0 ;0|1= 1 ;1|0= 1 ;1|1= 1 |
XOR | 异或 | 0⊕0=0;0⊕1=1;1⊕0=1; 1⊕1=0 |
NOT | 非 | ~0=1; ~1=0 |
这些都是位级运算。
注:
1 DWORD = 2 WORD = 4 byte = 32 bit
1 WORD = 2 byte = 16 bit
1 byte = 8 bit
算术运算指令
ADD | 加 | |
SUB | 减 | |
MUL | 乘 | |
DIV | 除 | |
SHL | 移位 | |
INC | 增加1 | |
DEC | 减少1 | |
NEG | 取补 | 求反再加一 |
注:
编译器一般会用比较奇怪的方式来组合这些操作,因为这样可以在相同结果的前提下达到更快的执行速度。编译器一般会做复杂的指令比较从而达到更快的执行速度。并所有的指令在不同的CPU上的执行速度是不同的。有些一个时钟周期就可以搞定,有的要好多好多。
字符串指令
指令 | 全称 | 指令助记符 | 意义 |
REP | repeat | 重复 | 它可以使串指令反复执行(ECX不等于0 就执行),每执行一次,ECX的内容减1 。 |
REPE | repeat equal | 相等重复 | 当两串相等,即ZF=1时 ,它可以使串指令反复执行(ECX不等于0 就执行),每执行一次,ECX的内容减1 。(与REPZ完全一样) |
REPNE | repeat not equal | 不等重复 | 当两串不相等,即ZF=0时, 它可以使串指令反复执行(ECX不等于0 就执行),每执行一次,ECX的内容减1 。(与REPNZ完全一样) |
MOVS | move string | 串传送 | 与MOVSB和MOVSW相似,但必须说明数据串类型(字或字节)。 |
MOVSB | move string by byte | 按字节传送串 | 把由ESI指向的数据段中的一个字节数据传送到由EDI指向的附加段内一个字节存储单元中去,并同时根据方向标志对ESI和EDI中的地址进行修改。当DF=0时, 地址都加1 ;当DF=1时 ,地址都减1 。 |
MOVSW | move string by word | 按字传送串 | 把由SI指向的数据段中的一个字数据传送到由DI指向的附加段内一个字存储单元中去,并同时根据方向标志对SI和DI中的地址进行修改。当DF=0时, 地址都加2 ;当DF=1时,地址都减2 。 |
CMPS | compare string | 串比较 | 通常用CMPSB或CMPSW。 |
CMPSB | compare string by byte | 按字节比较串 | 将DS段SI指出的字节数据减去ES段DI指出的字节数据(不保存结果),然后根据相减结果设置标志位(两个数据相等,则ZF=1)。 并由方向标志DF修改SI 和DI中的地址,即当DF=0时,地址都加1; 当DF=1时, 地址都减1 。 |
CMPSW | compare string by word | 按字比较串 | 将DS段SI指出的字数据减去ES段DI指出的字数据(不保存结果),然后根据相减结果设置标志位(两个数据相等,则ZF=1)。 并由方向标志DF修改SI 和DI中的地址,即当DF=0时,地址都加2; 当DF=1时, 地址都减2 。 |
STOS | store accumulator | 存储累加器 | 该指令将累加器中的值到由DS:DI指定的内存中去。存储结束之后,CPU要么增加EDI,或者减少EDI,取决于DF标志位。 |
LODS | load accumulator | 加载累加器 | LODS指令在字符串指令中是独一无二的。你永远不需要用重复前缀来修饰该指令。LODS指令拷贝由DS:SI指向的byte或者word到al或者ax,或者eax中。拷贝结束之后,会根据DF标志位来增加或减少SI的值。重复该指令没有任何意义,EAX中的值会被不断的冲掉,只留下最后加载的值。 |
SCAS | scan string | 扫描字符串 | 该指令可以用来在字符串中寻找一个特定的元素。SCAS指令仅仅需要目的字符串的地址es:di,而不是既要源又要目的两个字符串。源字符串的值在al,ax或eax中。 该指令用es:di指向的值跟累加器中的值比较(al,ax,eax),然后根据DF增加或减少DI 1,2,或4. |
注:
上表中涉及到一些标志寄存器中的标志位,为方便起见,列在下面:
ZF = zero flag 零标志位; DF = direction flag 方向标志位;