搜档网
当前位置:搜档网 › 8086指令集结构

8086指令集结构

8086指令集结构
8086指令集结构

8086指令集结构

一.8086 的寄存器结构

8086CPU中具有14个程序员可以访问的16位寄存器(如图1.1所示),按其功能可分为通用寄存器、段寄存器、指令指针寄存器及标志寄存器。

图1.1 8086寄存器结构框图

(1) 通用寄存器

8086CPU共有8个16位寄存器,它们可以作为一般的通用寄存器存放数据。按照相应的用途又可以分为两组:一组是数据寄存器(AX,BX,CX,DX),可以按照字(16位)形式访问,也可按照字节(8位)形式访问。主要用来暂时存放在计算过程中需要用到的操作数、操作运算结果。另一组是地址指针寄存器(SP,BP,SI,DI),只能按照字形式访问。主要存放访问主存时所需的偏移地址。

AX(Accumulator) 称作累加器,在乘、除法等指令运算中指定存放操作数及运算结果。

BX(Base) 称作基址寄存器,在计算主存地址时可以用作基址寄存器。

CX(Count) 称作计数寄存器,在循环指令及串处理等指令中作为隐含的计数器使用。

DX(Data) 称作数据寄存器,在字(16位)乘、除法等指令中用于存放双倍字长结果的高16位数据;在I/O指令中存放I/O的端口地址。

以上四个16位寄存器均可分为两个独立的8位寄存器使用。如AX分为AH 和AL

SP(Stack Pointer) 称作堆栈指针寄存器,存放堆栈段首地址到栈顶单元的偏移量。

BP(Base Pointer) 称作基址指针寄存器,通常用于存放需要访问的、位于堆栈段数据的一个基地址或该段的某个字单元到堆栈段首地址的偏移量。

SI(Source Index) 称作源变址寄存器,主要用于存放需要访问的(源)操作数所在主存单元相对于该段首地址的偏移量。在串操作指令中,用作隐含的源变

址寄存器。

DI(Destination Index) 称作目的变址寄存器,主要用于存放需要访问的(目的)操作数所在主存单元相对于该段首地址的偏移量。在串操作指令中,用作隐含的目的变址寄存器。

(2) 段寄存器

8086支持访问最多1MB的主存空间,主存按段结构进行管理,在主存中存放的段的类型一共有4种(代码段、数据段、附加段、堆栈段)。主存地址的表示形式为:段寄存器:段内偏移。

CS(Code Segment) 称作代码段寄存器,指定当前正在运行的代码段。

DS(Data Segment) 称作数据段寄存器,指定当前访问的数据段。

EX(Extra Segment) 称作附加段寄存器,指定当前的附加段。附加段主要为当前运行程序所处理的存储器操作数提供所需的辅助存储空间。

SS(Stack Segment) 称作堆栈段寄存器,指定当前的堆栈段,堆栈段可以根据需要在其中存放暂存的各种数据。

(3) 指令指针寄存器

IP(Instruction Pointer) 是一个16位的专业寄存器,存放需要访问的指令在代码段中的偏移量(类似于通常所说的程序计数器PC)。多数情况下,CS:IP 指向下一条即将执行的指令地址。

(4)标志寄存器

8086CPU中设置了一个16位的标志寄存器FLAGS,但只有其中的9位有效,每一位指示机器当前的某个状态特征或控制信息。包括6位状态标志位和3位控制标志位。

a)状态标志位

状态标志位主要由CPU根据指令执行的结果自动设置。这些标志位通常作为某个条件转移指令的测试条件。

CF(Carry Flag) 进位标志,记录运算时最高位产生的进位。

PF(Parity Flag) 奇偶标志,反映操作结果的低8位中1的个数,如果1的个数为偶数,则PF置1,否则PF置0。PF主要用来检测在机器中传送信息时是否出错。

AF(Auxiliary Carry Flag) 辅助进位标志,记录运算结果的第3位(即低半字节)向高位(第4位)产生的进位或借位。该标志通常用于十进制算术运算的调整。

ZF(Zero Flag) 零标志,运算结果为零,则ZF置1,否则置0。

SF(Sign Flag) 符号标志,记录运算结果的符号,若非负则置0,否则置1。

OF(Overflow Flag) 溢出标志,反应带符号数的运算结果是否超出机器所能表示的数值范围,超出该范围则为溢出,OF置1,否则置0。

b)控制标志位

控制标志位主要用于串操作方向的控制、中断的屏蔽以及程序的调试。

TF(Trap Flag) 陷阱标志,也可称为单步标志或跟踪标志,用于程序的调试。当TF为1,CPU执行完一条指令后便产生单步中断,然后转去执行单步中断服务程序。

IF(Interrupt Flag) 中断标志,或称为中断允许标志。当IF置1则允许CPU 响应中断请求,当IF置0,则禁止CPU响应可屏蔽中断请求。

DF(Direction Flag) 方向标志,用于串操作指令,控制串的处理方向。当

DF置1时,每执行一步串操作,地址指针寄存器SI和DI的内容自动递减,以指向下一步串操作的地址。当DF置0时,SI和DI内容自动递增。

二.8086的寻址方式

2.1 与数据相关的寻址方式

(1)立即寻址方式

指令中所需要的操作数直接存放在本条指令代码的立即数字段中,操作数作为指令的一部分存放在代码段中,当把指令取出时,操作数已经被一起取到CPU 的指令队列中,指令执行时不需要再去主存或寄存器中读取该操作数。

示例:

MOV AL ,23H

该条指令经过汇编后,操作数23H被存放在指令的操作数字段中。随着取指操作一起被读入CPU。

(2) 寄存器寻址方式

指令中所需要的操作数存放在CPU的某个寄存器中,指令的地址码部分给出寄存器地址(或称作寄存器号)。寄存器可以使用16位也可以使用8位寄存器。

示例:

MOV AL,BH

该指令的源操作数BH和目的操作数AL均为寄存器寻址方式,而MOV AL,23H的目的操作数AL为寄存器寻址方式,源操作数23H为立即寻址方式。

(3) 直接寻址

直接寻址方式也称为存储器直接寻址方式。指令中的操作数字段直接指出操作数所在的内存地址。

示例:

MOV AX,DS:[1200H]

该指令的源操作数为DS:[1200H]所指向的内存单元中的16位数据。指令功能是把主存中当前数据段偏移1200H字节处的字单元内容传送到通用寄存器AX中。

(4) 寄存器间接寻址方式

指令中所需要的操作数存放在主存的某个单元中,而操作数的有效地址EA存放在某个作为地址寄存器的4个通用寄存器BX、BP、SI或DI中。若以BX、SI 或DI作为间址寄存器,则默认段为数据段,即DS指向的段。如果以BP作为间址寄存器,则默认段为堆栈段,即SS指向的段。

示例:

MOV AX,[BX]

该指令的源操作数为DS:BX所指向的内存单元中的16位数据。

(5) 变址寻址方式

指令中所需要的操作数存放于主存的某个单元中,指令的地址码部分给出构成操作数有效地址EA的位移量部分和4个通用寄存器BX、BP、SI或DI之一的寄存器地址。这里默认段的指定同寄存器间接寻址。

示例:

MOV AX,20H[BX]

该指令的源操作数为DS:[BX]+20H所指向的内存单元中的16位数据。指令功能把主存中当前数据段偏移BX寄存器内容加20H处字单元内容传送到通用寄存

器AX中。

(6) 基址变址寻址方式

指令中所需要的操作数存放于主存的某个单元中,操作数的有效地址EA由指令中给出的位移量、基址寄存器(BX或BP)的内容和变址寄存器(SI或DI)的内容之和构成。段寄存器的默认规则根据两个基址寄存器BX及BP而确定。

示例:

MOV AX,DS:16H[BX][SI]

该指令的源操作数为DS:16H[BX][SI]所指向的内存单元中的16位数据。指令功能是把主存中当前数据段偏移BX寄存器内容、SI寄存器内容、16H三者之和的字节处字单元内容传送到通用寄存器AX中。

2.2 与转移地址相关的寻址方式

与转移地址相关的寻址方式主要用来确定转移指令和过程调用指令等的转向地址。

(1)段内直接寻址

段内直接寻址方式是指程序转向的目的地与本条转移指令在同一个段内。

示例:

JMP 20H

该指令修改指令指针寄存器IP为IP+20H,即实现将程序的执行点跳转到下一条指令的后20H字节单元处开始执行。

(2)段间直接寻址

段间直接寻址方式是指程序转向的目的地与转移指令不在同一个段内。

示例:

JMP 1701:0100H

该指令同时修改CS和IP寄存器,段地址1701H被送入CS,0100H被送入IP。这样程序便被跳转到17010H+0100H处开始执行。

(3)段内间接寻址

间接寻址方式表示程序转向的目标地址在指令中不直接给出,而是通过寄存器或主存单元间接给出。

示例:

JMP BX

表示跳转到本段由BX给出的段内偏移(按字节算)处。如果段内偏移存放在主存某个字单元中,则转移的目标地址可以采用数据寻址方式中对主存操作数的各种寻址方式。例如:

JMP [BX]

上述指令表示转移目标地址在代码段中的偏移量保存在数据段中的偏移量位于通用寄存器BX中的内存字单元里;

(4)段间间接寻址

段间间接寻址方式是指程序转向的目的地与本条转移指令不在同一段内,程序转向的目标地址保存在主存某4字节的单元中。前两个字节(低地址)的内容被送入IP,后两个字节(高地址)被送入代码段寄存器CS。

示例:

JMP DWORD PTR [BX]

该指令将DS:[BX]所指向的内存地址上的4字节数据送入CS和IP寄存器中。

三.8086指令集

1.数据传送指令

(一)通用传送指令

(1)MOV指令

指令格式:MOV 目,源

功能:将源操作数传送给目标操作数。

(2)堆栈操作指令

进栈指令:PUSH

格式:PUSH 源

功能:将源操作数压入堆栈。

例:用堆栈指令完成上例的功能。

MOV AX,3000H

MOV DS,AX ;段寄存器填充

MOV SI,0100H ;基本指令执

MOV DI,2000H ;行前的初值

MOV CX,50

NT: PUSH [SI] ;程序从这

POP [DI] ;开始设计

INC SI

INC SI

INC DI

INC DI

LOOP NT

MOV AH,4CH

INT 21H

(3)交换指令 XCHG

格式:XCHG 目,源

功能:源和目标中的内容交换。

(二)累加器专用传送指令

(1)输入输出指令 IN,OUT

输入指令格式: #1 IN AX|AL,8位端口号

#2 IN AX|AL,DX

功能:从外设输入数据到AX|AL寄存器。

输出指令格式:

#1 OUT 8位端口号,AX|AL

#2 OUT DX,AX|AL

功能:将AX|AL中的数据输出到外设。

该类指令是硬件功能与软件作用的结合。

(2)查表转换指令 XLAT

指令格式:XLAT

功能:将内存单元[BX+AL]中的内容,置入AL寄存器中。(三)地址传送指令

地址传送指令有两类:仅传送偏移地址指令及段地址与偏移地址同时传送指令。(1)仅传送偏移地址指令:LEA

指令格式:LEA 目,源

功能:将源操作数的偏移地址传送给目标寄存器。

如:LEA BX,[2000H]

执行后BX=2000H。

又如:LEA SI,[BX+100H]

若执行前BX=1000H,执行后SI=1100H。

(2)段地址与偏移地址同时传送指令:LDS、LES

指令格式:LDS 目,源

LES 目,源

功能:将源存储器操作数连续4个字节的内容传送给目标寄存器DS寄存器(LDS指令)或ES寄存器(LES指令)。

如:LDS BX,[2000H]

执行前[2000H]=1234H;[2002H]=5678H。

执行后 BX=1234H;DS=5678H

又如:LDS SI,[BX+100H]

若执行前BX=1000H,而[1100H]=4321H;[1102]=8765H。

执行后 SI=4321H;DS=8765H。

(四)标志传送指令

(1)LAHF指令

指令格式:LAHF

指令功能:将标致寄存器的低八位中以定义位,传送给AH寄存器中对应的位。

(2)SAHF指令

指令格式:SAHF

指令功能:将AH寄存器中对应的位,传送给标致寄存器的低八位中以定义位。

(3)PUSHF指令

指令格式:PUSHF

指令功能:将标致寄存器内容进栈。

(4)POPF指令

指令格式:POPF

指令功能:从栈顶弹出一个字送入标致寄存器。

2.算术运算

(一)加法指令

加法指令有三类:不带进位加法指令、带进位加法指令和增一指令。

它们均适合与无符号数和有符号数的加法。对于有符号数,其结果用补码表示。

(1)不带进位的加法指令 ADD

指令格式:ADD 目,源

指令功能:源+目,其结果放到目标,并影响标志寄存器。

如:ADD AL,50H ;(AL)+50H→AL

(2)带进位的加法指令 ADC

指令格式:ADC 目,源

指令功能:源+目+CF,其结果放到目标,并影响标志寄存器。

利用ADC指令可以实现两个多字节数的相加运算。如:

1244AFDCH+9A12458FH。

如:ADC AL,50H ;(AL)+50H+CF→AL

(3)增一指令 INC

指令格式:INC 目

指令功能:目+1,其结果放到目标,并影响标志寄存器。

(二)减法指令

减法指令包含有五类:不考虑借位减法指令、考虑借位减法指令、减一指令、求补指令和比较指令。它们均适合与无符号数和有符号数的减法。对于有符号数,其结果用补码表示。

(1)不考虑借位减法指令 SUB

指令格式:SUB 目,源

指令功能:目-源,其结果放到目标,并影响标志寄存器。

(2)考虑借位减法指令 SBB

指令格式:SBB 目,源

指令功能:目-源-CF,其结果放到目标,并影响标志寄存器。

利用SBB指令可以实现两个多字节数的相减运算。如:1244AFDCH-9A12458FH。

(3)减一指令 DEC

指令格式:DEC 目

指令功能:目-1,其结果放到目标,并影响标志寄存器。

(4)求补指令 NEG

指令格式:NEG 目

指令功能:0-目,其结果放到目标,并影响标志寄存器。

(5)比较指令 CMP

指令格式:CMP 目,源

指令功能:目-源,其结果不放到目标,但设置标志寄存器。

用法:

#1 对于两个无符号数的比较,根据CF标志判断两数的大小。

#2 对于两个有符号数比较大小,根据SF和OF标志位来判断两数的大小:

OF和SF相同(=0或=1)则目>源;如果OF和SF相异,则源>目。

(三)乘法指令

乘法指令有两类:无符号数乘法指令和有符号数乘法指令。

(1)无符号乘法指令 MUL

指令格式:MUL 源

指令功能:(AL|AX)*源,其结果放到 AX|DX:AX

(2)有符号乘法指令 IMUL

指令格式:IMUL 源

指令功能:(AL|AX)*源,其结果放到 AX|DX:AX

(四)除法指令

8086CPU的除法指令有两类:无符号数除法指令和有符号数除法指令。

它们均是不等长除法指令。即:被除数长度必须是除数长度的两倍。所以,在进行除法运算前应根据除数长度将被除数变成它的两倍长度。

(1)无符号数除法指令 DIV

指令格式:DIV 源

指令功能:AX|DX:AX/源,其结果:商放在AL|AX,余数放在AH|DX之中。

(2)有符号数除法指令 IDIV

指令格式:IDIV 源

指令功能:AX|DX:AX/源,其结果:商放在AL|AX,余数放在AH|DX之中。

(3)将字节扩展成字的指令 CBW

指令格式:CBW

指令功能:将AL中有符号数的符号位扩展到AH之中。不影响标志位。

用法:一般在两字节有符号数除法前,利用该指令,将符号位进行扩展,以使两数变成不等长数。

(4)将字扩展成双字的指令 CWD

指令格式:CWD

指令功能:将AH中有符号数的符号位扩展到DX之中。不影响标志位。

用法:一般在执行两字长有符号数除法前,利用该指令,将符号位进行扩展,以使两数变成不等长数。

(五)BCD码运算指令

BCD码有两类:组合(压缩)型BCD码和未组合(非压缩)型BCD码。BCD 码的运算相应也有两种情况。

(1)未组合BCD码加法十进制调整指令 AAA

指令格式:AAA

指令功能:对AL中的数进行校正:在AX中产生未组合十进制数和。

如: MOV AL,7

ADD AL,5

AAA

执行前两条后,AL=0CH,经AAA调整后,AX=0102H,CF=OF=1。

(2)组合BCD码加法十进制调整指令 DAA

指令格式:DAA

指令功能:对AL中的数进行校正:在AL中产生组合十进制数和。

如: MOV AL,56H(BCD)

ADD AL,47H(BCD)

DAA

执行前两条后,AL=9DH,经DAA调整后,AL=03H,CF=1。

例:多字节组合BCD码十进制相加

设两数长度均为8个字节,分别存放在1000H和2000H开始的8个单元中,要求将两数相加后,结果放在2000H开始的内存区域。

MOV SI,1000H

MOV DI,2000H

MOV CX,8

CLC

L1: MOV AL,[SI]

ADC AL,[DI]

DAA

MOV [DI], AL

INC SI

INC DI

LOOP L1

MOV AH,4CH

INT 21H

(3)未组合BCD码减法十进制调整指令 AAS

指令格式:AAS

指令功能:对AL中的数进行校正:在AX中产生未组合十进制数差。

如: MOV AL,"7" ;"7"为7的ASCII码

SUB AL,5

AAS

执行前两条后,AL=32H,经AAS调整后,AL=02H。

(4)组合BCD码加减十进制调整指令 DAS

指令格式:DAS

指令功能:对AL中的数进行校正:在AL中产生组合十进制数差。

如: MOV AL,56H(BCD)

SUB AL,47H(BCD)

DAS

执行前两条后,AL=0FH,经DAS调整后,AL=09H,CF=1。

(5)未组合BCD码的乘法十进制调整指令 AAM

指令格式:AAM

指令功能:对AL中的数进行校正:在AX中产生未组合十进制数积。

如: MOV AL,05H(BCD)

MOV BL,06H(BCD)

MUL BL

AAM

执行前三条后,AX=001EH,经AAM调整后,AX=0300H (BCD)。

(6)未组合BCD码的除法十进制调整指令 AAD

指令格式:AAD

指令功能:对AX中的数进行校正:在AX中产生未组合十进制数。

如: MOV AX,0300H(BCD)

AAD

MOV BL,06H(BCD)

DIV BL

执行前两条后,AX=001EH,执行DIV指令后,AX=0005H (BCD)。

3.逻辑运算

(一)逻辑运算指令

逻辑指令有三类:逻辑运算指令:NOT、AND、OR、XOR及TEST 移位指令:SHL、SAL、SHR和SHR

循环移位指令:ROL、ROR、RCL和RCR

1. 逻辑运算指令

(1)求反指令 NOT

指令格式: NOT 目

指令功能:将目标内容求反。

(2)逻辑与指令 AND

指令格式: AND 目,源

指令功能:将目标内容同源内容按位进行逻辑与运算。结果放在目标。

如: AND AX,00FFH

其结果AH=0;AL内容不变。

(3)逻辑或指令 OR

指令格式: OR 目,源

指令功能:将目标内容同源内容按位进行逻辑或运算。结果放在目标。

如: OR AX,00FFH

其结果AH内容不变;AL=0FFH(所有位为1)。

(4)逻辑异或指令 XOR

指令格式: XOR 目,源

指令功能:将目标内容同源内容按位进行逻辑异或运算。结果放在目标。

如: OR AX,AX

其结果AX被清0。

(5)测试指令 TEST

指令格式: TEST 目,源

指令功能:将目标内容同源内容按位进行逻辑与运算。结果不放回目标,只影响标志位。

如: TEST AL,80H

执行后,如果ZF=0,则AL的最高位为1,反之,最高位为0。

(二)移位指令

(1)算术左移指令和逻辑左移指令 SAL和AHL

指令格式:#1 SAL 目,1

#2 SAL 目,CL

指令功能:将目标操作数各数位依次左移一次,最高位进入CF,且最低位补0。若CL内容大于1时,重复前面的操作。除AF标志位不确定外,影响其它标志位。

(2)算术右移指令 SAR

指令格式:#1 SAR 目,1

#2 SAR 目,CL

指令功能:将目标操作数各数位依次右移一次。最低位进入CF,且最高位不变。若CL内容大于1时,重复前面的操作。除AF标志位不确定,外影响其它标志位。

(3)逻辑右移指令 SHR

指令格式:#1 SHR 目,1

#2 SHR 目,CL

指令功能:将目标操作数各数位依次右移一次。最低位进入CF,最高位补0。若CL内容大于1时,重复前面的操作。除AF标志位不确定,外影响其它标志位。(三)循环移位指令

(1)循环左移指令

指令格式:#1 ROL 目,1

#2 ROL 目,CL

指令功能:将目标操作数各数位依次左移一位。最高位进入CF,同时进入最低位。若CL内容大于1,则重复前面的操作。除AF标志位不确定,外影响其它

标志位:

(2)循环右移指令

指令格式:#1 ROR 目,1

#2 ROR 目,CL

指令功能:将目标操作数各数位依次右移一位。最高低进入CF,同时进入最高位。若CL内容大于1,则重复前面的操作。除AF标志位不确定,外影响其它标志位:

(3)带进位循环左移指令

指令格式:#1 RCL 目,1

#2 RCL 目,CL

指令功能:将目标操作数各数位依次左移一位。最高位进入CF,CF进入最低位。若CL内容大于1,则重复前面的操作。除AF标志位不确定,外影响其它标志位:

(4)带进位循环右移指令

指令格式:#1 RCR 目,1

#2 RCR 目,CL

指令功能:将目标操作数各数位依次右移一位。最低进入CF,CF进入最高位。若CL内容大于1,则重复前面的操作。除AF标志位不确定,外影响其它标志位:4.串操作指令

(一)串传送指令

串操作指令可以实现对一串数据的操作。串操作指令有五类:串传送、串比较、串搜索、取串和存串等。

串操作指令的共同点:

(1)串传送 MOVS

指令格式:

#1 MOVSB ;字节串传送指令

#2 MOVSW ;字串传送指令

#3 MOVS 目标串符号首址,源串符号首址

功能:将源串中一个字节(字)传送到目标串。不影响标志位。

例:将100字节的数据从3000H:100H,搬到3000H:200H

MOV AX,3000H

MOV DS,AX

MOV ES,AX

MOV SI,0100H

MOV DI,0200H

MOV CX,50

REP MOVSW

MOV AH,4CH

INT 21H

(二)串比较指令

(2)串比较指令 CMPS

指令格式:

#1 CMPSB ;字节串比较指令

#2 CMPSW ;字串比较指令

#3 CMPS 目标串符号首址,源串符号首址

功能:将源串中一个字节(字)与目标串比较。影响标志位。

(三)取串指令

(3)取串指令 LODS

指令格式:

#1 LODSB ;从串中取字节指令

#2 LODSW ;从串中取字指令

#3 LODS 源串符号首址

功能:将源串中一个字节(字)传送到AL(AX)中。不影响标志位。(四)存串指令

(4)存串指令 STOS

指令格式:

#1 STOSB ;存字节于目标串指令

#2 STOSW ;存字于目标串指令

#3 STOS 目标串符号首址

功能:将AL(AX)中的一个字节(字)存到目标串中。不影响标志位。(五)目标串搜索指令

(5)目标串搜索指令 SCAS

指令格式:

#1 SCASB ;从目标串中搜索字节指令

#2 SCASW ;从目标串中搜索字指令

#3 SCAS 目标串符号首址

功能:将AL(AX)中的一个字节(字)与目标串中某字节(字)比较,不影响标目标串,只影响标志位。

5.控制转移指令

(一)无条件转移指令及指令寻址

在8086CPU的转移指令中,其目标操作数将给出下一条指令到哪儿去找。即给出指令的寻址方式。

8086CPU指令的寻址方式可分成两大类:段内转移寻址方式及段间转移寻址方式。

段内和段间均又可分成两种:直接转移和间接转移。下面将通过无条件转移指令作详细分析。

无条件转移指令

指令格式: JMP 目

指令功能:程序将转到由目标操作数指明的地址去执行。

(二)条件转移指令

条件转移指令一般是根据标志寄存器中某个标志或几个标志的逻辑关系来决定是否转移。根据依据的条件,可分成三类条件转移指令:单标志条件转移指令;用于判断无符号数大小的条件转移指令;用于判断符号数大小的条件转移指令。(1)单标志条件转移指令

除半进位标志AF之外的所有状态标志都有相应的条件转移指令。

JZ|JE

JNZ|JNE

JNC

JS

JNS

JO

JNO

JP

JNP

(2)判断无符号数大小的条件转移指令

JA ;高于转移

JNA ;不高于转移

JB ;低于转移

JNB

(3)判断符号数大小的条件转移指令

JG ;大于转移

JNG

JL ;小于转移

JNL

(三)子程序指令

(1)子程序调用指令 CALL

指令格式:CALL 目

功能:执行该指令时,CPU先将该指令下面一条指令的存放地址压入堆栈(该地址叫返回地址),然后,计算出目标地址的偏移地址并装入IP,如果是远调用还要将目标地址的段地址装入CS。其结果,程序将转到目标子程序去执行。

(2)返回指令 RET

指令格式:RET|RET N

功能:从堆栈顶弹出两个(近过程调用)或四个(远过程调用)字,装入IP 和CS(远过程调用)。其结果是返回到主程序取执行。如果是RET N,则还要使栈顶指针往上移N个字节。一般N取偶数值。

(四)循环控制指令

循环控制指令用来设计循环程序。此类指令有三条:

(1)LOOP 指令

指令格式:LOOP 短标号

功能:该指令执行时,先将CX内容减1,然后判断CX中内容是否为0,若不为0,则返回到标号处去执行。若为0,则执行该指令下面一条指令。

(2)LOOPZ|LOOPE

指令格式:LOOPZ|LOOPE 短标号

功能:该指令执行时,先将CX内容减1,然后判断CX中内容是否为0且ZF 是否为1,若不同时满足,则返回到标号处去执行,否则执行该指令下面一条指令。

(3)LOOPNZ|LOOPNE

指令格式:LOOPNZ|LOOPNE 短标号

功能:该指令执行时,先将CX内容减1,然后判断CX中内容是否为0且ZF 是否为0,若不同时满足,则返回到标号处去执行,否则执行该指令下面一条指

(4)JCXZ

指令格式:JCXZ 短标号

功能:该指令执行时,只判断CX中内容是否为0,若满足,则返回到标号处去执行,否则执行该指令下面一条指令。

(五)中断指令

8086提供了软中断手段,这就是中断指令 INT 及中断返回指令 IRET。

中断指令格式:INT N

6. 处理器控制指令

处理器控制指令只介绍部分指令及指令功能。

(1)标志操作指令

CLC 清CF

STC 置CF

CLD 清DF

STD 置DF

CLI 清IF

CMC CF取反

(2)CPU暂停指令性 HLT

(3)空操作指令 NOP

8086汇编语言程序设计

实验1 简单汇编语言程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握简单汇编语言程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG 工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG 工具调试程序,验证程序的正确性。 1. 若X、Y、R、W 是存放8 位带符号数字节单元的地址,Z 是16 位字单元的 地址。试编写汇编程序,完成Z←((W-X) ÷5-Y)?(R+ 2) 。 2.试编写一个程序,测试某数是否是奇数。如该数是奇数,则把DL 的第0 位置1,否则将该位置0。 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验2 分支及循环程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握分支程序和循环程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编写汇编程序,统计某存储区若干个数据中英文字母的个数,并将结果在屏幕上显示。 2.从键盘任意输入一组字符数据,请编写汇编程序将该组数据加密后在屏幕上显示。参考加密方法是:每个数乘以2。(说明:本题的加密方法,同学们可以自己拟定) 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验3 子程序程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握子程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编程以十进制形式和十六进制形式显示AX的内容,并把两个显示功能分别封装成子程序dispDEC和dispHEX。 2.设在以EXAMSCORE为首地址的数据缓冲区依次存放某班10名同学5门功课的成绩,现要统计各位同学的总分,并将总分放在该学生单科成绩后的单元,并调用第1个程序封装好的子程序,以十进制方式显示统计情况,显示格式自行设计。请编程完成此功能。数据缓冲区参考数据定义如下: EXAMSCORE DB 01 ;学号 DB 89,76,54,77,99 ;单科成绩 DW ? ;该学生的总分 DB 02 ;学号 DB 79,88,64,97,92 ;单科成绩 DW ? ;该学生的总分 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

8086汇编指令手册

8086汇编指令手册 一、数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里) XLAT 字节查表转换. —— BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即 0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL ) 2. 输入输出端口传送指令. IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器) 输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时, 其范围是0-65535. 3. 目的地址传送指令. LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI. LFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FS:DI. LGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GS:DI. LSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SS:DI. 4. 标志传送指令. LAHF 标志寄存器传送,把标志装入AH. SAHF 标志寄存器传送,把AH内容装入标志寄存器.

微机原理第6章习题参考答案

第6章习题参考答案 1.CPU与外部设备通信为什么要使用接口? 答: CPU要与外部设备直接通信会存在以下两个方面的问题:首先是速度问题,CPU的运行速度要比外设的处理速度高得多,通常仅使用简单的一条输入/输出指令是无法完成CPU与外设之间的信息交换的;其次,外设的数据和控制线也不可能与CPU直接相连,如一台打印机不能将其数据线与CPU的管脚相连,键盘或者其他外设也是如此,同时外设的数据格式千差万别,也不可能直接与CPU 连接。所以,要完成CPU与外部各通信设备的信息交换,就需要接口电路以解决以上问题。 2. I/O接口有什么用途? 答: 主要由以下几个方面的用途: a完成地址译码或设备选择,使CPU能与某一指定的外部设备通信。 b状态信息的应答,以协调数据传输之前的准备工作。 c进行中断管理,提供中断信号。 d进行数据格式转换,如正负逻辑转换、串行与并行数据转换。 e进行电平转换,如TTL电平与MOS电平间的转换。 f协调速度,如采用锁存、缓冲、驱动等。 h时序控制,提供实时时钟信号。 3.I/O端口有哪两种寻址方式?各有何优缺点? 答: I/O端口的寻址方式有存储器映像I/O和I/O映像I/O两种寻址方式。存储器映像I/O 方式是将系统中存储单元和I/O端口的地址统一编址,这样一个I/O端口

地址就是一个存储单元地址,在硬件上没有区别,对I/O端口的访问与存储器的访问相同。其缺点是占用了储存器的地址空间,同时由于存储器地址和I/O 端口在指令形式上没有区别,增加了程序设计的难度。其优点是不需要专门为I/O端口设计电路,可与存储器地址访问硬件混合设计。另一个优点是,由于I/O端口和存储器地址是相同的形式,就可以直接使用与存储器相同的指令,这将会丰富对I/O端口的操作指令。 与存储器映像I/O相反,I/O映像I/O就必须为I/O端口设计专门的硬件电路,其端口地址也是独立于存储器,也有专门的输入/输出指令等其优缺点与存储器映像I/O正好相反。 4.在8086微机系统中有个外设,使用存储器映像的I/O寻址方式该外设地址为01000H。试画出其译码器的连接电路,使其译码器输出满足上述地址要求,译码器使用74LS138芯片。 答: 见图6-1

8086指令系统精析解析

8086指令系统精析 3.1基本数据类型 1.IA-32结构的基本数据类型是字节(8位)、字(16位)、双字(32位)、四字 (64位,486中引入的)和双四字(128位,Pentium3中引入的)。 2.低字节占用内存中的最低地址,该地址也是此操作数的地址。图:P44 图3-1 3.字、双字、四字的自然边界是偶数编号的地址,字的自然边界是偶数编号的 地址,双字和四字的自然边界地址要分别能被4和8除尽。 4.数据结构要尽可能在自然边界上对齐 5.对于不对齐的存储访问,处理器要求做两次存储访问操作;而对于对齐的访 问,只要进行一次存储访问操作。 6.数字数据类型(学生自学)PPT 3.28086的指令格式 一、指令格式 Label(标号):mnemonic(助记符)argument1(参数1),argument2(参数2),argument3(参数3)其中: 1.标号是一个标识符,后面跟有冒号 2.助记符是一类具有相同功能的指令操作码的保留名 3.操作数的三个参数是任选的,可以有零到三个操作数,操作数参数的数量取 决于操作码 4.操作数参数可能是文字或数据项的标识符,也可能是寄存器的保留名或在程 序的另一部分声明的赋予数据项的标识符。 5.在算术和逻辑指令中存在两个操作数时,右边的操作数是源,左边的操作数 是目的。例如:LOADREG: MOV AX, SUBTOTAL 功能是把由SUBTOTAL表示的源操作数传送至AX寄存器。 3.38086/8088指令的操作数寻址方式

寻找操作数,操作数能定位在指令中、寄存器中、存储单元中以及I/O端口中。 1.立即数 用包含在指令中的操作数作为源操作数,这些操作数即为立即操作数。 立即数可以是8位或16 例1 MOV AX , 2056H 结果( AH ) = 20H ( AL ) = 56H 例2 MOV AL , 78 H 结果( AL ) = 78H 2.寄存器操作数 操作数在寄存器中,指令中指定寄存器名 8 位操作数,用8 位寄存器: AH、AL、BH、BL、CH、CL、DH、DL 16 位操作数,用16 位寄存器: AX、BX、CX、DX、SP、BP、SI、DI CS、DS、SS、ES 例1 MOV AX , 2056H 执行后:(AX)=2056H 例2 MOV BL , AH 执行前:(BL) = 12H, (AH) = 78H 执行后:(BL) = 78H (AH) = 78H ▲立即数寻址、寄存器寻址的操作数,不用在取完指令后再到内存中取数。 ▲以下的 5 中寻址方式,操作数存放在内存中,取完指令后,还需到内存取数。指令中给出的是该操作数的地址,包括段地址和偏移地址。 3. 内存操作数 ▲指令MOV DS: [ DI ] , CL 完成将CL寄存器中的内容传送到以DS为段值,DI为偏移值的内存单元中。例编程将CL寄存器的内容传送到21000H单元中。PPT 地址21000H=2000:1000H ,编程时,DS 存放段地址2000H,DI 存放偏移地址1000H MOV AX, 2000H MOV DS, AX ; (DS) = 2000H

8086汇编指令大全.

标志寄存器:9个有效位,分 6个状态寄存器和 3个控制寄存器 CF 当执行一个加法(减法使最高位产生进位(借位时 CF=1 否则 CF=0 PF 指令执行的结果低 8位有偶数个一时, CF=1 否则 CF=0 AF 当执行一个加法(减法使运算结果低 4位向高 4位有进位(借位时 AF=1 否则 AF+0 ZF 当前运算结果为零, ZF=1 否则 ZF=0 SF 符号标志位 OF 溢出标志位 DF 方向标志位 IF 中断允许位 IF=1时响应外部中断

TF 跟踪标志位 操作数:[目的操作数(OPD ,源操作数(OPS ] ;立即操作数,寄存器操作数,存储器操作数。寻址方式: 1 寄存器寻址例:INC AX ; MOV AX , BX 2 寄存器间接寻址 (寄存器只能是 BX , DI , SI , BP ; [PA=(BX 、 DI 、 SI +DS》 4 或 BP+SS》4] 3 寄存器相对寻址 4 基址变址寻址 5 相对基址变址寻址 6 直接寻址 7 立即数寻址 i. 立即数寻址立即数寻址不能用在单操作数指令中 ii. 在双操作数中,立即数寻址方式不能用于目的操作数字段 指令系统: 1 数据传送指令 mov 注意: 不允许在两个存储单元之间直接传送数据

不允许在两个段寄存器之间传送数据 不允许用立即数直接为段寄存器赋值 不影响标志位 不允许寄存器或存储单元到除 CS 外的段寄存器 2 入栈(出栈指令 PUSH (POP 注意: PUSH 操作数不能是“立即数” POP 操作数不能是段寄存器 CS 不影响标志位 先进后出 单操作符 3 交换指令 XCHG 注意:

常用8086汇编指令(彩色版)

8086/8088指令系统 一、数据传送指令 1.通用数据传送指令 MOV(Move)传送 PUSH(Push onto the stack)进栈 POP(Pop from the stack)出栈 XCHG(Exchange)交换 .MOV指令 格式为:MOV DST,SRC 执行的操作:(DST)<-(SRC) .PUSH进栈指令 格式为:PUSH SRC 执行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) .POP出栈指令 格式为:POP DST 执行的操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 .XCHG交换指令 格式为:XCHG OPR1,OPR2 执行的操作:(OPR1)<-->(OPR2) 2.累加器专用传送指令 IN(Input)输入 OUT(Output)输出 XLAT(Translate)换码 这组指令只限于使用累加器AX或AL传送信息. .IN输入指令 长格式为:IN AL,PORT(字节) IN AX,PORT(字) 执行的操作:(AL)<-(PORT)(字节) (AX)<-(PORT+1,PORT)(字) 短格式为:IN AL,DX(字节) IN AX,DX(字) 执行的操作:AL<-((DX))(字节) AX<-((DX)+1,DX)(字) .OUT输出指令 长格式为:OUT PORT,AL(字节) OUT PORT,AX(字)

执行的操作:(PORT)<-(AL)(字节) (PORT+1,PORT)<-(AX)(字) 短格式为:OUT DX,AL(字节) OUT DX,AX(字) 执行的操作:((DX))<-(AL)(字节) ((DX)+1,(DX))<-AX(字) 在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来传送信息. .XLAT换码指令 格式为:XLAT OPR 或:XLAT 执行的操作:(AL)<-((BX)+(AL)) 3.有效地址送寄存器指令 LEA(Load effective address)有效地址送寄存器 LDS(Load DS with Pointer)指针送寄存器和DS LES(Load ES with Pointer)指针送寄存器和ES .LEA有效地址送寄存器 格式为:LEA REG,SRC 执行的操作:(REG)<-SRC 指令把源操作数的有效地址送到指定的寄存器中. .LDS指针送寄存器和DS指令 格式为:LDS REG,SRC 执行的操作:(REG)<-(SRC) (DS)<-(SRC+2) 把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器. .LES指针送寄存器和ES指令 格式为:LES REG,SRC 执行的操作:(REG)<-(SRC) (ES)<-(SRC+2) 把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器. 4.标志寄存器传送指令 LAHF(Load AH with flags)标志送AH SAHF(store AH into flags)AH送标志寄存器 PUSHF(push the flags)标志进栈 POPF(pop the flags)标志出栈 .LAHF标志送AH

8086指令表

表2-2算术运算指令

表2-4 串操作指令

表2-5程序转移指令

表2-7串操作指令中寄存器和标志位的用途 1.设BL=0FFH,执行指令“SAR BL , 1”后,BL中的内容是(0FFH)。 2.设SP=1300H,AX=200H,执行指令“POP AX”后,SP寄存器的内容为(1302H)。 3.十进制数的-1的8位二进制补码,用十六进制数表示是(D) A.01H B.8FH C.0FEH D.0FFH

MOV用法总结 非法操作: 1.两个操作数都是存储器操作数 2.src是立即数,dest是段寄存器 3.两个操作数都是段寄存器 MOV指令用法的举例: MOV AX , CX ;段寄存器至通用寄存器 MOV AL , 125 ;立即数至寄存器 MOV MEM , 15 ;立即数至存储器,直接寻址 MOV SI , BX ;寄存器至寄存器 MOV DS , AX ;通用寄存器至段寄存器(CS不行) MOV [BX] , 50H ;立即数至存储器,寄存器间接寻址 MOV MEM , AX ;寄存器至存储器,直接寻址 MOV MEM , DS ;段寄存器至存储器,直接寻址 MOV ISP[BX] , CX ;寄存器至存储器,基址寻址 MOV AX , DISP[SI] ;存储器至寄存器,变址寻址 MOV DS , MEM ;存储器至段寄存器,直接寻址 MOV AX , DISP[BX] [SI] ;存储器至寄存器,基址变址寻址 标志位 1.CF:进位标志位。当进行加法或减法运算时,最高位发生进位或借位,CF=1;否则,CF=0。 2.PF:奇偶标志位。当运算结果的最低有效字节中“1”的个数为偶数时,PF=1;为奇数时,CF=0。 3.AF:辅助进位位。在减法或加法操作中,低4位向高4位有进位、借位发生时,AF=1;否则,AF=0。 4.ZF:零标志位。ZF=1表示运算结果为零;否则ZF=0。 5.SF:符号标志位。SF=1表示运算结果的最高位为1(即为负数);否则SF=0。 6.OF:溢出标志位。OF=1表示溢出,即算术运算的结果超出了带符号数的范围;OF=0表示未溢出。8位带符号数的范围是-128--+127,16位带符号数的范围是-32768--+3276 7. 7.TF:跟踪标志位。TF=1是CPU处于单步执行指令的工作方式。这种方式便于进行程序的调试。每执行一条指令后,便自动产生一次内部中断,从而能逐条地检查程序。 8.IF:中断允许标志位。IF=1使CPU可以响应可屏蔽中断请求。IF=0使CPU 禁止响应可屏蔽中断请求。不可屏蔽中断和内部中断不受IF影响。 9.DF:方向标志位。DF=1字符串操作按地址递减进行;DF=0字符串操作按地址递增进行。

8086 汇编语言中断程序设计

汇编语言程序设计实验报告 学院:计算机科学与技术专业:计算机科学与技术班级:计科131

LEA DX,FNAME MOV CX,0 ;语句1 INT 21H JC EXIT MOV FNUM,AX MOV BX,AX ;语句2 MOV CX,100 MOV AH,40H LEA DX ,BUF INT 21H MOV BX,FNUM MOV AH,3EH INT 21H EXIT: MOV AH,4CH INT 21H CODE ENDS END START 使用相应的文本编辑器建立文件LAB7.asm,内容如上所示。 2.汇编并运行此程序后,在当前目录建立的文件名是什么?其内容是什么? 1>汇编: C:\masm> masm lab7; 2>连接: C:\masm> link lab7; 3>运行: C:\masm> lab7 3.若将语句1 改为mov cx,1,则运行情况与前面会有什么区别? 4.若将语句1 改为mov cx,2,则运行结果同上会有什么不同?并简要说明此语句的作用. 5.若将语句2 改为mov bx,1,则运行结果会有什么不同?简要说明则语句的作用. 实验二:编写0 号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回到DOS。源程序下: assume cs:code code segment start: mov ax,cs mov ds,ax

mov si,offset do mov ax,0 mov es,ax mov di,200h mov cx,offset doend-offset do ;安装中断例程cld rep movsb mov word ptr es:[0],200h mov word ptr es:[2],0 ;设置中断向量表 mov dx,0ffffh mov bx,1 ;测试一下 div bx mov ax,4c00h int 21h do:jmp short dostart db 'divide error!' dostart: mov ax,0 mov ds,ax mov si,202h mov ax,0b800h mov es,ax mov di,160*12+60 mov cx,13 s: mov al,ds:[si] mov ah,15 mov es:[di],ax inc si inc di inc di loop s mov ax,4c00h int 21h doend:nop code ends end start

8086指令总结

8086指令系统总结 学习微处理器及其程序设计,必须掌握微处理器的指令系统。本章以8086 微处理器为例介绍微型计算机的指令系统,包括指令格式、寻址方式和各类指令功能。要明确各种寻址方式的区别和特点,掌握有效地址和物理地址的计算方法,要正确使用指令,掌握各类指令的功能、对标志位的影响和使用上的一些特殊限制。能够编写小汇编程序,初步掌握汇编程序的编写和调试方法。 本章的重点难点内容是:8086 的指令格式及寻址方式,8086 的常用指令和8086 指令前缀的使用。 下面我们分别进行总结: 一.8086寻址方式 (1)操作数是数字,指令中立即写出数字------------立即数寻址 MOV AX,1234H 解释此句意义 (2)操作数是寄存器内容,指令中写出寄存器的符号---------寄存器寻址 MOV AX,BX (3)操作数是存储单元内容,用括号括出存储单元有效地址-----直接寻址 MOV AX,[1234H] MOV AX,ES:[1234H] (4)操作数是存储单元内容,用括号括出寄存器或其表达式,寄存器或其表达式的值为存储单元有效地址-------------间接寻址MOV AH,[BX] MOV AX,ES:[SI] MOV AL,[BX+SI+5]===5[BX+SI]===5[BX][SI] 二.8086指令系统 1.数据传送指令 (一)通用传送指令 (1)MOV指令 指令格式:MOV 目,源 功能:将源操作数传送给目标操作数。 (2)堆栈操作指令 进栈指令:PUSH 格式:PUSH 源 功能:将源操作数压入堆栈。 例:用堆栈指令完成上例的功能。 MOV AX,3000H MOV DS,AX ;段寄存器填充 MOV SI,0100H ;基本指令执 MOV DI,2000H ;行前的初值 MOV CX,50 NT: PUSH [SI] ;程序从这 POP [DI] ;开始设计 INC SI INC SI INC DI INC DI LOOP NT MOV AH,4CH INT 21H

8086汇编指令表

8086汇编指令表

MOV MOV DST,SRC DST≠CS、IP和imm 不影响 标志位 MOV [9AF0H],AL MOVS MOVS mem, mem MOVSB/W 不影响 标志位 字符串传送ES:DI←(DS:SI) SI←(SI)(+/-)1 DI←(DI)(+/-)1 MOVS ES:BYTE PTR[DI], DS:[SI] MUL MUL r/m8 设置CF OF S Z A P无法预 测 无符号乘法:AX←AL*r/m8 MUL CL MUL r/m16 无符号乘法:DX:AX←AX*r/m16 MUL CX NEG NEG reg/mem CF OF SF ZF AF PF 求补:取反加一 0-(DST) NEG CL NOP NOP 不影响空操作NOP NOT NOT reg/mem 不影响按位取反NOT CL OR 同AND PF SF ZF CF=OF=0 逻辑或 OR AL,0FH (不变\置1) OUT OUT imm8,AL/AX/EAX 不影响 标志位 将AL/AX/EAX输出到imm8指定端 口 OUT 0FFH,AL OUT DX,AL/AX/EAX 将AL/AX/EAX输出到DX指定的端口OUT DX,AL POP POP DST DST!=imm & CS 不影响 标志位 DST←((SP)+1,(SP)) SP←(SP)+2 POP WORD Ptr [87EAH] POPF POPF 设置所有标志位从堆栈中弹出16位标志寄存器POPF PUSH PUSH SRC 8086 SRC!=imm 不影响 标志位 SP<--(SP)-2 ((SP)+1,(SP))←(SRC) [SP循 环] PUSH WORD Ptr [87EAH] PUSHF PUSHF 不影响压栈16位标志寄存器PUSHF RCL 同SHL 同ROL 带进位循环左移 RCL AL,1 RCR 同SHL 同ROL 带进位循环右移 RCR AL,1 ROL 同SHL 移一位后符号位 改变则OF=1 循环左移: ROL AL,1 ROR 同SHL 同ROL 循环右移: ROR AL,1 REP REP String operation 不影响 标志位 CX=0则终止---CX←(CX)-1 ---串操作---SI/DI增量 REPZ REPE REPE String operation AF CF OF PF SF ZF CX=0||ZF=0则终止 ---CX←(CX)-1 ---串比较---SI/DI增量 REPNZ REPNE REPNE String operation AF CF OF PF SF ZF CX=0||ZF=1则终止--- CX←(CX)-1 ---串比较---SI/DI增量 RET RET 恢复压栈标志位 POP IP[CS] 子过程返回(Near)/(Far) RET RET imm16 子过程返回后SP←(SP)+imm16 RET 08

微机原理第2章习题与答案

习题 一、选择题 1.8086/8088CPU内部有一个始终指示下条指令偏移地址的部件是_______。 A. SP B.CS C.IP D.BP 答案:C 2. 指令队列的作用是_________。 A.暂存操作数地址 B.暂存操作数 C.暂存指令地址 D.暂存预取指令 答案:D 3. 8086/8088下列部件中与地址形成无关的是______。 A. ALU B. 通用寄存器 C. 指针寄存器 D. 段寄存器 答案:A 4.对于8086,下列说法错误的是_______。 A.段寄存器位于BIU中 B.20位的物理地址是在EU部件中形成的 C.复位后CS的初值为FFFFH D.指令队列的长度为6个字节 答案:B 5.8086/8088中ES、DI分别属于_______。 A. EU、BIU B. EU、EU C. BIU、BIU D. BIU、EU 答案:D 6.BIU与EU工作方式的正确说法是_______。 A. 并行但不同步工作 B.同步工作 C. 各自独立工作 D. 指令队列满时异步工作,空时同步工作 答案:A 7.在执行转移、调用和返回指令时,指令队列中原有的内容_______。 A.自动清除 B.用软件清除 C.不改变 D.自动清除或用软件清除 答案:A 8.下列说法中,正确的一条是______ A. 8086/8088标志寄存器共有16位,每一位都有含义。 B. 8088/8086的数据总线都是16位。 C. 8086/8088的逻辑段不允许段的重叠和交叉 D. 8086/8088的逻辑段空间最大为64KB,实际应用中可能小于64KB。 答案:D 9.8086/8088工作于最大模式,是因为_____。 A.可以扩展存储容量 B.可以扩大I/O空间 C.可以构成多处理器系统 D.可以提高CPU主频 答案:C 10.8088/8086最大模式比最小模式在结构上至少应增加_____。 A.中断优先级控制器 B.总线控制器 C.数据驱动器 D.地址锁存器 答案:B 11.组成最大模式下的最小系统,除CPU、时钟电路,ROM,RAM及I/O接口外,至少需增加的芯片类型为______。

8086 汇编指令集

8086 汇编指令集 一、数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令 MOV 传送字或字节. 格式为: MOV DST,SRC 执行的操作:(DST)<-(SRC) MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. 格式为:PUSH SRC 执行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) POP 把字弹出堆栈. 格式为:POP DST 执行的操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI 依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX 依次弹出堆栈. PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX 依次弹出堆栈. BSWAP 交换32 位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) 格式为:XCHG OPR1,OPR2 执行的操作:(OPR1)<-->(OPR2) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里) 2. 输入输出端口传送指令. IN I/O 端口输入. ( 语法: IN 累加器,{端口号│DX} ) 长格式为: IN AL,PORT(字节) IN AX,PORT(字) 执行的操作: (AL)<-(PORT)(字节) (AX)<-(PORT+1,PORT)(字) 短格式为: IN AL,DX(字节) IN AX,DX(字) 执行的操作: AL<-((DX))(字节) AX<-((DX)+1,DX)(字) OUT I/O 端口输出. ( 语法: OUT {端口号│DX},累加器),输入输出端口由立即方式指定时,其范围是0-255;由寄存器DX 指定时,其范围是0-65535. 长格式为: OUT PORT,AL(字节) OUT PORT,AX(字) 执行的操作: (PORT)<-(AL)(字节)

8086汇编语言上机调试步骤

8086汇编语言上机调试步骤 1、在网络课堂-微机原理与接口技术-实验指导-汇编工具下载,下载汇编工具并解压,文件夹名为“masm”。 2、用鼠标点击“masm”文件夹。进入该文件夹后将看到 MASM.EXE, LINK.EXE , DEBUG.EXE3个文件进行复制操作。 3、用鼠标点击“我的电脑”再点击D: 盘,并在 D: 盘上建立新的“ MASM”文件夹,最后将上面的3个文件全部复制到该文件夹中。(注意实验所有的文件都放在该文件夹内) 4、用文本编辑软件UltraEdit-32、WINDOWS 中的记事本或其它的文本编辑器输入汇编语言程序, 注意在最后一行的 END输入完后要按一次回车键,保存的源 文件的扩展各一定要是“.asm”如: example.asm 。(建议用记事本输入源程序,另存时,保持类型选择“所有文件”如图所示) 5、进入MS-DOS方式 ( 从开始>程序>附件>命令提示符) 或者(从程序 > 运行输入“cmd”回车,进入MS-DOS环境。

6、进入D:>MASM文件夹 7、显示MASM文件夹内所有文件“dir”命令 8、在 DOS 提示符下进行汇编、连接、动态调试等操作。 例如: 对源文件 example.asm 进行的操作

D:\MASM\MASM example.asm;汇编源程序操作 D:\MASM\LINK example.dbj;连接并生成扩展名为 .EXE 的可执行文件 D:\MASM\DEBUG example.exe;对可执行文件进行调试 9、要求掌握的调试命令(在 DEBUG 中使用的命令) a: U - 反汇编命令 用法: -U 代码段地址:起始偏移地址如:-U CS:100 b: D - 显示内存中的数据命令 用法: -D 数据段地址:存放数据的偏移地址如:-D DS:00 20 c: T - 单步执行程序命令 用法: -T 要执行的指令条数如:-T 3 d: G - 连续执行程序命令 用法: -G=代码段地址:指令的起始偏移地址指令的结束偏移地址如: -G=CS:100 106 注意: 结束地址一定要是操作码的所在地址 e: R - 查看和修改寄存器数据命令 用法: -R 回车如:-R AX f: F - 对内存单元填充数据命令 用法: -F 数据段地址:偏移首地址偏移未地址填入的数据 如: -F DS:100 120 ff g: Q - 退出”DEBUG“应用程序命令 10、应用例子 ;二进制到BCD转换(a.asm) ;将给定的一个二进制数,转换成二十进制(BCD)码 DATA SEGMENT RESULT DB 3 DUP(?) DATA ENDS CODE SEGMENT

微机原理习题-第3章

3.18086CPU有多少根数据线和地址线?它能寻址多少内存地址单元和I/O端口?8088又有多少根数据线 和地址线?为什么要设计8088CPU? 3.28086CPU内部按功能可分为哪两大部分?它们各自的主要功能是什么?8086与8088CPU中的指令队列 缓冲器有何区别?在微处理器中设置指令队列缓冲器有什么作用? 3.38086CPU内部的总线接口单元(BIU)由哪些功能部件组成?它们的基本操作原理是什么? 3.4什么叫微处理器的并行操作方式?为什么说8086CPU具有并行操作的功能?在什么情况下8086的执行 单元(EU)才需要等待总线接口单元(BIU)提取指令? 3.5逻辑地址和物理地址有何区别?为什么8086微处理器要引入“段加偏移”的技术思想?“段加偏移” 的基本含义是什么?试举例说明。 3.6段地址和段起始地址相同吗?两者是什么关系?8086的段起始地址就是段基址吗?它是怎样获得的? 3.7在8086微计算机中,若段寄存器中装入如下数值,试写出每个段的起始地址和结束地址。(假设段的最 大长度为64K) (1)1000H (2)1234H (3)E000H (4)AB00H 3.8已知8088微处理器组成的系统中,对于下列CS:IP组合,计算出要执行的下条指令的存储器地址。 (1)CS=1000H和IP=2000H (2)CS=2400H和IP=1A00H (3)CS=1A00H和IP=B000H (4)CS=3456H和IP=ABCDH 3.9已知计算机中两个16位数算术运算的结果为0E91BH,求PF = ?,SF = ?,ZF = ? 3.10一个基本的总线周期由几个状态组成?微处理器在什么情况下才执行总线周期?在什么情况下需要插 入等待状态? 3.11什么叫做非规则字,微处理器对非规则字是怎样操作的?字节、字在存储单元的存放顺序与存储单元的 地址有什么关系?字符在存储单元中以什么形式存放,举例说明? 3.128086对1MB的存储空间是如何按高位库和低位库来进行选择和访问的?用什么控制信号来实现对两个 库的选择? 3.13堆栈的深度由哪个寄存器确定?为什么说一个堆栈的深度最大为64KB?在执行一条入栈或出栈指令 时,栈顶地址将如何变化? 3.148086/8088CPU对(RESET)复位信号的复位脉冲宽度有何要求?复位后内部寄存器的状态如何? DT/信号起什么作用?它在什么情况下被浮置为高3.15ALE信号起什么作用?它在使用时能否被浮空?R 阻状态? 3.168086/8088CPU的哪些引脚采用了分时复用技术?哪些引脚具有两种功能?

8086汇编语言程序设计实验指导书.

汇编语言上机实验指导书 一、概述 上机实验总学时为16学时,其中综合性实验为2学时。实验共有6项暂定为8次,每次2学时。 1.实验辅导的主要内容 实验辅导的内容包括每个实验的实验目的;实验内容;对实验的算法及实验方法的必要说明;实验准备;实验步骤;实验报告要求;实验程序及参考框图。开始的实验介绍较细,后面的实验简要介绍。 2.实验的软硬件要求 关于汇编语言程序设计的硬件要求不高,有IBM-PC/XT即可,但应有彩色显示器以便进行图形实验。软件方面应有MASM.EXE5.0版(包括LINK.EXE),与MS-DOS版本配套的DEBUG程序和EDIT.EXE编辑软件(其它编辑软件也可以)。 3.加强实践能力的培养 实验目的不光是为了验证书本理论,更重要的是对实践能力的培养。其中包括: 实际调试程序的能力,例如修改程序参数的能力,查看结果的能力,设置断点调试运行的能力等; 开发汇编语言应用程序的能力,例如应用有关汇编软件的能力,进行系统调用和BIOS功能调用的能力,进行模块程序设计的能力等。 对某一问题用不同的程序实现的能力,例如我们为每个实验提供了参考程序(或程序段),目的是让每个实验者参照样板程序将实验成功地实现,在掌握其方法后,自己改变程序或自己编制程序加以实现。 实验一汇编语言运行环境及方法、简单程序设计(2学时、验证性) 1.实验目的: (1) 熟悉汇编语言运行环境和方法 (2)了解如何使用汇编语言编制程序 (3) 熟悉DEBUG有关命令的使用方法 (4) 利用DEBUG掌握有关指令的功能 (5) 利用DEBUG运行简单的程序段 2.实验内容 (1)学会输入、编辑汇编语言程序 (2)学会对汇编语言程序进行汇编、连接和运行 (3)进入和退出DEBUG程序 (4)学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命令、N命令、W命令等,也应试一下。 3.实验准备 (1)仔细阅读有关汇编语言环境的内容,事先准备好使用的例子。 (2)准备好源程序清单、设计好调试步骤、测试方法、对运行结果的分析。 (3) 编写一个程序:比较2个字符串所含的字符是否相同。若相同则显示’Match.’,否则显示’No match!’;(1)仔细阅读有关DEBUG 命令的内容,对有关命令,都要事先准备好使用的例子。 4.实验步骤 (1)在DOS提示符下,进入MASM目录。 (2)在MASM目录下启动EDIT编辑程序,输入源程序,并对其进行汇编、连接和运行。 ①调用edit输入、编辑源程序并保存在指定的目录中;例:edit abc.asm ②用汇编程序masm对源程序汇编产生目标文件obj。例:masm abc 不断修改错误,直至汇编通过为止。 ③用连接程序link产生执行文件exe.例:link abc ④执行程序 可直接从DOS执行程序,即在DOS环境中,输入文件名即可。 (3)详细记录每一步所用的命令,以及查看结果的方法和具体结果。 5.实验报告要求 (1)源程序清单。 (2) 如何启动和退出EDIT程序。 (3) 如何对源程序进行汇编及编辑。

8086指令集结构

8086指令集结构 一.8086 的寄存器结构 8086CPU中具有14个程序员可以访问的16位寄存器(如图1.1所示),按其功能可分为通用寄存器、段寄存器、指令指针寄存器及标志寄存器。 图1.1 8086寄存器结构框图 (1) 通用寄存器 8086CPU共有8个16位寄存器,它们可以作为一般的通用寄存器存放数据。按照相应的用途又可以分为两组:一组是数据寄存器(AX,BX,CX,DX),可以按照字(16位)形式访问,也可按照字节(8位)形式访问。主要用来暂时存放在计算过程中需要用到的操作数、操作运算结果。另一组是地址指针寄存器(SP,BP,SI,DI),只能按照字形式访问。主要存放访问主存时所需的偏移地址。 AX(Accumulator) 称作累加器,在乘、除法等指令运算中指定存放操作数及运算结果。 BX(Base) 称作基址寄存器,在计算主存地址时可以用作基址寄存器。 CX(Count) 称作计数寄存器,在循环指令及串处理等指令中作为隐含的计数器使用。 DX(Data) 称作数据寄存器,在字(16位)乘、除法等指令中用于存放双倍字长结果的高16位数据;在I/O指令中存放I/O的端口地址。 以上四个16位寄存器均可分为两个独立的8位寄存器使用。如AX分为AH 和AL SP(Stack Pointer) 称作堆栈指针寄存器,存放堆栈段首地址到栈顶单元的偏移量。 BP(Base Pointer) 称作基址指针寄存器,通常用于存放需要访问的、位于堆栈段数据的一个基地址或该段的某个字单元到堆栈段首地址的偏移量。 SI(Source Index) 称作源变址寄存器,主要用于存放需要访问的(源)操作数所在主存单元相对于该段首地址的偏移量。在串操作指令中,用作隐含的源变

8086指令系统之算术运算类指令

8086 指令系统之算术运算类指令 2007-04-17 07:51 1 加法指令 1.1 加法指令 ADD ADD reg,imm/reg/mem ;reg←reg+imm/reg/mem ADD mem,imm/reg ;mem←mem+imm/reg 2.17a: 例 2.17a:加法运算 mov add mov mov add add al,0fbh ;al=0fbh al,07h ;al=02h word ptr[200h],4652h ;[200h]=4652h bx,1feh ;bx=1feh al,bl ;al=00h word ptr[bx+2],0f0f0h ;[200h]=3742h
ADD 指令按照状态标志的定义相应设置这些标志的 0 或 1 状态。例如 在 07+FBH→02H 运算后:标志为 OF=0、SF=0、ZF=0、AF=1、PF=0、CF=1;用调 试程序单步执行后,上述标志状态依次为 NV、PL、NZ、AC、PO、CY。 同样进行 4652h+f0f0h→3742H 运算后,标志为 OF=0、SF=0、ZF=0、 AF=0、PF=1、CF=1;调试程序依次显示为 NV、PL、NZ、NA、PE、CY。注意,PF 仅反映低 8 位中“1”的个数,AF 只反映 D3 对 D4 位是否有进位。 1.2 带进位加法指令 ADC ADC reg,imm/reg/mem ;reg←reg+imm/reg/mem+CF ADC mem,imm/reg ;mem←mem+imm/reg+CF ;mem←mem+imm/reg+CF 加法运算外, CF, ADC 指令除完成 ADD 加法运算外,还要加进位 CF,其用法及对状态标志的 指令一样。 影响也与 ADD 指令一样。ADC 指令主要用于与 ADD 指令相结合实现多精度 数相加。 数相加。 2.17b: 例 2.17b:无符号双字加法运算 mov ax,4652h ;ax=4652h add ax,0f0f0h ;ax=3742h,CF=1 mov dx,0234h ;dx=0234h adc dx,0f0f0h ;dx=f325h,CF=0 上述程序段完成 DX.AX = 0234 4652H + F0F0 F0F0H = F325 3742H。 1.3 增量指令 INC INC reg/mem ;reg/mem←reg/mem+1 增量)。 INC 指令对操作数加 1(增量)。

相关主题