汇编语言基础之四 - 基本的指令

时间:2022-05-09 00:39:55

逻辑运算指令

有如下的二进制级运算可以使用

操作符 意义 运算法则
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 方向标志位;