Eclipse统计代码行数

使用Eclipse可以方便的统计工程或文件的代码行数。
方法如下:
1.在菜单栏点击Search,然后点击File…
2.选中正则表达式(Regular expression),并在搜索文本框输入\n
3.在文件名中输入*或*.java
4.在范围里选中Enclosing projects
5.在Search窗口就会显示出项目或文件的代码行数

开源协议BSD,Apache,GPL,LGPL,MIT

BSD开源协议
一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。
但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:

1.如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
2.如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
3.不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。

BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对 商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。

Apache Licence 2.0
Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:

1.需要给代码的用户一份Apache Licence
2.如果你修改了代码,需要再被修改的文件中说明。
3.在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
4.如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。

Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。

GPL
我们很熟悉的Linux就是采用了GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代 码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商 业软件公司开发的免费软件了。
GPL协议的主要内容是只要在一个软件中使用(”使用”指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。
由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。
其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似。

LGPL
LGPL是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。LGPL 允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并 发布和销售。
但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。因此LGPL协议的开源 代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。
GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品

MIT
MIT是和BSD一样宽范的许可协议,作者只想保留版权,而无任何其他了限制.也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的.

CMD查看端口被哪个程序占用

1、Windows平台
在windows命令行窗口下执行:

C:\>netstat -aon|findstr “9050”

TCP 127.0.0.1:9050 0.0.0.0:0 LISTENING 2016

看到了吗,端口被进程号为2016的进程占用,继续执行下面命令:

C:\>tasklist|findstr “2016”

tor.exe 2016 Console 0 16,064 K
很清楚吧,tor占用了你的端口

Logger.getLogger和 LogFactory.getLog

Logger.getLogger
LogFactory.getLog

Logger来自log4j自己的包。如果用Logger.getLogger,需要一个log4j的jar包,用此方式你只能依靠log4j:
而LogFactory来自common-logging包。如果用LogFactory.getLog,你可以用任何实现了通用日志接口的日志记录器替换log4j,而程序不受影响。apache的common-logging包是通用日志接口,通过这个中间层,你可以随便指定到底用哪个日志系统。增加系统的灵活性。若log4j它不存在, commons-logging 会另行选择其它的日志实现类。 这样保证了程序中不一定要使用log4j这个日志文件了
增强灵活性的理由:
1)首先在 classpath 下寻找自己的配置文件 commons-logging.properties ,如果找到,则使用其中定义的 Log 实现类;

2) 如果找不到 commons-logging.properties 文件,则在查找是否已定义系统环境变量  org.apache.commons.logging.Log ,找到则使用其定义的 Log 实现类;

3)  否则,查看 classpath 中是否有 Log4j 的包,如果发现,则自动使用 Log4j 作为日志实现类;

4)   否则,使用 JDK 自身的日志实现类( JDK1.4 以后才有日志实现类);

5)   否则,使用 commons-logging 自己提供的一个简单的日志实现类 SimpleLog ;

为了简化配置 commons-logging ,一般不使用 commons-logging 的配置文件,也不设置与 commons-logging 相关的系统环境变量,而只需将 Log4j 的 Jar 包放置到 classpash 中就可以了。这样就很简单地完成了 commons-logging 与 Log4j 的融合。

根据不同的性质,日志信息通常被分成不同的级别,从低到高依次是:“调试( DEBUG )”“信息( INFO )”“警告( WARN )”“错误(ERROR )”“致命错误( FATAL )”。

基于common-logging的运行方式:
package org;
import org.apache.commons.logging.Log;
import org.apache.log4j.Logger;
public class Test extends TagSupport{
public static Log log=LogFactory.getLog(Test.class);
public static void test()
{
log.debug(“111″);
log.info(“125″);
log.warn(“485″);
log.error(“error”);

}
public static void main(String[] a)
{
Test.test();
}
}

基于log4j的运行方式
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class TestLog4j {

static Logger logger = Logger.getLogger(TestLog4j.class);
public static void main(String args[]) {
PropertyConfigurator.configure(“log4j.properties”);
logger.debug(“Here is some DEBUG”);
logger.info(“Here is some INFO”);
logger.warn(“Here is some WARN”);
logger.error(“Here is some ERROR”);
logger.fatal(“Here is some FATAL”);
}
}

———–
commons-logging 仅仅对 Log4j( 当然还包括其它 LOG 实现 ) 作了一层包装,具体的日志输出还是在内部转交给身后的 Log4j 来处理,还有log4j会默认的去classes目录下去寻找log4j.properties 文件

Log4j的使用

1、 Log4j是什么?

Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要下载和了解更详细的内容,还是访问其官方网站吧: http://jakarta.apache.org/log4j

2、Log4j的概念

Log4j中有三个主要的组件,它们分别是 Logger、Appender和Layout:

Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。有一个Logger称为Root,它永远 存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法获得,其它Logger通过 Logger.getLogger(String name)方法。

Appender则是用来指明将所有的log信息存放到什么地方,Log4j中支持多种appender,如 console、files、GUI components、NT Event Loggers等,一个Logger可以拥有多个Appender,也就是你既可以将Log信息输出到屏幕,同时存储到一个文件中。

Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息。

Log4j中将要输出的Log信息定义了5种级别,依次为DEBUG、INFO、WARN、ERROR和FATAL,当输出时,只有级别高过配置中规定的 级别的信息才能真正的输出,这样就很方便的来配置不同情况下要输出的内容,而不需要更改代码,这点实在是方便啊。

3、Log4j的配置文件

虽然可以不用配置文件,而在程序中实现配置,但这种方法在如今的系统开发中显然是不可取的,能采用配置文件的地方一定一定要用配置文件。Log4j支持两 种格式的配置文件:XML格式和Java的property格式,本人更喜欢后者,首先看一个简单的例子吧,如下:

log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller’s file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) – %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize= 100KB

# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c – %m%n

首先,是设置root,格式为 log4j.rootLogger=[level],appenderName, …,其中level就是设置需要输出信息的级别,后面是appender的输出的目的地,appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 配置日志信息输出目的地Appender,其语法为
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1

log4j.appender.appenderName.option = valueN

Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生新文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
配置日志信息的格式(布局),其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
….
log4j.appender.appenderName.layout.option = valueN

Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:
2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)


4、Log4j在程序中的使用

要在自己的程序中使用Log4j,首先需要将commons-logging.jar和logging-log4j-1.2.9.jar导入到构建路径中。然后再将log4j.properties放到src根目录下。这样就可以在程序中使用log4j了。在类中使用log4j,
首先声明一个静态变量 Logger logger=Logger.getLog(“classname”);现在就可以使用了,用法如下:logger.debug(“debug message”)或者logger.info(“info message”),看下面一个小例子:

import com.foo.Bar;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class MyApp {
static Logger logger = Logger.getLogger(MyApp.class.getName());
public static void main(String[] args) {
// BasicConfigurator replaced with PropertyConfigurator.
PropertyConfigurator.configure(args[0]);
logger.info(“Entering application.”);
Bar bar = new Bar();
bar.doIt();
logger.info(“Exiting application.”);
}
}

 

Intel 8086

概述

  Intel 8086是一个由Intel于1978年所设计的16位微处理器芯片,是x86架构的鼻祖。不久,Intel 8088就推出了,拥有一个外部的8位数据总线,允许便宜的芯片用途。它是以8080和8085(它与8080有组合语言上的原始码兼容性)的设计为基础,拥有类似的寄存器组,但是数据总线扩充为16位。总线界面单元(Bus Interface Unit)透过6字节预存(prefecth) 的队列(queue)喂指令给执行单元(Execution Unit),所以取指令和执行是同步的,8086 CPU有20条地址线,可直接寻址1MB的存储空间,每一个存储单元可以存放一个字节(8位)二进制信息。为了便于对存储器进行存取操作,每一个存储单元都有一个惟一的地址与之对应,其地址范围用十进制表示为0~1048575,用十六进制表示为00000H~FFFFFH。
  Intel 8086拥有四个16位的通用寄存器,也能够当作八个8位寄存器来存取,以及四个16位索引寄存器(包含了堆栈指标)。资料寄存器通常由指令隐含地使用,针对暂存值需要复杂的寄存器配置。它提供64K 8 位元的输出输入(或32K 16 位元),以及固定的向量中断。大部分的指令只能够存取一个内存位址,所以其中一个操作数必须是一个寄存器。运算结果会储存在操作数中的一个。
  Intel 8086有四个 内存区段(segment) 寄存器,可以从索引寄存器来设定。区段寄存器可以让 CPU 利用特殊的方式存取1 MB内存。8086 把段地址左移 4 位然后把它加上偏移地址。大部分的人都认为这是一个很不好的设计,因为这样的结果是会让各分段有重叠。尽管这样对组合语言而言大部分被接受(也甚至有用),可以完全地控制分段,,使在编程中使用指针 (如C 编程语言) 变得困难。它导致指针的高效率表示变得困难,且有可能产生两个指向同一个地方的指针拥有不同的地址。更坏的是,这种方式产生要让内存扩充到大于 1 MB 的困难。而 8086 的寻址方式改变让内存扩充较有效率。
  8086处理器的时钟频率介于4.77MHz(在原先的IBM PC)和10 MHz之间。 8086 没有包含浮点指令部分(FPU),但是可以通过外接数学辅助处理器来增强浮点计算能力。Intel 8087 是标准版本。
  第一个以 8086 为基础的商业微电脑是 Mycron 2000。
  IBM Displaywriter 文字处理机也使用 8086。在大部分低成本计算领域中,IBM PC 使用更窄的内存总线版本的 8086 也就是 Intel 8088。
1978年: 8086-8088 微处理器

  8086是Intel系列的16位微处理器,芯片上有4万个晶体管,采用 HMOS工 艺制造,用单一的+5V电源,时钟频率为4.77MHz~10MHz。
  8086有16根数据线和20根地址线,它既能处理16位数据,也能处理8位数据。可 寻址的内存空间为1MB.
  在取得IBM个人电脑部门敲定的重要销售合约之后,Intel 8088处理器不仅成为了IBM个人电脑的大脑,而且还让IBM个人电脑成为新款畅销产品。为此,Intel 8088处理器的成功,也将英特尔进入“财富杂志500大企业排行榜”,《财富》杂志将英特尔评为 “70年代最成功的企业”之一。Intel 8088晶体管数目约为2.9万颗。
  1978年英特尔公司生产的8086是第一个16位的微处理器。很快Zilog公司和摩托罗拉公司也宣布计划生产Z8000和68000。这就是第三代微处理器的起点。
  8086微处理器最高主频速度为8MHz,具有16位数据通道,内存寻址能力为1MB。同时,英特尔还生产出与之相配合的数学协处理器i8087,这两种芯片使用相互兼容的指令集,但intel8087指令集中增加了一些专门用于对数、指数和三角函数等数学计算的指令。人们将这些指令集统一称之为 x86指令集。虽然以后英特尔又陆续生产出第二代、第三代等更先进和更快的新型CPU,但都仍然兼容原来的x86指令,而且英特尔在后续CPU的命名上沿用了原先的x86序列,直到后来因商标注册问题,才放弃了继续用阿拉伯数字命名。
  1979年,英特尔公司又开发出了8088。8086和8088在芯片内部均采用16位数据传输,所以都称为16位微处理器,但8086每周期能传送或接收16位数据,而8088每周期只采用8位。因为最初的大部分设备和芯片是8位的,而8088的外部8位数据传送、接收能与这些设备相兼容。8088采用40针的DIP封装,工作频率为6.66MHz、7.16MHz或8MHz,微处理器集成了大约29000个晶体管。
  8086和8088问世后不久,英特尔公司就开始对他们进行改进。他们将更多功能集成在芯片上,这样就诞生了80186和80188。这两款微处理器内部均以16位工作,在外部输入输出上80186采用16位,而80188和8088一样是采用8位工作。
  1981年,IBM公司将8088芯片用于其研制的PC机中,从而开创了全新的微机时代。也正是从8088开始,个人电脑(PC)的概念开始在全世界范围内发展起来。从8088应用到IBM PC机上开始,个人电脑真正走进了人们的工作和生活之中,它也标志着一个新时代的开始
8086引脚

  在学习8086 CPU的引脚信号前,必须弄清CPU最小模式和最大模式的概念。所谓最小模式,就是在系统中只有一个8086微处理器,所有的总线控制信号都直接由8086 CPU产生,因此,系统中的总线控制电路被减到最少。最大模式是相对最小模式而言的。在最大模式系统中,总是包含两个或多个微处理器,其中一个主处理器就是8086,其他的处理器称为协处理器,它们是协助主处理器工作的。如数学运算协处理器8087,输入/输出协处理器8089。8086 CPU到底工作在最大模式还是最小模式,完全由硬件决定。
  当CPU处于不同工作模式时,其部分引脚的功能是不同的。
  1.两种工作方式功能相同的引脚
  (1)AD15 ~AD0(address data bus):地址/数据总线,双向,三态。
  这是一组采用分时的方法传送地址或数据的复用引脚。根据不同时钟周期的要求,决定当前是传送要访问的存储单元或I/O端口的低16位地址,还是传送16位数据,或是处于高阻状态。
  (2)A19/S6~A16/S3(address/status):地址/状态信号,输出,三态。
  这是采用分时的方法传送地址或状态的复用引脚。其中A19~A16为20位地址总线的高4位地址,S6~S3是状态信号。S6表示CPU与总线连接的情况,S5指示当前中断允许标志IF的状态。S4, S3的代码组合用来指明当前正在使用的段寄存器。S4, S3的代码组合及对应段寄存器的情况。
  (3)/S7(bus high enable/status):允许总线高8位数据传送/状态信号,输出,三态。
  为总线高8位数据允许信号,当低电平有效时,表明在高8位数据总线D15 ~D8上传送1个字节的数据。S7为设备的状态信号。
  (4)(read):读信号,输出,三态,低电平有效。
  信号低电平有效时,表示CPU正在进行读存储器或读I/O端口的操作。
  (5)READY(ready):准备就绪信号,输入,高电平有效。
  READY信号用来实现CPU与存储器或I/O端口之间的时序匹配。当READY信号高电平有效时,表示CPU要访问的存储器或I/O端口已经作好了输入/输出数据的准备工作,CPU可以进行读/写操作。当READY信号为低电平时,则表示存储器或I/O端口还未准备就绪,CPU需要插入若干个“TW状态”进行等待。
  (6)INTR(interrupt request):可屏蔽中断请求信号,输入,高电平有效。
  8086 CPU在每条指令执行到最后一个时钟周期时,都要检测INTR引脚信号。INTR为高电平时,表明有I/O设备向CPU申请中断,若IF=1,CPU则会响应中断,停止当前的操作,为申请中断的I/O设备服务。
  (7)(test):等待测试控制信号,输入,低电平有效。
  信号用来支持构成多处理器系统,实现8086 CPU与协处理器之间同步协调的功能,只有当CPU执行WAIT指令时才使用。
  (8)NMI(non-maskable interrupt):非屏蔽中断请求信号,输入,高电平有效。
  当NMI引脚上有一个上升沿有效的触发信号时,表明CPU内部或I/O设备提出了非屏蔽的中断请求,CPU会在结束当前所执行的指令后,立即响应中断请求。
  (9)RESET(reset):复位信号,输入,高电平有效。
  RESET信号有效时,CPU立即结束现行操作,处于复位状态,初始化所有的内部寄存器。复位后各内部寄存器的状态,当RESET信号由高电平变为低电平时,CPU从FFFF0H地址开始重新启动执行程序。
  (10)CLK(clock):时钟信号,输入。
  CLK为CPU提供基本的定时脉冲信号。8086 CPU一般使用时钟发生器8284A来产生时钟信号,时钟频率为5MHz~8MHz,占空比为1:3。
  (11)VCC电源输入引脚。
  8086 CPU采用单一+5V电源供电。
  (12)GND:接地引脚。
  (13)(minimum/maximum):最小/最大模式输入控制信号。
  引脚用来设置8086 CPU的工作模式。当为高电平(接+5V)时,CPU工作在最小模式;当为低电平(接地)时,CPU工作在最大模式。
  2.CPU工作于最小模式时使用的引脚信号
  当引脚接高电平时,CPU工作于最小模式。此时,引脚信号24~31的含义及其功能如下。
  (1)(memory I/O select):存储器、I/O端口选择控制信号。
  信号指明当前CPU是选择访问存储器还是访问I/O端口。为高电平时,访问存储器,表示当前要进行CPU与存储器之间的数据传送。为低电平时,访问I/O端口,表示当前要进行CPU与I/O端口之间的数据传送。
  (2)(write):写信号,输出,低电平有效。
  信号有效时,表明CPU正在执行写总线周期,同时由信号决定是对存储器还是对I/O端口执行写操作。
  (3)(interrupt acknowledge):可屏蔽中断响应信号,输出,低电平有效。
  CPU通过信号对外设提出的可屏蔽中断请求做出响应。为低电平时,表示CPU已经响应外设的中断请求,即将执行中断服务程序。
  (4)ALE(address lock enable):地址锁存允许信号,输出,高电平有效。
  CPU利用ALE信号可以把AD15 ~AD0地址/数据、A19/S6~A16/S3地址/状态线上的地址信息锁存在地址锁存器中。
  (5)DT/(data transmit or receive):数据发送/接收信号,输出,三态。
  DT/信号用来控制数据传送的方向。DT/为高电平时,CPU发送数据到存储器或I/O端口;DT/为低电平时,CPU接收来自存储器或I/O端口的数据。
  (6)(data enable):数据允许控制信号,输出,三态,低电平有效。
  信号用作总线收发器的选通控制信号。当为低电平时,表明CPU进行数据的读/写操作。
  (7)HOLD(bus hold request):总线保持请求信号,输入,高电平有效。
  在DMA数据传送方式中,由总线控制器8237A发出一个高电平有效的总线请求信号,通过HOLD引脚输入到CPU,请求CPU让出总线控制权。
  (8)HLDA(hold acknowledge):总线保持响应信号,输出,高电平有效。
  HLDA是与HOLD配合使用的联络信号。在HLDA有效期间,HLDA引脚输出一个高电平有效的响应信号,同时总线将处于浮空状态,CPU让出对总线的控制权,将其交付给申请使用总线的8237A控制器使用,总线使用完后,会使HOLD信号变为低电平,CPU又重新获得对总线的控制权。
  3.CPU工作于最大模式时使用的引脚信号
  当引脚接低电平时,CPU工作于最大模式。此时,引脚信号24~31的含义及其功能如下。
  (1), , (status signals):总线周期状态信号,输出,低电平有效。
  它们表明当前总线周期所进行的操作类型。, , 代码组合及其对应操作见表2.3。
  表2.3 , , 代码组合及对应操作表
  (2), (request/grant):总线请求允许信号输入/总线请求允许输出信号,双向,低电平有效。
  该信号用以取代最小模式时的HOLD/HLDA两个信号的功能,是特意为多处理器系统而设计的。当系统中某一部件要求获得总线控制权时,就通过此信号线向8086 CPU发出总线请求信号,若CPU响应总线请求,就通过同一引脚发回响应信号,允许总线请求,表明8086 CPU已放弃对总线的控制权,将总线控制权交给提出总线请求的部件使用。引脚的优先级高于。
  (3):(lock)总线封锁信号,输出,低电平有效。
  信号有效时,表示此时8086 CPU不允许其他总线部件占用总线。
  (4)QS1, QS0(queue status):指令队列状态信号,输出。
  QS1和QS0信号的组合可以指示总线接口部件BIU中指令队列的状态,以便其他处理器监视、跟踪指令队列的状态。
8086的指令集

  MOV
  功能: 把源操作数送给目的操作数
  语法: MOV 目的操作数,源操作数
  格式: MOV r1,r2
  MOV r,m
  MOV m,r
  MOV r,data
  XCHG
  功能: 交换两个操作数的数据
  语法: XCHG
  格式: XCHG r1,r2 XCHG m,r XCHG r,m
  PUSH,POP
  功能: 把操作数压入或取出堆栈
  语法: PUSH 操作数 POP 操作数
  格式: PUSH r PUSH M PUSH data POP r POP m
  PUSHF,POPF,PUSHA,POPA
  功能: 堆栈指令群
  格式: PUSHF POPF PUSHA POPA
  LEA,LDS,LES
  功能: 取地址至寄存器
  语法: LEA r,m LDS r,m LES r,m
  XLAT(XLATB)
  功能: 查表指令
  语法: XLAT XLAT m
  算数运算指令
  ADD,ADC
  功能: 加法指令
  语法: ADD OP1,OP2 ADC OP1,OP2
  格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data
  影响标志: C,P,A,Z,S,O
  SUB,SBB
  功能:减法指令
  语法: SUB OP1,OP2 SBB OP1,OP2
  格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data
  影响标志: C,P,A,Z,S,O
  INC,DEC
  功能: 把OP的值加一或减一
  语法: INC OP DEC OP
  格式: INC r/m DEC r/m
  影响标志: P,A,Z,S,O
  NEG
  功能: 将OP的符号反相(取二进制补码)
  语法: NEG OP
  格式: NEG r/m
  影响标志: C,P,A,Z,S,O
  MUL,IMUL
  功能: 乘法指令
  语法: MUL OP IMUL OP
  格式: MUL r/m IMUL r/m
  影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志)
  DIV,IDIV
  功能:除法指令
  语法: DIV OP IDIV OP
  格式: DIV r/m IDIV r/m
  CBW,CWD
  功能: 有符号数扩展指令
  语法: CBW CWD
  AAA,AAS,AAM,AAD
  功能: 非压BCD码运算调整指令
  语法: AAA AAS AAM AAD
  影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD)
  DAA,DAS
  功能: 压缩BCD码调整指令
  语法: DAA DAS
  影响标志: C,P,A,Z,S
  位运算指令集
  AND,OR,XOR,NOT,TEST
  功能: 执行BIT与BIT之间的逻辑运算
  语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m
  影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位
  SHR,SHL,SAR,SAL
  功能: 移位指令
  语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL
  影响标志: C,P,Z,S,O
  ROR,ROL,RCR,RCL
  功能: 循环移位指令
  语法: ROR r/m,data/CL ROL r/m,data/CL RCR r/m,data/CL RCL r/m,data/CL
  影响标志: C,P,Z,S,O
  程序流程控制指令集
  CLC,STC,CMC
  功能: 设定进位标志
  语法: CLC STC CMC
  标志位: C
  CLD,STD
  功能: 设定方向标志
  语法: CLD STD
  标志位: D
  CLI,STI
  功能: 设定中断标志
  语法: CLI STI
  标志位: I
  CMP
  功能: 比较OP1与OP2的值
  语法: CMP r/m,r/m/data
  标志位: C,P,A,Z,O
  JMP
  功能: 跳往指定地址执行
  语法: JMP 地址
  JXX
  功能: 当特定条件成立则跳往指定地址执行
  语法: JXX 地址
  注:
  A: ABOVE,当C=0,Z=0时成立
  B: BELOW,当C=1时成立
  C: CARRY,当弁时成立 CXZ: CX寄存器的值为0(ZERO)时成立
  E: EQUAL,当Z=1时成立
  G: GREATER(大于),当Z=0且S=0时成立
  L: LESS(小于),当S不为零时成立
  N: NOT(相反条件),需和其它符号配合使用
  O: OVERFLOW,O=1时成立
  P: PARITY,P=1时成立
  PE: PARITY EVEN,P=1时成立
  PO: PARITY ODD,P=0时成立
  S: SIGN,S=1时成立
  Z: ZERO,Z=1时成立
  LOOP
  功能: 循环指令集
  语法: LOOP 地址
  LOOPE(Z)
  地址 LOOPNE(Z) 地址
  标志位: 无
  CALL,RET
  功能: 子程序调用,返回指令
  语法: CALL 地址 RET RET n
  标志位: 无
  INT,IRET
  功能: 中断调用及返回指令
  语法: INT n IRET
  标志位: 在执行INT时,CPU会自动将标志寄存器的值入栈,在执行IRET时则会将堆栈中的标志值弹回寄存器
  字符串操作指令集
  MOVSB,MOVSW,MOVSD
  功能: 字符串传送指令
  语法: MOVSB MOVSW MOVSD
  标志位: 无
  CMPSB,CMPSW,CMPSD
  功能: 字符串比较指令
  语法: CMPSB CMPSW CMPSD
  标志位: C,P,Z,S,O
  SCASB,SCASW
  功能: 字符串搜索指令
  语法: SCASB SCASW
  标志位: C,P,Z,S,O
  LODSB,LODSW,STOSB,STOSW
  功能: 字符串载入或存贮指令
  语法: LODSB LODSW STOSB STOSW
  标志位: 无
  REP,REPE,REPNE
  功能: 重复前缀指令集
  语法: REP 指令S REPE 指令S REPNE 指令S
  标志位: 依指令S而定