第一章 基础知识
一、机器语言:即机器指令(机器可以正确执行的命令)的集合。
二、汇编语言的产生:汇编指令是机器指令便于记忆的书写格式,即助记符。(编译)
三、汇编语言的组成:汇编指令(机器码的助记符)、伪指令(由编译器执行)、其他符号(由编译器识别)。
四、存储器:存放指令和数据的地方。磁盘上的数据不读到内存中就无法被CPU使用。
五、指令和数据:都为二进制信息。1KB=1024B。
六、存储单元:每个存储单元从0开始顺序编号。
七、CPU对存储器的读写:地址信息、控制信息、数据信息。三者都属于电信号,需要靠导线传输。总线为物理导线的集合,分为地址总线、数据总线、控制总线。
八、地址总线:CPU通过地址总线来指定存储单元,N根地址总线的宽度为N,最多可寻找2N个内存单元。地址总线的宽度决定了CPU的寻址能力。
九、数据总线:数据总线的宽度决定了CPU和外界的数据传送速度。
十、控制总线:控制总线的宽度决定了CPU对外部器件的控制能力。(低电平表示读取)。 十一、内存地址空间:宽度为10,可寻址的地址为1024个,即1024个内存地址空间。 十二、主板:主板上的器件通过总线(地址总线、数据总线、控制总线)相连。
十三、接口卡:CPU对外部设备不能直接控制,控制其工作的为扩展插槽上的接口卡。 十四、各类存储器芯片:随机存储器RAM/只读存储器ROM。存储器物理上独立,但都和CPU总线连接,CPU由此控制读写。逻辑存储器由若干物理存储器组成,
十五、内存空间地址段:主随机存储器+显存地址空间+各个ROM的地址空间。
第二章 寄存器( CPU工作原理)
CPU的组成:运算器、控制器、寄存器,彼此之间靠内部总线相连。8086CPU共有14个寄存器,所有寄存器都是16位的,可以存放2个字节。
一、通用寄存器:AX/BX/CX/DX,可分为2个独立的8位寄存器AH和AL(低8位)。可存储16位数据,所能存储的最大值为216-1。
二、字在寄存器中的存储:用十六进制表示,存储在16位的寄存器中。
三、几条汇编指令:汇编指令不区分大小写。MOV AX,001AH / ADD AX,BX
四、物理地址:内存单元在存储空间中的位置。
五、16位结构的CPU:运算器一次最多可以处理16位的数据。
六、8086CPU给出物理地址的方法:20位地址总线,寻址能力为1M。采用2个16位地址进行合成。物理地址=段地址*16+偏移地址。
七、“物理地址=段地址*16+偏移地址”的含义:一个数据的二进制形式左移N位,相当于该数据乘以2的N次方。
八、段的概念:段为若干地址连续的内存单元,段的起始地址为:段地址*16,偏移地址用来定位段中的内存单元。
九、段寄存器:CS/DS/SS/ES。为CPU在访问内存时提供段地址。
十、代码段寄存器CS(初始为FFFFH):指令指针寄存器IP(初始为0000H)。FFFF0H单元中的指令是开机后执行的第一条指令。
十一、修改CS、IP的指令 JMP 段地址:偏移地址;JMP AX(仅修改IP的内容) 十二、代码段:可以将长度为N(小于64KB)的一组代码,存放在一组地址连续、起始地址为16的倍数的内存单元中。
十三、8086CPU的工作过程:从CS:IP指向内存单元读取指令,读取的指令进入指令缓存器;IP指向下一条指令;执行指令。
第三章 寄存器(内存访问)
一、内存中字的存储:任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。
二、DS和[address]:DS段寄存器通常用来存放要访问的数据的段地址。执行指令时,CPU自动取DS中的数据为内存单元的段地址。数据---通用寄存器---段寄存器。
MOV BX,10000H------MOV DS,BX-----MOV [0],AL(将AL中的数据送入内存单元10000H)
三、字的传送:一次性传输16位数据。低偏移位置处存放字型数据的低8位。
四、MOV/ADD/SUB指令:操作对象数为2,类型:寄存器/数据/内存单元/段寄存器。
五、数据段:将一组长度为N(小于64K)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间。
六、栈:一种具有特殊的访问方式的存储空间。后进先出型LIFO。栈顶元素最后入栈。
CPU提供的栈机制:以字为单位,PUSH入栈/POP出栈。SS:SP指向栈顶元素。栈空时,SS:SP指向栈空间最高地址单元的下一个单元。执行PUSH后,指向第一个元素。
PUSH AX:SP=SP-2;将AX的内容送入SS:SP指向的内存单元处,SS:SP指向新栈顶。 POP AX:将SS:SP指向的内存单元处的数据送入 AX,SP=SP+2。
七、栈顶超界的问题:栈满的时候使用PUSH指令入栈;栈空的时候使用POP指令出栈。而8086CPU不考虑出界,只考虑当前栈顶在何处和要指向哪条指令。
八、PUSH/POP指令:可以在寄存器和内存之间传送数据。实质为内传送指令。
九、PUSH/POP 寄存器:将寄存器中的数据入栈/用一个寄存器接受出栈的数据。举例:
MOV AX,1000H----MOV SS,AX----MOV SP,0010H----PUSH AX----PUSH BX
十、栈段:栈顶的变化范围是0~FFFFH,栈空的时候SP=0,栈的最大容量为64KB。 段:数据段(DS,MOV/ADD/SUB)、代码段(CS:IP)、栈段(SS:SP,PUSH/POP)。
第四章 第一个程序
一、一个源程序从写出到执行的过程:编写----编译---连接(调试debug)---执行。
二、源程序:汇编源程序(编译为机器码)、伪指令(编译器处理)+程序。
1、程序的标号:一个标号指代了一个地址;codesg放在segment前面作为一个段的名称,这个段的名称最终将被编译、连接程序处理成一个段的段地址。
2、程序的结构:定义一个段,实现处理任务,程序结束,段与寄存器关系。
3、段结束:段名 ENDS。伪指令,编译时由编译器执行。
4、程序结束:END。伪指令。编译时由编译器执行。
5、程序返回:MOV AX,4C00H---INT 21H。汇编指令。编译时由CPU执行。
6、语法错误(编译器可检测);逻辑错误(运行时可检测)
三、编辑源程序:进入DOS方式,运行EDIT,在其中编辑程序。
四、编译:进入DOS方式,运行masm.exe。输入源文件名(不是默认路径时,需要加上文件路径),ENTER键,输出的目标文件为(.obj)。链表文件/交叉引用文件是编译时产生的中间结果,可以不生产之间ENTER键。(程序中出现severe errors或找不到源程序)
五、连接:进入DOS方式,运行link.exe。输入目标文件名并指明它所在的路径,ENTER键,输出的可执行文件为(.exe)。映像文件为中间结果可以之间ENTER。库文件在需要的时候调用。连接的作用在于:连接多个目标文件;调用库文件;生成机器码。
六、以简化的方式进行编译和连接:最终目的是用源程序生产可执行文件。
七、1.exe的执行:执行但不在屏幕上显示。
八、可执行文件中的程序装入内存并运行的原理:有一个正在运行的程序P2将文件中的程序P1从可执行文件中加载入内存。汇编程序从写出到执行的过程:编程(edit)--1.asm--编译(masm)--1.obg--连接(link)--1.exe--加载(command)--内存中的程序--运行(CPU)。
九、程序执行过程中的跟踪(debug):command加载debug,debug加载可执行文件。debug单步执行。
R命令:检查和修改寄存器中的内容。
U命令:从指定开始,反汇编32个字节。
Q命令:结束退出。
T命令:从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值。 P命令:执行int 21程序正常结束。
第五章 [BX]和LOOP指令
[BX]表示一个内存单元,它的偏移地址在BX中。
()描述性符号表示一个寄存器或一个内存单元中的内容。
IDATA表示常量,MOV AX,[IDATA]为非法指令
一、MOV AX,[BX]:表示BX中存放的数据为偏移地址EA,段地址SA默认在DS中。
二、LOOP指令:LOOP为标号,假定cx中存放循环次数,则执行分为两步:(cx)=(cx)-1;判断cx的值,不为零则转至标号处执行程序,如果为零则向下执行。
要点:LOOP指令中的标号所标识地址要在前面;要循环执行的程序段,要写在标号和LOOP指令的中间;在CX中存放循环次数。
MOV CX,循环次数-----S:循环执行的程序段-----LOOP S
三、在debug中跟踪用loop指令实现的循环程序:汇编源程序中数据不能以字母开头。
四、Debug和汇编编译器masm对指令的不同处理: MOV AX,[0]:在汇编源程序中,被编译当作指令MOV AX,0处理;在debug中表示将DS:0处的数据送入AL中。
五、Loop和[BX]的联合应用:解决类型不匹配和运算结果超界的问题。将8位数据赋值到16位寄存器AX中,再将AX中的数据加到DX中。
六、段前缀:出现在访问内存单元的指令中,用于显式地指明内存单元的段地址。DS:[0]
七、一段安全的空间:内存中初始前装有重要的程序或数据。一般为0:200~0:2FF。
八、段前缀的使用:MOV ES:[BX],AL 将AL中的数据装入地址为ES:[BX]的内存单元中。
第二篇:汇编语言--指令系统整理总结
一、通用数据传送指令
1、传送指令 MOV (move)
指令的汇编格式:MOV DST,SRC
指令的基本功能:(DST)<-(SRC) 将原操作数(字节或字)传送到目的地址。
指令支持的寻址方式:目的操作数和源操作数不能同时用存储器寻址方式,这个限制适用于所有指令。
指令的执行对标志位的影响:不影响标志位。
指令的特殊要求:目的操作数DST和源操作数SRC不允许同时为段寄存器;
目的操作数DST不能是CS,也不能用立即数方式。
2、进栈指令 PUSH (push onto the stack)
出栈指令 POP (pop from the stack)
指令的汇编格式:PUSH SRC ;POP DST
指令的基本功能:PUSH指令在程序中常用来暂存某些数据,而POP指令又可将这些数据恢复。 PUSH SRC (SP)<-(SP)-2 ;(SP)<-(SRC)
POP DST (DST)<-((SP));(SP)<-(SP)
指令支持的寻址方式:push 和 pop指令不能不能使用立即数寻址方式。
指令对标志位的影响:PUSH 和 POP指令都不影响标志位。
指令的特殊要求:PUSH 和 POP指令只能是字操作,因此,存取字数据后,SP的修改必须是+2 或者 -2;
POP指令的DST不允许是CS寄存器;
3、交换指令 XCHG (exchange)
指令的汇编格式:XCHG OPR1,OPR2
指令的基本功能:(OPR1)<->(OPR2)
指令支持的寻址方式:一个操作数必须在寄存器中,另一个操作数可以在寄存器或存储器中。 指令对标志位的影戏:不影响标志位。
指令的特殊要求:不允许使用段寄存器。
二、累加器专用传送指令
4、输入指令 IN (input)
输出指令 OUT (output)
指令的汇编格式:IN ac,port port<=0FFH
IN ac,DX port>0FFH
OUT port,ac port<=0FFH
OUT DX,ac port>0FFH
指令的基本功能:对8086及其后继机型的微处理机,所有I/O端口与CPU之间的通信都由输入输出指令IN和OUT来完成。IN指令将信息从I/O输入到CPU,OUT指令将信息从CPU输出到I/O端口,因此,IN和OUT指令都要指出I/O端口地址。
IN ac,port port<=0FFH (AL)<-(port)传送字节 或 (AX)<-(port+1,port)
传送字
IN ac,DX port>0FFH (AL)<-((DX))传送字节 或 (AX)<-((DX)+1,(DX))传送字
OUT port,ac port<=0FFH (port)<-(AL)传送字节 或 (port+1,port)<-(AX)传送字
OUT DX,ac port>0FFH (DX)<-(AL)传送字节 或 ((DX)+1,(DX))<-(AX)传送字
指令对标志位的影响:不影响标志位。
指令的特殊要求:只限于在AL或AX与I/O端口之间传送信息。
传送16位信息用AX,传送8位信息用AL,这取决于外设端口的宽度。
5、换码指令 XLAT (translate)
指令的汇编格式:XLAT opr 或 XLAT
指令的基本功能:这条指令根据AL寄存器提供的位移量,将BX指使的字节表格中的代码换存在AL中。
(AL)<-((DS)*16+(BX)+(AL))
指令对标志位的影响:不影响标志位。
指令的特殊要求:所建字节表格的长度不能超过256字节,因为存放位移量的是8位寄存器AL。
opr为表格的首地址,因为opr所表示的偏移地址已存入BX寄存器,所以opr在换码指令中可有可无,有则提高程序的可读性。
三、地址传送指令
6、有效地址传送器 LEA (load effective address)
指令的汇编格式:LEA reg,src
指令的基本功能:LEA指令把源操作数的有效地址送到指定的寄存器,这个有效地址是由src选定的一种存储器寻址方式确定的。
指令支持的寻址方式:各种存储器寻址方式。
指令对标志位的影响:不影响标志位。
指令的特出要求:指令中reg不能是段寄存器;
7、指针送寄存器和DS LDS (load DS with point)
指针送寄存器和ES LES (load ES with point)
指令的汇编格式:LDS reg,src
LES reg,src
指令的基本功能:LDS和LES指令把确定内存单元位置的偏移地址送寄存器,段地址DS或ES。这个偏移地址和段地址(也称地址指针)是由src指定的两个相继字单元提供的。 LDS reg,src (reg)<-(src) (DS)<-(src+2)
LES reg,src (reg)<-(src) (ES)<-(src+2)
指令支持的寻址方式:src必须为存储器寻址方式
指令对标志位的影响:不影响标志位。
指令的特殊要求:指令中REG不能是段寄存器;
四、标志寄存器传送指令
8、标志寄存器的低字节送AH LAHF (load AH with FLAGS)
指令的汇编格式:LAHF
指令的基本功能:(AH)<-(FLAGS)0-7
指令对标志位的影响:不影响标志位
9、AH送标志寄存器低字节 SAHF(store AH into FLAGS)
指令的汇编格式:SAHF
指令的基本功能:(FLAGS)0-7<-(AH)
指令对标志位的影响:由装入值来确定标志位的值。
10、标志进栈 PUSHF (push the flags)
指令的汇编格式:PUSHF
指令的基本功能:(SP)<-(SP)-2 ((SP)+1,(SP))<-(FLAGS)0-15
指令对标志位的影响:不影响标志位。
11、标志出栈 POPF (pop the FLAGES)
指令的汇编格式:POPF
指令的基本功能:(FLAGS)0-15<-((SP)+1,(SP)) (SP)<-(SP)+2
指令对标志位的影响:由装入值来确定标志位的值。
[算术指令]
一、加法指令
12、加法指令 ADD (addition)
指令的汇编格式:add dst,src
指令的基本功能:(dst)<-(src)+(dst)
指令支持的寻址方式:他们两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,源操作数和目地操作数必须有一个寄存器寻址方式。
指令对标志位的影响:SF=1 加法结果为负数(符号位为1)
SF=0 加法结果为正数(符号位为0)
ZF=1 加法结果为零
ZF=0 加法结果不为零
CF=1 最高有效位向高位有进位
CF=0 最高有效位向高位无进位
OF=1 两个同符号数相加(正数+正数 或 负数+负数),结果符号与其相反。
OF=0 两个不同符号数相加,或同符号数相加,结果符号与其相同。
13、带进为加法指令 ADC (add with carry)
指令的汇编格式:ADD dst,src
指令的基本功能:(dst)<-(src)+(dst)+CF
指令支持的寻址方式:他们两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,源操作数和目地操作数必须有一个寄存器寻址方式。
指令对标志位的影响:SF=1 加法结果为负数
SF=0 加法结果为正数
ZF=1 加法结果为零
ZF=0 加法结果不为零
CF=1 最高有效位向高位有进位
CF=0 最低有效位相高位无进位
OF=1 两个同符号数相加,结果符号与其相反,
OF=0 两个同符号数相加,或同符号相加,结果符号与其相同
14、加1指令 INC (increament)
指令的汇编格式:INC opr
指令的基本功能:(opr)<-(opr)
指令支持的寻址方式 可以使用除立即数方式外的任何寻址方式
指令对标志位的影响:SF=1 加法结果为负数
SF=0 加法结果为正数
ZF=1 加法结果为零
ZF=0 加法结果不为零
OF=1 两个同符号数相加,结果符号与其相反,
OF=0 两个同符号数相加,或同符号相加,结果符号与其相同。
二、减法指令
15、减法指令 SUB (subtract)
指令的汇编格式:SUB dst,src
指令的基本功能:(dst)<-(dst)-(src)
指令支持的寻址方式:他们两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,源操作数和目地操作数必须有一个寄存器寻址方式。
指令对标志位的影响:SF=1 减法结果为负数(符号位为1)
SF=0 减法结果为正数(符号位为0)
ZF=1 减法结果为零
ZF=0 减法结果不为零
CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
16、带借位减法指令 SBB (subtract with borrow)
指令的汇编格式:SBB dst,src
指令的基本功能:(dst)<-(dst)-(src)-CF
指令支持的寻址方式:他们两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,源操作数和目地操作数必须有一个寄存器寻址方式。
指令对标志位的影响:SF=1 减法结果为负数(符号位为1)
SF=0 减法结果为正数(符号位为0)
ZF=1 减法结果为零
ZF=0 减法结果不为零
CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
17、减1指令 DEC (decrement)
指令的汇编格式:DEC opr
指令的基本功能:(opr)<-(opr)-1
指令支持的寻址方式:可以使用除立即数方式外的任何寻址方式。
指令对标志位的影响:SF=1 减法结果为负数(符号位为1)
SF=0 减法结果为正数(符号位为0)
ZF=1 减法结果为零
ZF=0 减法结果不为零
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
18、比较指令 CMP (compare)
指令的汇编格式:CMP opr1,opr2
指令的基本功能:(opr1)-(opr2),根据相减结果设置条件码,但不回送结果。
指令支持的寻址方式:他们两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,源操作数和目地操作数必须有一个寄存器寻址方式。
指令对标志位的影响:SF=1 减法结果为负数(符号位为1)
SF=0 减法结果为正数(符号位为0)
ZF=1 减法结果为零
ZF=0 减法结果不为零
CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
19、求补指令 NEG (negate)
指令的汇编格式:NEG opr
指令的基本功能:(opr)<- -(opr)
指令支持的寻址方式:可以使用除立即数方式外的任何寻址方式。
指令对标志位的影响:CF=1 不为0的操作数求补时
CF=0 为0的操作数求补时
OF=1 操作数为-128(字节运算)或操作数为-32768(字运算) OF=0 当求补运算的操作数不为-128(字节)或-32768(字)时
三、乘法指令
20、无符号乘法指令 NUL (unsigned multiple)
有符号乘法指令 IMUL(signed muliple)
指令的汇编格式:NUL src
IMUL src
指令的基本功能:(AX)<-(AL)*(src)
(DX,AX)<-(AX)*(src)
指令支持的寻址方式:src可以使用除立即数方式以外的任一种寻址方式。
指令对标志位的影响:乘法指令只影响标志位CF和OF,其他条件码位无定义。
MUL指令的条件码设置为:
CF OF=0 0 乘积的高一半为0(字节操作的(AH)或字操作的(DX)) CF OF=1 1 乘积的高一半不为0
IMUL指令的条件码设置为:
CF OF=0 0 乘积的高一半为低一半的符号扩展.
CF OF=1 1 其他情况
指令的特殊要求:MUL和IMUL指令的区别仅在于操作数是无符号还是带符号数,它们的共同点是,指令中只给出源操作数src,目的操作数是隐含的,它只能是累加器(字运算为AX,字节运算为AL)。隐含的乘积寄存器是AX或DX(高位)和AX(低位)。
四、符号扩展指令
21、节扩展为字 CBW (convert byte to word)
指令的汇编格式:CBW
指令的基本功能:(AH)=00H 当(AL)的最高有效位为0时
(AH)=FFH 当(AL)的最高有效位为1时
指令对标志位的影响:不影响标志位
指令的特殊要求:这是条无操作数的指令,进行符号扩展的操作数必须存放在AL寄存器或AX寄存器中。
22、字扩展为双字 CWD (convert word to double word)
指令的汇编格式:CWD
指令的基本功能:(DX)=0000H 当(AX)的最高有效位为0时
(DX)=FFFFH 当(AX)的最高有效位为1时
指令对标志位的影响:不影响标志位
指令的特殊要求:这是条无操作数的指令,进行符号扩展的操作数必须存放在AL寄存器或AX寄存器中。
五、除法指令
23、无符号数除法 DIV (unsigned divide)
带符号数除法 IDIV (singed divide)
指令的汇编格式:DIV src
IDIV src
指令的基本功能:字操作
(AL)<-(AX)/src的商
(AH)<-(AX)/src的余数
字节操作
(AX)<-(DX,AX)/src的商
(DX)<-(DX,AX)/src的余数
指令支持的寻址方式:src作为除数,可用除立即数以外的任一种寻址方式来取得。 指令对标志位的影响:不影响条件码。
指令的特殊要求:除法指令要求字操作时,被除数必须为32位,除数是16位,商和余数是16位的;
字节操作时,被除数必须为16位,除数是8位,得到的商和余数是8位的。
六、十进制调整指令
[逻辑指令]
一、逻辑运算
24、逻辑与 AND (logic and)
指令的汇编格式:AND dst,src
指令的基本功能:(dst)<-(dst)与(src)
指令支持的寻址方式:两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,源操作数和目地操作数必须有一个寄存器寻址方式。
指令对标志位的影响:指令执行后 CF 和 OF 置零,AF无定义。
SF=1 指令执行后的结果为负数(符号位为1)
SF=0 指令执行后的结果为正数(符号位为0)
ZF=1 指令执行后的结果为零
ZF=0 指令执行后的结果不为零
PF=1 结果操作数中1的个数为偶数时置1
PF=0 结果操作数中1的个数为奇数时置0
25、逻辑或 OR (logic or)
指令的汇编格式:OR dst,src
指令的基本功能:(dst)<-(dst)或(src)
指令支持的寻址方式:两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,原操作数和目的操作数必须有一个寄存器寻址方式。
指令对标志位的影响:令执行后 CF 和 OF 置零,AF无定义。
SF=1 指令执行后的结果为负数(符号位为1)
SF=0 指令执行后的结果为正数(符号位为0)
ZF=1 指令执行后的结果为零
ZF=0 指令执行后的结果不为零
PF=1 结果操作数中1的个数为偶数时置1
PF=0 结果操作数中1的个数为奇数时置0
26、逻辑非 NOT (logic not)
指令的汇编格式:NOT orc
指令的基本功能:(dst)<-(opr)
指令支持的寻址方式:除立即数寻址方式以外的其余寻址方式
指令对标志位的影响:对标志位无影响
27、异或 XOR (exclusice or)
指令的汇编格式:XOR dst,src
指令的基本功能:(dst)<-(dst)异或(src)
指令支持的寻址方式:两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,原操作数和目的操作数必须有一个寄存器寻址方式。
指令对标志位的影响:令执行后 CF 和 OF 置零,AF无定义。
SF=1 指令执行后的结果为负数(符号位为1)
SF=0 指令执行后的结果为正数(符号位为0)
ZF=1 指令执行后的结果为零
ZF=0 指令执行后的结果不为零
PF=1 结果操作数中1的个数为偶数时置1
PF=0 结果操作数中1的个数为奇数时置0
28、测试指令 TEST
指令的汇编格式:TEST opr1,opr2
指令的基本功能:(opr1)与(opr2)
指令支持的寻址方式:两个操作数不能同时为存储器寻址,即为除源操作数为立即数的情况外,源操作数和目的操作数必须有一个寄存器寻址方式。
指令对标志位的影响:令执行后 CF 和 OF 置零,AF无定义。
SF=1 指令执行后的结果为负数(符号位为1)
SF=0 指令执行后的结果为正数(符号位为0)
ZF=1 指令执行后的结果为零
ZF=0 指令执行后的结果不为零
PF=1 结果操作数中1的个数为偶数时置1
PF=0 结果操作数中1的个数为奇数时置0
二、移位指令
29、逻辑左移 SHL (shift logical left)
指令的汇编格式:SHL dst,cnt
指令的基本功能:SHL指令向左逐位移动cnt次,每次逐位移动后,最低位用0来补充,最高位移入CF。
指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移位次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放入CL寄存器中。 指令对标志位的影响:CF=移入的数值
OF=1 当cnt=1时,移动后最高位的值发生变化。
OF=0 当cnt=1时,移动时最高位的值未发生变化。
SF、ZF、PF根据移动后的结果设置。
30、逻辑右移 SHR (shift logical right)
指令的汇编格式:SHR dst,cnt
指令的基本功能:SHR指令向右逐位移动cnt次,每次逐位移动后,最高位用0来补充,最低位移入CF。
指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移位次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放入CL寄存器中。 指令对标志位的影响:CF=移入的数值
OF=1 当cnt=1时,移动后最高位的值发生变化。
OF=0 当cnt=1时,移动时最高位的值未发生变化。
SF、ZF、PF根据移动后的结果设置。
31、算术左移 SAL (shift arithmetic left)
指令的汇编格式:SAL dst cnt
指令的基本功能:SAL指令向左逐位移动cnt次,每次逐位移动后,最低位用0来补充,最高位移入CF。
指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移位次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放入CL寄存器中。 指令对标志位的影响:CF=移入的数值
OF=1 当cnt=1时,移动后最高位的值发生变化。
OF=0 当cnt=1时,移动时最高位的值未发生变化。
SF、ZF、PF根据移动后的结果设置。
32、算术右移 SAR (shift arithmetic right)
指令的汇编格式:SAR dst,cnt
指令的基本功能:SAR指令向右逐位移动cnt次,每次逐位移动后,最高位用符号位来补充,最低位移入CF。
指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移位次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放入CL寄存器中。
指令对标志位的影响:CF=移入的数值
OF=1 当cnt=1时,移动后最高位的值发生变化。
OF=0 当cnt=1时,移动时最高位的值未发生变化。
SF、ZF、PF根据移动后的结果设置。
33、循环左移 ROL (rotate left)
指令的汇编格式:ROL dst,cnt
指令的基本功能:ROL 对由dst指定的寄存器或存储器操作数左移循环移动cnt所指定的次数,每左移一次,把最高位同时移入CF和操作数最低位。
指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移动次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放入CL寄存器中。
指令对标志位的影响:CF=移入的数值
OF=1 当cnt=1时,移动后最高位的值发生变化。
OF=0 当cnt=1时,移动时最高位的值未发生变化。
SF、ZF、PF根据移动后的结果设置。
34、循环右移 ROR (rotate right)
指令的汇编格式:ROR dst,cnt
指令的基本功能:ROR 对由dst指定的寄存器或存储器操作数右移循环移动cnt所指定的次数,每右移一次,把最低位同时移入CF和操作数最高位。
指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移动次数(或位数)cnt=1时,1可以直接写在指令中,cnt>1时,cnt必须放入CL寄存器中。
指令对标志位的影响:CF=移入的数值
OF=1 当cnt=1时,移动后最高位的值发生变化。
OF=0 当cnt=1时,移动时最高位的值未发生变化。
SF、ZF、PF根据移动后的结果设置。
35、带进位的循环左移 RCL (rotate left through carry)
指令的汇编格式:RCL dst,cnt
指令的基本功能:RCL 对由dst指定的寄存器或存储器操作数,连同进位标志CF左循环移动,m所指定的次数,每左移一次,把操作数的最高位移入CF,而CF中原有内容移入操作数的最低位。
指定支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移动次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放入CL寄存器中。
指令对标志位的影响:CF=移入的数值。
OF=1 当cnt=1时,移动后最高位的值未发生变化。
OF=0 当cnt=1时,移动后最高位的值发生变化。
SF、ZF、PF标志位不受影响。
36、带进位的循环右移 RCR (rotate right through carry)
指令的汇编格式:RCR dst,cnt
指令的基本功能:RCR 对由dst指定的寄存器或存储器操作数,连同进位标志CF右循环移动,m所指定的次数,每右移一次,把操作数的最高低位移入CF,而CF中原有内容移入操作数的最高位。
指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移动次数(或位数)cnt=1时,1可以直接写入指令中,cnt〉1时,cnt必须放入CL寄存器中。 指令对标志位的影响:CF=移入的数值。
OF=1 当cnt=1时,操作数最高位的值未发生变化。
OF=0 当cnt=1时,操作数最高位的值发生变化。
SF、ZF、PF标志位不受影响。
[串处理指令]
一、设置方向标志指令
37、DF置零 CLD (clear direction flag)
DF置一 STD (set direction flag)
指令的汇编格式:CLD
STD
指令的基本功能:CLD DF=0
STD DF=1
二、串处理指令
38、串传送 MOVSB / MOVSW (move string byte/word)
指令的汇编格式:MOVSB
MOVSW
指令的基本功能:(ES:DI)<-(DS:SI)
(SI)<-(SI)+/-1(字节)或+/-2(字)
(DI)<-(DI)+/-1(字节)或+/-2(字)
指令对条件码的影响:不影响条件码。
指令的特殊要求:源串必须在数据段中,目的串必须在附加段中,串处理指令隐含的寻址方式是SI和DI寄存器的间接寻址方式。源串允许使用段跨越前缀来指定段。
39、存串 STOSB / STOSW (stroe from string byte/word)
指令的汇编格式:STOSB
STOSW
指令的基本功能:(ES:DI)<-(AL)或(AX)
(DI)<-(DI)+/-1(字节)或+/-2(字)
指令对条件码的影响:不影响条件码。
指令的特殊要求:源串必须在数据段中,目的串必须在附加段中,串处理指令隐含的寻址方式是SI和DI寄存器的间接寻址方式。源串允许使用段跨越前缀来指定段。
40、取串LODSB / LODSW (load from string byte/word)
指令的汇编格式:LODSB
LODSW
指令的基本功能:(AL)或(AX)<-(DS:SI)
(SI)<-(SI)+/-1(字节)或+/-2(字)
指令对条件码的影响:不影响条件码。
指令的特殊要求:源串必须在数据段中,目的串必须在附加段中,串处理指令隐含的寻址方式是SI和DI寄存器的间接寻址方式。源串允许使用段跨越前缀来指定段。
41、串比较 CMPSB / CMPSW (compare string byte/word)
指令的汇编格式:CMPSB
CMPSW
指令的基本功能:(DS:SI)-(ES:DI) 根据比较结果设置条件码
(SI)<-(SI)+/-1(字节)或+/-2(字)
(DI)<-(DI)+/-1(字节)或+/-2(字)
指令对条件码的影响:SF=1 减法结果为负数(符号位为1)
SF=0 减法结果为正数(符号位为0)
ZF=1 减法结果为零
ZF=0 减法结果不为零
CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
42、串扫描 SCASB / SCASW (scan string byte / word)
指令的汇编格式:SCASB
SCASW
指令的基本功能:(AL)<-(ES:DI)或(AX)<-(ES:DI) 根据扫描比较的结果设置条件码。 (DI)<-(DI)+/-1(字节)或+/-2(字)
指令对条件码的影响:SF=1 结果为负数(符号位为1)
SF=0 结果为正数(符号位为0)
ZF=1 结果为零
ZF=0 结果不为零
CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
三、串重复前缀
43、重复执行串 REP
指令的汇编格式:REP (CX)=重复次数
指令的基本功能:① (CX)=0时,串指令执行完毕,否则执行② ~ ④
② (CX)←(CX)-1
③ 执行串指令(MOVS或STOS)
④ 重复执行①
44、相等/为零时重复执行串指令 REPE/REPZ
指令的汇编格式:REPE / REPZ (CX)=比较/扫描的次数
指令的基本功能:① (CX)=0或ZF=0时,结束执行串指令,否则继续② ~ ④
② (CX)←(CX)-1
③ 执行串指令(CMPS或SCAS)
④ 重复执行①
45、不等/不为零时重复执行串指令 REPNE / PEPNZ
指令的汇编格式:REPNE / PEPNZ (CX)=比较/扫描的次数
指令的基本功能:① (CX)=0或ZF=1,结束执行串指令,否则继续② ~ ④
② (CX)←(CX)-1
③ 执行串指令(CMPS或SCAS)
④ 重复执行①
[控制转移指令]
一、无条件转移指令
46、短转移 JMP SHORT label (short jump)
指令的汇编格式:JMP SHORT label
指令的基本功能:(IP)<-当前(IP)+8位位移量 8位位移量是汇编程序在汇编源程序时,根据目标地址和当前IP之间的距离自动生成的。
指令对条件码的影响:对标志位无影响。
47、近转移 JMP NEAR PTR label (near jump)
指令的汇编格式:直接转移 JMP label (direct jump)
寄存器间接转移 JMP reg (register indirect jump)
存储器间接转移 JMP WORD PTR OPR (memory indirect jump)
指令的基本功能:JMP label (IP) <- OFFSET label = (IP)当前+16位位移量 JMP reg (IP) <- (reg)
JMP WORD PTR OPR (IP) <- (PA+1,PA)
指令支持的寻址方式:指令中的转向地址可以是直接寻址方式、寄存器寻址方式、寄存器间接寻址方式和存储器寻址方式。
指令对条件码的影响:对标志位无影响。
48、远转移 JMP FAR PTR label (for jump)
指令的汇编格式:JMP FAR PTR label
指令的基本功能:(IP)<-label的段内偏移地址
(CS)<-label所在段的段地址
指令支持的寻址方式:远转移的目的地址可以使用除立即寻址方式外的任何寻址方式来表示。 指令对条件码的影响:对标志位无影响。
二、条件转移指令
指令的汇编格式及功能
根据条件码的值转移:
49、JZ(JE) OPR ZF=1
50、JNZ(JNE) OPR ZF=0
51、JS OPR SF=1
52、JNS OPR SF=0
53、JO OPR OF=1
54、JNO OPR OF=0
55、JP OPR PF=1
56、JNP OPR PF=0
57、JC OPR CF=1
58、JNC OPR CF=0
比较两个无符号数,根据比较的结果转移
59、JB(JNAE,JC) OPR CF=1 被减数小于减数则转移
60、JNB(JAE,JNC) OPR CF=0 被减数大于或等于减数则转移
61、JBE(JNA) OPR CF或ZF=1 被减数小于或等于减数则转移
62、JNBE(JA) OPR CF或ZF=0 被减数大于减数则转移
比较两个带符号数,根据比较结果转移
63、JL/JNGE OPR SF异或OF=1 被减数小于减数则转移
64、JNL/JGE SF异或OF=0 被减数不小于减数则转移
65、JLE/JNE (SF异或OF)与ZF=1 被减数不大于减数则转移
66、JNLE/JG (SF异或OF)与ZF=0 被减数大于减数则转移
根据CX寄存器的值转移
67、JCXZ (CX)=0 CX内容为零 则转移
指令的特殊要求:所有条件转移指令都是短转移指令,转移的目标地址必须在当前IP地址
的-128至+127字节范围之内,因此条件转移指令是2字节指令。
三、循环指令
68、循环 LOOP (loop)
指令的汇编格式:LOOP label
指令的基本功能:① (CX)←(CX)-1
② 若(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束。
指令的特殊要求:循环指令都是短转移格式的指令,也就是说,位移量是用8位带符号数来表示的,转向地址在相对于当前IP值的-128 ~ +127字节范围之内。
69、为零/相等时循环 LOOPZ/LOOPE (loop while nonzero or equal)
指令的汇编格式:LOOPNZ/LOOPNE label
指令的基本功能:① (CX)←(CX)-1
② 若ZF=1且(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束。
指令的特殊要求:循环指令都是短转移格式的指令,也就是说,位移量是用8位带符号数来表示的,转向地址在相对于当前IP值的-128 ~ +127字节范围之内。
70、不为零/不相等时循环 LOOPNZ/LOOPNE (loop while nonzero or not equal) 指令的汇编格式:LOOPNZ/LOOPNE label
指令的基本功能:① (CX)←(CX)-1
② 若ZF=0且(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束。
指令的特殊要求:循环指令都是短转移格式的指令,也就是说,位移量是用8位带符号数来表示的,转向地址在相对于当前IP值的-128 ~ +127字节范围之内。
四、子程序调用
71、段内直接近调用 CALL SUBROUT
指令的基本功能:(SP)<-(SP)-2
((SP)+1,(sp))<-(IP)
(IP)<-(IP)+16位位移量
段内间接近调用 CALL DESTIN
指令的基本功能:(SP)<-(SP)-2
((SP)+1,(SP))<-(IP)
(IP)<-(EA)
72、段间直接调用 CALL FAR PTR SUBROUT
指令的基本功能:(SP)<-(SP)-2,((SP))<-(CS)当前
(SP)<-(SP)-2,((SP))<-(IP)当前
(IP)<-偏移地址(在指令的第2、3个字节)
(CS)<-段地址(在指令的第4、5个字节)
五、返回指令
73、段内返回(近返回) RET
指令的基本功能:(IP)<-((SP)+1,(SP))
(SP)<-(SP)+2
段间返回(远返回) RET
指令的基本功能:(IP)<-((SP)),(SP)<-(SP)+2
(CS)<-((SP)),(SP)<-(SP)+2
带立即数返回 RET N
执行操作:① 返回地址出栈(操作同段内或段间返回)
② 修改堆栈指针:(SP) ← (SP)+N
六、中断及中断返回指令
74、INT n 中断指令(interrupt),n为中断类型号
执行操作:① 入栈保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS) ② 入栈保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS)
(SP) ← (SP)-2,((SP)) ← (IP)
③ 转中断处理程序:(IP) ← (n×4)
(CS) ← (n×4+2)
75、IRET 中断返回指令(return from interrupt)
执行操作:① 返回地址出栈:(IP) ← ((SP)),(SP) ← (SP)+2 (CS) ← ((SP)),(SP) ← (SP)+2
② FLAGS出栈:(FLAGS) ← ((SP)),(SP) ← (SP)+2
76、INTO 溢出则中断(中断类型为4)
执行操作:若OF=1(有溢出),则:
① 入栈保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS)
② 入栈保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS)
(SP) ← (SP)-2,((SP)) ← (IP)
③ 转中断处理程序:(IP) ← (4×4)= (10H)
(CS) ← (4×4+2)= (12H)