分享

【8086汇编基础】06--算术运算与逻辑指令

 印度阿三17 2019-07-06
原文链接:http://www.cnblogs.com/QuLory/p/2758067.html

8086汇编语言初学者教程(第6部分)

运算与逻辑指令
 

大多数运算与逻辑指令影响处理器的状态标记寄存器。

从上图可以看到,这是状态标记寄存器是一个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,否则为

  • Direction Flag (DF) - 方向标志,在串处理指令中控制处理信息的方向用。当DF为1时,每次操作后使变址寄存器SI和DI减量,这样就使串处理从高地址向低地址方向处理。当DF为0时,则使SI和DI增量,使串处理从低地址向高地址方向处理。



这里有3组指令.



第一组: ADDSUB,CMPANDTESTORXOR

支持如下操作数:

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, 等等...


执行之后,结果经常存放在第一个操作数中。CMPTEST指令只影响标志位,并不返回数值(这两条指令是用来在程序运行中判断的)上述指令只影响如下标志位:

       CFZFSFOFPFAF.

  • 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



第二组: MULIMULDIVIDIV

支持如下操作数:

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 指令只影响 CFOF标志位。
       
运算后如果结果超出范围,这些标记位置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 = 余数(取模后的余数) .


第三组: INCDECNOTNEG

支持如下操作数:

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...

INCDEC 指令只影响如下标志位:
       ZFSFOFPFAF.

NOT 指令不影响任何标志位!

NEG i指令只影响如下操作位:
       CFZFSFOFPFAF.

    • NOT - 对与操作数每一位取反

    • NEG - 对操作数取反

      实际上它对每一位取反然后在最后一位加1。例如5会变成-5,-2会变成2。(这里所说运算应当是计算机内部的补码运算)

来源:https://www./content-1-304551.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多