MOV指令是一条数据传送指令,它把源操作数复制到目的操作数中。MOVZX指令将较小的操作数复制到较大的操作数中并进行零扩展。
MOVSX指令将较小的操作数复制到较大的操作数中并进行符号扩展。XCHG指令交换两个操作数的内容,指令中至少要有一个操作数是寄存器。
操作数类型:
1)直接操作数:也就是变量的名字,它代表变量的地址。
2)直接偏移操作数:在变量的名字后加一个偏移量而生成的新偏移,这个新可以用来访问内存数据。
3)间接操作数:是用方括号括起来的包含数据地址的寄存器(如[esi]),程序可以根据该地址寻址并返回内存数据。
4)变址操作数:把常量和间接操作数结合在一起。常量和寄存器值加在一起,得到的最终结果被用来寻址。例如[array+esi]和array[esi]都是变址操作数。
下列算术运算指令是比较重要的:
1)INC指令将操作数加1。
2)DEC指令将操作数减1。
3)ADD指令将源操作数和目的操作数相加。
4)SUB指令从目的操作数中减掉源操作数。
5)NEG指令求操作数的相反数(将操作数的符号变反)。
把简单的算术表达式换成汇编语言格式的时候,应按照标准的操作符优先级规则选择应首先求值(翻译)的表达式。
状态标志:下面的CPU状态标志受算术运算影响:
1)算术运算结果为负时设置符号标志位。
2)无符号算术运算结果太大以至于目的操作数无法容纳的情况下设置进位标志位。
3)目的操作数(结果)的第3位向第4位产生进位或错位时设置辅助进位标志。
4)算术运算结果为0时设置零标志位。
5)有符号算术运算结果太大以至于目的操作数无法容纳的情况下设置溢出标志位。在进行字节操作时,CPU根据第6位向高位的进位值和第7位向高位的进位值的异或运算的结果设置溢出标志位。
操作符:
1)OFFSET操作符返回变量相对于其所在段开始的偏移。
2)PTR操作符允许重载变量的默认声明的尺寸。
3)TYPE操作符返回单个变量或数组中的单个元素的大小(按字节计算)。
4)LENGTHOF操作符返回数组中元素的数目。
5)SIZEOF操作符返回数组初始化时占用的字节数。
6)TYPEDEF操作符用于创建用户自定义的类型。
循环:JMP指令无条件转移到另外一个地址。LOOP指令用于计算类型的循环中。在32位模式下,LOOP指令使用ECX作为循环计数器,在16位模式下默认使用CX作为循环计数器。无论是在16位还是在32位模式下,LOOPD(双字循环)指令都使用ECX作为计数器。
=============结束,欢迎讨论。