zoukankan      html  css  js  c++  java
  • 【8086汇编基础】06--算术运算与逻辑指令

    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。(这里所说运算应当是计算机内部的补码运算)

    <<< 上一部分 <<<【8086汇编基础】05--常用函数库文件--emu8086.inc

    >>> 下一部分 >>>【8086汇编基础】03--变量、数组和常量的处理

  • 相关阅读:
    Golang基础笔记
    PHP面试题
    PHP操作文件常用函数
    转:C#委托与事件
    转:Tkinter教程之Text(2)篇
    Tkinter教程之Text篇(1)
    转:Python 从FTP 下载数据的例子
    转:Python模块学习 ---- httplib HTTP协议客户端实现
    转:Python yield 使用浅析
    有用的网址地址
  • 原文地址:https://www.cnblogs.com/QuLory/p/2758067.html
Copyright © 2011-2022 走看看