汇编基础(3) 运算与逻辑指令
来源:互联网 发布:软件短期培训 编辑:程序博客网 时间:2024/05/16 10:38
运算与逻辑指令
大多数运算与逻辑指令影响处理器的状态标记寄存器。
从上图可以看到,这是状态标记寄存器是一个16位寄存器
每一位称作一个标志位,可以取值 1 或者 0 。
- 进位标志 Carry Flag (CF) - 出现无符号(unsigned overflow)溢出该位设置成1。例如,计算 255+1(结果超出0...255)。没有溢出时该位为0。
- 零标志 Zero Flag (ZF) - 当结果为 0 时设置为1,结果不为 0 时设置为0。
- 符号标志 Sign Flag (SF) - 结果为负置1,结果为正置为0。事实上该位对于结果特别重要。
- 溢出标志 Overflow Flag (OF) - 当出现有符号数溢出设置为1。例如,计算100+50(结果超出-128-127的范围)。
- 奇偶标志 Parity Flag (PF) - 当结果操作数中1的个数为偶时置1,否则为0注意,如果结果是一个字,该标志只指示低8位。
- 辅助进位标志 Auxiliary Flag (AF) - 低4位向上进位时置1,否则为0(记录运算时第3位(半个字节)产生的进位值。例如,执行加法指令时,最高有效位有进位时置1,否则置0
- 中断标志 Interrupt enable Flag (IF) - 当cpu容许中断时为1,否则为0
- Direction Flag (DF) - 方向标志,在串处理指令中控制处理信息的方向用。当DF为1时,每次操作后使变址寄存器SI和DI减量,这样就使串处理从高地址向低地址方向处理。当DF为0时,则使SI和DI增量,使串处理从低地址向高地址方向处理。
这里有3组指令.
第一组: ADD, SUB,CMP, AND, TEST, OR, XOR
支持如下操作数:
REG, memory
memory, REG
REG, REG
memory, immediate
REG, immediate
REG(寄存器): AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
memory(内存): [BX], [BX+SI+7], 变量,等等...
immediate(立即数): 5, -24, 3Fh, 10001101b, 等等...
执行之后,结果经常存放在第一个操作数中。CMP和TEST指令只影响标志位,并不返回数值(这两条指令是用来在程序运行中判断的)上述指令只影响如下标志位:
CF, ZF, SF, OF, PF, AF.
- ADD - 将第二个操作数加至第一个操作数上
- SUB - 从第一个操作数中减去第二个操作数
- CMP - 从第一个操作数中减去第二个操作数,但只影响标志位.
- AND - 两个操作数各个位逻辑与运算。运算法则如下
1 AND 1 = 1
1 AND 0 = 0
0 AND 1 = 0
0 AND 0 = 0
只有当两个操作数都是1时,运算结果才是1。 - TEST - 和上面的and 操作一样,但是只影响标志位。
- OR - 两个操作数各个位逻辑或运算。运算法则如下
1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0
如果操作数中有1那么结果一定是1。 - XOR - 两个操作数各个位逻辑异或运算。运算法则如下
1 XOR 1 = 0
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0
当两个操作数不同时,结果为1。
第二组: MUL, IMUL, DIV, IDIV
支持如下操作数:
REG
memory
REG(寄存器): AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
memory(内存): [BX], [BX+SI+7], variable, etc...
MUL and IMUL 指令只影响 CF, OF标志位。
运算后如果结果超出范围,这些标记位置1,如果没有超过
范围,置0
DIV 和 IDIV 指令对于标志位无影响
- MUL - 无符号乘:
当操作数是字节时:
AX = AL * 操作数.
当操作数是字时:
(DX AX) = AX * 操作数. - IMUL - 有符号乘法:
当操作数是字节时:
AX = AL * 操作数.
当操作数是字时:
(DX AX) = AX * 操作数. - DIV - 无符号除法:
当操作数是字节时:
AL = AX / 操作数
AH = 余数(取模后的余数) .
当操作数是字时:
AX = (DX AX) / 操作数
DX = 余数(取模后的余数) - IDIV - 有符号除法:
当操作数是字节时:
AL = AX / 操作数
AH =余数(取模后的余数)
当操作数是字时:
AX = (DX AX) / 操作数
DX = 余数(取模后的余数) .
第三组: INC, DEC, NOT, NEG
支持如下操作数:
REG
memory
REG(寄存器): AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
memory(内存): [BX], [BX+SI+7], variable, etc...
INC, DEC 指令只影响如下标志位:
ZF, SF, OF, PF, AF.
NOT 指令不影响任何标志位!
NEG i指令只影响如下操作位:
CF, ZF, SF, OF, PF, AF.
- NOT - 对与操作数每一位取反
- NEG - 对操作数取反
实际上它对每一位取反然后在最后一位加1。例如5会变成-5,-2会变成2。(这里所说运算应当是计算机内部的补码运算)
- 汇编基础(3) 运算与逻辑指令
- 8086汇编 逻辑指令
- 1.15.ARM汇编指令3之逻辑指令
- 【汇编指令】数据处理指令之逻辑指令
- ARM:ARM汇编语言与基础汇编指令
- 汇编算术运算指令
- [汇编]8086指令系统---逻辑指令
- 汇编基础--cmp汇编指令
- 汇编基础--CMP汇编指令
- 汇编基础--cmp汇编指令
- ARM汇编指令的自我介绍(1)--算数与逻辑指令
- 汇编 前期基础指令
- 汇编指令基础
- ARM汇编指令基础
- 汇编浮点运算指令集
- 常用汇编算术运算指令
- [汇编指令] 浮点运算指令集
- 汇编指令与机器码
- 汇编基础(2) 21H中断
- 1.6API文档(chm)(中文)的下载地址
- 相信自己
- Java Container Learning notes
- myeclipse6.0+tomcat6.0 数据源的配置 与tomcat5.X的区别
- 汇编基础(3) 运算与逻辑指令
- 更系统地掌握Struts1.x/Struts2.x+Hibernate+Spring框架组合,请学习SpringSide或Appfuse
- 编程技巧之:双击VC对话框提示cannot add new member以及类向导中没有已经建立的类的解决方法
- 汇编基础(4) 程序控制转移
- 在每一条错误的道路上成长
- SSH整合
- 再放QQ微博邀请码(2)
- struts1.2和spring的整合几种方式
- 新装Netbeans字体无法看清的解决办法