2021《微型计算机原理与接口技术》总复习

第 1 部分 指令

1.1 数据传送

1、通用数据传送

MOV    dest,src
传送指令,将src的内容赋值给dest

PUSH    OPRD    ;
压入栈指令,将oprd压入栈
16 位寄存器或者存储器字单元

POP    OPRD    ;
弹出栈指令,将栈定元素弹出到oprd里面
不能从栈顶弹出一个字给 CS

XCHG    REG/MEM,MEM/REG;
数据交换指令
将源地址与日的地址中的内容互换
两操作数必须有一个是寄存器操作数,不允许使用段寄存器.

XLAT    ;输入:用 BX 的内容代表表格首地址,AL 内容为表内位移量, 
BX+AL 得到要查找元素的偏移地址;输出:将 BX+AL 所指单元的内容送 AL。

MOV AX,BUF    ;BUF是变量,直接寻址

MOV BH,[DI]    ;寄存器间接寻址:由指令给出寄存器号,在该寄存器号所指定的寄存器中存放着操作数地址,按此地址访问主存,读取或写入操作数,然后赋值给BH

MOV DI,ES:3[S1]     ;寄存器相对寻址,使用跨段前缀:声明一个ES段,找到段内SI的数据当做地址,加3相对偏移量后赋给DI

MOV BUF,DS    ;寄存器寻址:DS段寄存器内容赋给BUF字变量

MOV ES,BUF    ;直接寻址:BUF字变量赋给ES段寄存器

2、输入输出

IN    acc,PORT    ;
输入指令,将端口port中的内容放入累加器里面
PORT 为端口地址,acc 为累加器 AL 或 AX

OUT    PORT,acc
输出指令,将累加器中的内容放入端口里面

直接寻址:8 位端口地址,地址范围:0-0FFH。    如 IN    AL,30H

间接寻址:16 位端口地址,由 DX 指定端口地址。如 IN    AL,DX

3、取偏移地址

LEA OPD,OPS
;有效地址传送指令
功能:主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定寄存器 

MOV BX,0100H
MOV SI,0210H
LEA BX,1234H[BX+SI]    ;(BX)=1234H+0100H+0210H=1544H

LDS OPD,OPS
;指针送寄存器和DS指令
功能:将主存中指定字单元数据OPS送入指定存储器OPD,下一字单元数据送DS寄存器。
即(OPS) →OPD,(OPS+2)→DS。

LES OPD,OPS
;指针送寄存器和附加数据段ES指令LES
功能:将主存某字单元内容送指定寄存器,下一字单元数据送ES寄存。
即(OPS) →OPD,(OPS+2)→ES。

1.2 算术运算

影响标志位 CF进位、AF辅助 、SF符号、OF溢出、PF奇偶、ZF零

CF进位标志位:最高位有进位为1,否则为0

AF辅助标志位:低4位有进位为1,否则为0

SF符号标志位:最高位为1则为1,否则为0

OF溢出标志位:有溢出为1,否则为0

PF奇偶标志位:1的数量为偶数则为1,否则为0

ZF零标志位:全0为1,否则为0

1、加法运算

ADD    DST,SRC
;加法指令:源+目->目
段寄存器不能作为操作数

ADC    OPRD1,OPRD2    
;带进位加法指令:源+目+CF->目
常用于多字节数相加


INC    OPRD    
;加l指令INC (lncrement by l Instruction)
指令的功能是把操作数的值加1
不影响 CF 标志

XADD oprd l,oprd2 ;
;交换加指令XADD (Exchange and Add)
指令的功能是先交换两个操作数的值,再进行算术“加”法操作。

2、减法运算

SUB    DST,SRC
;源-目->目


SBB    OPRD1,OPRD2
源-目-CF->目

DEC    OPRD    
;减1指令
指令的功能是把操作数的值减去1
不影响 CF 标志

NEG    OPRD
;求补指令
操作数=0-操作数


CMP    OPRD1,OPRD2
;比较指令
和sub一样,只是结果不保存,只影响标志位
对于无符号数:

(1)ZF=1,OPRD1=OPRD2

(2)CF=0,OPRD1>OPRD2

(3)CF=1,OPRD1<OPRD2

对于有符号数:

(1)ZF=1,OPRD1=OPRD2

(2)OF=SF,OPRD1>OPRD2

(3)OF≠SF,OPRD1<OPRD2

3、逻辑运算

;AND、OR、XOR、TEST 使标志位 OF=CF=0;

AND    DST,SRC
;逻辑与AND
(DST )<-(DST)与(SRC)
设置CF=OF=0,影响SF、ZF、PF,对AF无定义

OR    DST,SRC
;逻辑或
(DST )<-(DST)或(SRC)
设置CF=OF=0,影响SF、ZF、PF,对AF无定义

NOT    OPRD    ;对标志位无影响
;逻辑非
将操作数按位求反后放回去

XOR    DST,SRC
;异或:相同为零,相异为一
(DST )<-(DST)异或(SRC)
设置CF=OF=0,影响SF、ZF、PF,对AF无定义

TEST OPRD1,OPRD2
;测试:和and一样,但不存结果,但改变标志位

4、移位

移位指令从移位方向上分为左移或右移;

从移位功能上可以分为算术逻辑移位或循环移位,前者是开环的,后者是闭环的;

从移位次数上可以分为一次移位或多次移位。

移动次数一般用 CL 来指定,若只移位 1 次,也可以在指令中直接写常数“1”。

SAL    OPRD,CL    ;有符号,D7
;算数左移
右边空出来的地方补0

SHL    OPRD,CL    ;无符号
;逻辑左移
右边空出来的地方补0

SAR    OPRD,CL    ;有符号,D7D7
;算数右移
将OPD的内容向右移动指定的位数,最低位移入CF中,最高位保持不变


SHR    OPRD,CL    ;无符号
;逻辑右移
将OPD的内容向右移动指定的位数,最低位移入CF中,高位补0
MOV BL. ,24l;(BI)=24H=0010010OB
MOV Cl. ,2
SHR BL ,CL;将BL内容右移2位,
(BL)=00001001B,CF=0


ROL    OPRD,CL
;循环左移,左边部分接到右边

ROR    OPRD,CL
;循环右移,右边部分接到左边

RCL    OPRD,CL
;带进位的循环左移,先将cf接到oprd左边,再将整体左边部分接到右边

RCR    OPRD,CL
;带进位的循环右移,先将cf接到oprd右边,再将整体右边部分接到左边

多字节单元数据联合移位:

SAL    M,1

RCL    M+2,1

RCL    M+4,1

1.3 串操作

源串一般存放在数据段,偏移地址由 SI 指定。允许段重设;

目标串必须在附加段,偏移地址由 DI 指定。

指令自动修改地址指针,修改方向由 DF 决定。DF=0,增地址方向;DF=1,减地址方向;

用指令 CLD 或者 STD,设置 DF 值。

数据块长度值由 CX 指定。

REP    MOVSB    ;初始化 SI、DI、CX、DF

REP    MOVSW    ;初始化 SI、DI、CX、DF

;REP重复串操作
每执行一次串指令(CX)-1,直到(CX)=0,重复执行结束
MOVS串传送指令
MOVSB-字节串传送,1字节=8bit
MOVSW-字串传送,1字=16bit
功能:将以SI为指针的源串中的一个字节(或字).
存储单元中的数据传送至以DI为指针的目的地址中去,并自动修改指针,
使之指向下一个字节(或字)存储单元。


REP STOSB ;向字节串中存数,初始化 AL、DI、CX、DF

REP STOSW ;向字串中存数,初始化 AX、DI、CX、DF

;将AL或者AX中的数据送入DI所指的目的串中的字节(字)存储单元中


LODSB    ;向字节串中取数,将SI中内容取出放到AL或者AX中,初始化 SI,输出 AL

LODSW    ;向字节中取数,将SI中内容取出放到AL或者AX中,初始化 SI,输出 AX



REPNE    CMPSB    ;初始化 SI、DI、CX、DF

REPNE    CMPSW    ;初始化 SI、DI、CX、DF

REPNZ    SCASB    ;初始化 AL、DI、CX、DF

REPNZ    SCASW    ;初始化 AX、DI、CX、DF

与REPE/REPZ和REPNE/REPNZ联合工作的串比较指令CMPS和串扫描指令SCAS
REPE/REIPZ某次比较的结果两个操作数相等,或两个操作数相减为零时重复串操作
REPNE/REPNZ某次比较的结果两个操作数不相等,或两个操作数相减为不为零时重复串操作

1.4 程序控制

JMP    BX
;段内直接短转移
寄存器BX中的16位数据为转移有效地址EA


JMP WORD    PTR[SI]
;段内间接转移
以(SI)所指定的存储器字单元中的16位数据为转移有效地址EA


JC/JNC    Label    ; 条件转移指令均为段内(标号)短转移,即转移范围为:-128-+127

JZ/JNZ    OPR    ;ZF=1,JZ结果为零转移,JNZ是不为0时转移

JO/JNO    OPR    ;溢出转移,OF=1,带N相反

JP/JNE    OPR    ;奇偶位为1转移,PF=1,带N相反

JA/JAE/JB/JBE 无符号数比较大小

JG/JGE/JL/JLE 符号数比较大小

LOOP Label    ;初始化 CX

CALL    OPRD

RET

CLI、STI、CLC、STC、CMC、CLD、STD

汇编模板

使用SI寄存器,用于在存储器中寻址。利用循环输入10个数字,将10个数比较,大的放在AL,小的放在BL。利用01H号功能,输出。

data segment         ;数据段定义开始
    buf db 10 dup(?)      ;数据定义及其存储空间
    max db ?
    min db ?
    Str1 db 0DH,0AH,'Please input: ','$'  	 ;定义Str1的内容
    Str2 db 0DH,0AH,'MAX:','$'      	 ;定义Str2的内容
    Str3 db 0DH,0AH,'MIN:','$'        	 ;定义Str3的内容
data ends    ;数据段定义结束  
 
Stack segment stack   ;堆栈段定义开始
    db 10 dup(?)
stack ends      ;堆栈段定义结束
 
code segment    ;代码段定义开始
main proc far     
    assume cs:code,ds:data,ss:stack
start:    					
    push ds       
    sub ax,ax
    push ax
    mov ax,data
    mov ds,ax
    mov ax,stack
    mov ss,ax
    mov cx,10
    mov si,0      ;寄存器,用于寻址
    mov bx,0
lop1:				
    lea dx,Str1  
    mov ah,09
    int 21h
    mov ah,01h    ; 输入
    int 21h
    mov buf[si],al
    inc si
    loop lop1    ;返回循环1
    mov cx,9
    mov si,0
    mov al,buf[si]
    mov bl,al
lop2:
    inc si   
    mov dl,buf[si]
    cmp dl,al
    jl compare1
    mov al,dl
compare1:
    cmp bl,dl 		 ;比较,小的数放在bl
    jl compare2
    mov bl,dl
compare2:
    loop lop2   
    mov max,al   
    mov min,bl 
    lea dx,Str2
    mov ah,09
    int 21h
    mov dl,max
    mov ah,02h                  
    int 21h       	;输出最大数
    lea dx,Str3
    mov ah,09
    int 21h
    mov dl,min
    mov ah,02h                  
    int 21h       	;输出最小数
    ret 
    main endp
    code ends    
end start

第二部分、伪指令

2.1 标识符

指令语句中的标号和伪指令语句中符号名统称为标识符。

命名规则:

1.字符的个数为 1~31 个;

2.第一个字符必须是字母、问号、@或下划线“_”这 4 种字符之一;

3.从第二个字符开始,可以是字母、数字、@ 、 “_”或问号“?”;

 4.不能使用系统专用的保留字。

保留字:

CPU 中各寄存器名(如 AX、CS 等)

指令助记符(如 MOV、ADD)

伪指令符(如 SEGMENT、DB)

表达式中的运算符(如 GE、EQ)以及属性操作符(如 PTR、OFFSET 等)

1、表示形式:

01001001B、254O、0FEH、2.134 E +10。

如果常数的第一个数符为字母,为了与标识符区别,必须在其前面冠以数字“0”。

2、字符串常数:

用引号(单引号或双引号)括起来的一个或多个字符,其值为字符的 ASCII 码值。

2.2.2 变量

给变量在内存中分配一定的存储单元。

1、一般格式

2、变量赋初值

(1)字符串表达式:

对于 DB 伪指令:字符串按从左到右,一个字符分配一个字节单元。将字符的ASCII 码以地址递增的排列顺序依次存放。

对于 DW 伪指令:两个字符的存放顺序是前一个字符放在高地址,后一字符放低地址单元。

对于 DD 伪指令,只能给两个字符组成的字符串分配 4 个字节单元。两个字符存放在较低地址的两个字节单元中。

注意:DW 和 DD 伪指令不能用两个以上字符构成的字符串赋初值,否则将出错。

STRING1    DB    ‘ABCDEF’

STRING2    DW    ‘AB’, ‘CD’, ’EF’

STRING3    DD    ‘AB’, ‘CD’

 

(2)DUP 表达式

其中:表达式 1 是重复的次数,表达式 2 是重复的内容。

BUFFER DB 10 DUB(?)
;给变量BUFFER分配10个存储空间,但不赋值

3、变量的使用

(1)在指令语句中引用

在指令语句中直接引用变量名就是对其存储单元的内容进行存取。

如    
 

DA1 DB     0FEH

MOV AL,DA1     ;将 0FEH 传送到 AL 中

当变量出现在变址(基址)寻址或基址变址寻址的操作数中时表示

取用该变量的偏移量。

如    

DA3    DB    10H    DUP(?)

MOV    DA3[SI],AL

(2)在伪指令语句中引用

如    

NUM    DB    75H

ARRAY    DW    20H DUP(0)

ADR1    DW    NUM ;取变量地址的偏移量

ADR2    DD    NUM ;取变量段基值和偏移量。

设段基值为 0915H,NUM 的偏移量为 0004H,则存储单元的分配情况如图所示。

2.2.3 标号

标号加在一条指令的前面,它就是该指令在内存的存放地址的符号表示,也就是指令地址的别名。

距离属性(也叫类型属性)指定

(1)隐含方式

当标号加在指令语句前面时,它隐含为 NEAR 属性。如 SUB1:MOV    AX,30H

(2)用 LABEL 伪指令给标号指定距离属性

SUB1_FAR    LABEL    FAR

SUB1:    MOV    AX,30H

2.3 符号定义语句

1、等值语句

(1)常数或数值表达式,如    COUNT    EQU    5

将5赋值到COUNT里

(2)地址表达式,如 ADR1    EQU    DS:[BP+14];ADR1 为在 DS 中以 BP 作基址寻址的一个存储单元。

(3)变量、寄存器名或指令助记符,如 CREG    EQU    CX

注意:在同一源程序中,同一符号不能用 EQU 定义多次。

2、等号语句

(1)等号语句可以对一个符号进行多次定义。

如    NUM=14H

NUM=NUM+10H

(2)等号语句不能为助记符定义别名

如    CBD=DAA;错误语句

注意:等值语句与等号语句都不会为符号分配存储单元。所定义的符号没有段、偏离量和类型等属性。

2.4 表达式与运算符

1、算术运算符

+、—、*、 / 、MOD、SHL、SHR、[ ]

(1)运算符“+”和“-”也可作单目运算符,表示数的正负

(2)使用“+”、 -”、“*”、和“/”运算符时,参加运算的数和运算结果都是整数。

(3)“/”运算为取商的整数部分,而“MOD”运算取除法运算的余数。

(4)“SHR ”和“SHL ”为逻辑移位运算符。空位补 0,如:MOV    AX , NUM SHL    1

注意:移位运算符的操作对象是某一具体的数(常数),在汇编时完成移位操作。

而移位指令是对一个寄存器或存储单元内容在程序运行时执行移位操作。

(5)下标运算符“[ ]”具有相加的作用。

如    MOV    AX,DA_WORD[20H]

MOV    AX,DA_WORD+20H

下列语句错误:

MOV    AX,ARRAY+DA_WORD

MOV    AX,ARRAY+BX+SI

2、逻辑运算符

NOT、AND、OR、XOR,如    MOV    AX,NOT 0F0H

3、关系运算符

EQ(等于)、NE(不等于)、LT(小于less than)、 LE(小于等于)、GT(大于greater than)、 GE(大于等于)

(1)若是常量,则按无符号数进行比较;若是变量,则比较它们的偏移量的大小。

(2)关系运算的结果只能是“真”(全 1)或“假”(全 0)

4、取值运算符和属性运算符

SEG、OFFSET、PTR

SEG :回送变量或标号的段地址
例:指令MOV BX , SEG DATA,把名字为DATA的段地址装入BX寄存器

OFFSET回送变量或标号的偏移地址

例指令mov bx,offset s1        ;汇编程序将变量s1在数据段中的偏移地址回送给指令,

该指令将这个偏移地址装入BX寄存器。这条指令与指令LEA BX,S1是等价的。

PTR属性操作符
格式为type PTR expre ,用于建立一个符号地址,给已分配的存储地址赋予另一个属性,是该地址具有另一种属性
例在数据段中定义a db 1
在代码段中有如下指令MOV AX, WORD PTR a则汇编程序把变量a中的数据以word的形式装入AX寄存器

MOV    AX ,    WORD    PTR    DA_BYTE[10]

5、运算符的优先级

2.5 程序的段结构

1、一般格式

(1)定位类型

PAGE: 表示该段从一个页面的边界开始存放数据

PARA:表示该段从一个小节的边界开始存放数据,缺省为 PARA。

WORD:表示该段从一个偶数字节地址开始存放数据。

BYTE:表示该段起始数据单元地址可以是任一地址值。

注意:定位类型为 PAGE 和 PARA 时,段基址直接选用段起始地址,即它们是重合的。

定位类型为 WORD 和 BYTE 时,段基址与段起始地址可能不同。

(2)组合类型

用来指定段与段之间的连接关系和定位。

  • NONE:若未指定组合类型,表示本段与其它段无连接关系。
  • PUBLIC:在满足定位类型的前提下,将与该段同名的段邻接在一起,形成一个新的逻辑段,共用一个段基址。
  • COMMON: 产生一个覆盖段。在多个模块连接时,把该段与其它也用 COMMON 说明的同名段置成相同的段基址,这样可达到共享同一存储区。
  • STACK:把所有同名段连接成一个连续段,且系统自动对 SS 段寄存器初始化为该连续段的段基址。并初始化堆栈指针 SP。用户程序中应至少有一个段用 STACK 说明,否则需要用户程序自己初始化 SS 和 SP。
  • AT 表达式:表示本段可定位在表达式所指示的小节边界上。表达式的值也就是段基值。
  • MEMORY:表示本段在存储器中应定位在所有其它段之后的最高地址上。如果有多个用 MEMORY 说明的段,则只处理第一个用 MEMORY 说明的段,其余的被视为 COMMON。
     

(3) 类别名

类别名为某一个段或几个相同类型段设定类型名称。系统在进行连接处理时,把类别名相同的段存放在相邻的存储区,

但段的划分与使用仍按原来的设定。

2、段寻址伪指令

ASSUME 的作用是告诉汇编程序,在处理源程序时,定义的段与哪个寄存器关联。

如    ASSUME    CS:CODE,DS:DATA1,ES:DATA2

3、段寄存器的装入

(1)DS 和 ES 的装入,用传送数据指令。

如    MOV    AX,DATA1

MOV    DS,AX

(2)SS 装入

在段定义伪指令的组合类型项中,使用 STACK 参数,并在段寻址伪指令 ASSUME 语句中把该段与 SS 段寄存器关联。

如果在段定义伪指令的组合类型中,未使用 STACK 参数,或者是在程序中要

调换到另一个堆栈,这时,可以使用传送数据指令装入方法。如

DATA_STACK   SEGMENT

DB    40H DUP(?)

TOP LABEL    WORD

DATA_STACK    ENDS

CODE    SEGMENT

......

MOV    AX,DATA_STACK

MOV    SS,AX

MOV    SP,OFFSET TOP

(3)CS 的装入

由系统软件按照结束伪指令指定的地址装入初始的 CS 和 IP。

根据 END 伪指令的起始地址。

END    起始地址

段间调用 CALL 和 RET、JMP、中断服务程序。
 

4.6 子程序

第 3 部分 8086/8088 中断系统

3.1 中断类型

1、内部中断

0=除法出错中断;1=单步中断;3=断点中断;4=溢出中断;n 型中断(DOS 软中断【20H-3FH】和BIOS【11H-1AH】软中断):INT n。

中断响应过程:无#INTA,中断类型码固定或者指令直接给出。

(1)将类型码乘 4,得到中断向量地址

(2)硬件保护现场,将 FLAGS 压栈

(3)清除 TF 和 IF 标志

(4)保存断点,CS 和 IP 压栈

(5)中断服务程序入口地址送 CS 和 IP

(6)执行中断服务程序。

2、外部中断

(1)非屏蔽中断

2=NMI

(2)可屏蔽中断

08H~0FH:主 8259 管理,包括定时器、键盘、串口、并口、软盘驱动器。

70H~77H:从 8259 管理,包括实时时钟、协处理器、硬盘控制器。

(3)可屏蔽中断响应

两个中断响应总线周期。

第一个总线周期:地址/数据总线置高阻(ALE=0),送出#INTA 响应信号,禁止其他总线请求。

最大模式下,送#LOCK 信号,禁止其他处理器访问总线。

第二个总线周期:送第 2 个#INTA,通知 8259 送出中断类型码 n。

3、中断向量表

向量地址=n×4

用户中断服务程序,需要用户主程序初始化中断向量表中,该中断号对应的服务程序地址。

如将类型码为 48H 的中断服务子程序 TIMER 的中断向量放入向量表。

MOV AX,0000H

MOV DS,AX

MOV SI,0120H

MOV BX,OFFSET TIMER

MOV [SI],BX

MOV BX,SEG TIMER

MOV [SI+2],BX

3.2 中断控制器 8259

3.2.1 8259A 中断处理过程

1、中断请求输入线(IR0-IR7)上有中断请求,则 IRR 相应位=1

2、若 IMR 该位未屏蔽,则 8259 由 INT 引脚向 CPU 发出中断请求信号 INTR

3、CPU 处于开中断,CPU 执行完指令后,CPU 用#INTA 信号作为对 INTR 的响应。

4、8259 收到 CPU 的第 1 个#INTA 脉冲后,将最高优先权的 ISR 位置 1,并使 IRR 相应位复位。

5、8259 在第 2 个总线周期,将中断类型号送到数据总线上。

6、若 8259 工作在 AEOI,8259 在第 2 个#INTA 结束时,复位 ISR 相应位。

非 AEOI,则需要 CPU 在中断服务程序结束时,写入操作命令字 OCW2 中置位 EOI 位,8259 接收到名字字后将 ISR 的该位复位。

3.2.2 8259 工作方式

1、中断嵌套

不允许嵌套

全嵌套(普通嵌套,允许优先级高的中断请求)

特殊全嵌套(允许响应同级中断请求)P270 图 6-28

在多片 8259A 级联的情况下,主片通常设置为特殊完全嵌套方式,从片设置为普通嵌套方式。

当主片响应某一个从片的中断请求时,从片中的 IR7~IR0 的请求都是通过主片中的某个 IRi 请求引入的。

因此从片的 IR7~IR0 对于主片 IRi 来说,它们属于同级,只有主片工作于特殊完全嵌套方式时,从片才能实现完全嵌套。

2、中断优先方式

固定优先级(从高到低顺序为 IR0-IR7)

优先级自动循环方式(多个中断源优先级相等的场合)

普通自动循环:初始优先级为默认,从高到低顺序为 IR0-IR7。

特殊自动循环:初始的最低优先级是由 OCW2 确定

开始的时候,优先级从高到低是 IR0, IR1, IR2, …, IR7。某时刻,IR4 正在被 CPU 处

理。处理完成后,IR4 的优先级变为最低,IR5 的优先级变为最高,也就是说,新的优先

级序列从高到低是 IR5,IR6,IR7,IR0,IR1,IR2,IR3,IR4.

3、中断结束方式

自动中断结束 AEOI:适用于没有中断嵌套的情况,初始化命令字 ICW4 的 AEOI 位置 1 实现。

常规中断结束 EOI:全嵌套,操作命令字 OCW2 中的 EOI=1、SL=0、R=0。输出到 8259A 的偶地址端口(A0=0)

特殊中断结束 SEOI:非全嵌套 OCW2的 EOI=1、SL=1、R=0,L2、L1、L0 这三位指出了对ISR 中的哪一位进行清除。

4、屏蔽中断源方式

常规屏蔽:IMR 某位为“1”表示屏蔽对应的中断请求。

特殊屏蔽 SMM:8259A 工作在特殊屏蔽方式时,所有未被屏蔽的优先级中断请求(较高的

和较低的)均可在某个中断过程中被响应,即低优先级别的中断可以打断正在服务的高优先级中断。

在特殊屏蔽方式中,可在中断服务子程序中用中断屏蔽命令屏蔽当前正在处理的中断级,

同时可使其在 ISR 中的对应位清零,这样一来不仅屏蔽了当前正在处理的中断级,

而且也真正开放了较低级别的中断请求。在这种情况下,虽然 CPU 仍然继续执行较高级别的中断服务子程序,

但由于 ISR 中对应位已经清零,就如同没有响应该中断一样。所以,此时对于较低级别的中断请求,CPU 可以响应。

特殊屏蔽方式由于打乱了正常的全嵌套结构,低优先级中断可以打断正在服务的高优先级中断,

高优先级中断也可以打断正在服务的低优先级中断,此时,根据 ISR 的内容无法确定出刚刚所处理的中断。

只能用 SEOI 命令(命令中指定出要复位的中断级)来清除 ISR 中的指定位。

5、中断触发方式

8259A 中断请求输入端 IR7 ~IR0 的触发方式有电平触发和边沿触发两种,由初始化命令字 ICW1

中的 LTIM 位来设定。

(1 )电平触发

当 LTIM=1 时,为电平触发方式。当 8259A 检测到 IRi( i=0~7 )端有高电平时产生中断。

在这种触发方式中,要求触发电平必须保持到中断响应信号 #INTA 有效为止。在 CPU 响应中断后,

应及时撤销该请求信号,以防止 CPU 再次响应,出现重复中断现象。

(2 )边沿触发

当 LTIM=0 时,为边沿触发方式。当 8259A 检测到 IRi 端有由低到高的跳变(上升沿)信号

时产生中断。

5 、数据总线连接方式

8259A 的数据线与系统数据总线的连接有缓冲和非缓冲两种方式。

(1 )缓冲方式

如果 8259A 通过总线驱动器和系统数据总线连接,则应选择缓冲方式。此时 EN 为输出引脚。

在 8259A 输出中断类型号的时候,EN 输出一个低电平,用此信号作为总线驱动器的启动信

号。在缓冲方式下,由 ICW4 的 M/S 位来标识本 8259A 是主片还是从片。

(2 )非缓冲方式

如果 8259A 的数据线与系统数据总线直接相连,那么应选择非缓冲方式。此时 SP 为输入引

脚,用其电平高低来标识本 8259A 是主片(SP=1)还是从片(SP=0 )。在非缓冲方式下,ICW4 的

BUF =0 ,M/S 位无意义。

2.5.3 8259 编程

命令字端口地址 :

1、初始化命令字 ICW

在 8259A 可以正常工作之前,必须首先设置初始化命令字 ICW (Initialization Command Words)

寄存器组的内容。而在其工作过程中,则可以使用写入操作命令字 OCW (Operation Command Words)

寄存器组来随时设置和管理 8259A 的工作方式。

A0 线用于选择操作的寄存器。在 PC/AT 微机系统中,当 A0=0 时芯片的端口地址是 0x20( 主芯片)

和 0xA0( 从芯片);当 A0=1 时端口就是 0x21( 主芯片 ) 和 0xA1( 从芯片) 。

(1)初始化字 ICW1

收到 ICW1 后,8259 完成以下工作:清除 ISR、IMR;初始化优先级 IR0-IR7;普通屏蔽;非自动 EOI;

读出 IRR 。

(2 )中断向量码 ICW2

(3 )级联控制字 ICW3

主芯片的端口地址是 0x21,从芯片的端口地址是 0xA1。

对于主片,Si=1, 表示 IRi 接从片的 INT 引脚。主片 S7~S0 各比特位对应级联的从片。

对于从片,ID2~ID0 对应各从片的标识号,即连接到主片的中断级。

(4)ICW4 中断结束

2 、操作命令字 OCW

(1)中断屏蔽字 OCW1

(2)中断结束和优先级循环 OCW2

D2DlDO(L2LlLO) :当 D6=1 时,这三位才有效。此时有两个用处:第一是在发特殊结束中断

命令时,三位指出要清除 ISR 寄存器中的哪一位;第二是在特殊优先级循环方式中,三位指出循

环开始时初始优先级队列的最低优先级。

D4D3 : OCw2 的特征位,恒等于 0 ;

D5(EOI) :中断结束命令位。1=在中断结束后需发送中断结束命令,使 ISR 相应位清 0 ;0=

不需要发送中断结束命令,即为中断自动结束方式。

D6(SL) :低三位有效位。l= 低三位有效, 0= 低三位无效。

D7(R) :优先级循环方式位。1=设置优先级循环方式,O= 非循环方式。

(3)屏蔽方式和状态读出控制字 OCW3

查询方式:对同一地址读,读出本片 8259 的中断请求。

读 8259 状态

IRR 和 ISR:由 RR、RIS 两位确定,且和 OCW3 同一地址读取。

IMR: A0=1 (即主片 21H 或者从片 A1H )时,读到的就是 IMR 的内容。

第7次作业练习题

教材《微型计算机原理与接口技术》第4版

第3章

3, 4,  5, 6, 7, 9, 11, 12, 14

3.3 假设DS=212AH,CS=0200H,IP=1200H,BX=0500H,位移量DATA=40H,若[217A0H]=2300H,[217E0H]=0400H,[217E2H]=9000H。

试确定下列转移指令的转移地址。

(1)JMP BX    

解:CS=0200H  IP=0500H,转移目标的物理地址=02000H+0500H=02500H

(2)JMP WORD PTR [BX]

解:CS=0200H,IP=2300H  转移目标的物理地址=02000H+2300H=04300H

(3)JMP DWORD PTR[BX+DATA]

解:CS=9000H,IP=0400H  转移目标的物理地址=90000H+0400H=90400H

(1)JMP BX是把bx的数赋给ip,ip=bx,ip的基址是cs

为什么是02000H而非0200H:计算机的地址是20位的,一个字单元只能存16位,假设屋里地址是12345H,你存不进去呀,你就得把它拆成12340和5然后把12340缩小一位,这样你就把一个20位地址拆成两个16位,一个是1234H,一个是0005H,1234叫基址,0005叫变址

(2)bx的默认基址是ds,[bx]是寄存器间址,就是bx里的数加上ds的数,把结果作为一个地址,ip=ds:[bx]

(3)这是jmp转移指令,改变cs,ip的值。

dword定义双字节,这条语句的意思是cs=ds:[bx+data+2],ip=ds:[bx+data]。

bx,是16位,占一个字,即2个字节

8086cpu中的寄存器

1)4个16位段地址寄存器

8086对存储器采用分段管理,4个段寄存器分别用于存放4个当前段的起始地址,又称为段基址寄存器。
CS  (Code Segment) ——代码段寄存器
DS(Data Segment) ——数据段寄存器
SS(Stack Segment)—— 堆栈段寄存器
ES(Extra Segment)——扩展段寄存器








2)16位指令指针寄存器IP

IP始终指向当前代码段CS所要取出的下一条指令的地址。
每取出一个字节指令后,IP自动加1。
可以用转移指令、调用指令及中断和复位等改变IP值。


3)4个16位数据寄存器

AX、BX、CX、DX,可以分为8个8位寄存器使用:
AH、AL、BH、BL、CH、CL、DH、DL
数据寄存器用于存放操作数及中间结果
举个例子:
BX任意时刻的内容都=高八位BH,低八位BL(对于其他同理)







4)4个16位地址指针寄存器

地址指针寄存器用于存放操作数的地址,编程时通过修改寄存器的内容达到修改地址的目的
SP(Stack Pointer)——堆栈指针寄存器
BP(Base Pointer)——基址指针寄存器
SI(Sourse Index)——源变址寄存器
DI(Destination Index)——目的变址寄存器
详细使用说明:

名称作用
SP总是指示堆栈段中的栈顶位置,专门用于数据进栈和出栈的位置指示,只能与SS配对使用
BP指示堆栈段中一个数据区的基址位置,通常与SS配对使用
SI/DI与DS联用,用来确定数据段中某一存储单元的偏移地址。在串处理指令中SI和DI作为隐含的源变址和目的变址寄存器,此时SI和DS联用,DI和ES联用,分别达到在数据段和附加段中寻址的目的

3.4 试说明MOV BX,5[BX]与指令LEA BX,5[BX]的区别。

解:前者是数据传送类指令,表示将数据段中以(BX+5)为偏移地址的16位数据传送至BX寄存器。

后者是取偏移地址指令,执行的结果是BX=BX+5。

3.5 设堆栈指针SP的初值为2300H,AX=50ABH,BX=1234H。

执行指令PUSH AX后,SP=?。再执行PUSH BX及POP AX之后,SP=?,AX=?,BX=?。

解:(1)SP=22FEH (2)SP=22FEH ,AX=1234H, BX=1234H。

sp的值会指向栈顶元素就是减2

3.6 判断下列指令是否正确,若有错误,请指出并改正。

(1)MOV AH,CX

解:错,两操作数长度应相等,如MOV AX,CX

8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:

AH&AL=AX:累加寄存器,常用于运算;

BH&BL=BX:基址寄存器,常用于地址索引;

CH&CL=CX:计数寄存器,常用于计数;

DH&DL=DX:数据寄存器,常用于数据传递。

(2)MOV 33H,AL

解:错,立即数不能作为目的操作数,但可以为源操作数,如MOV AL,33H

(3)MOV AX,[SI][DI]

解:错,不允许两个间址寄存器同时为变址寄存器,可以为,MOV AX,[BX][SI]

(4)MOV [BX],[SI]

解:错,不允许两个操作数同时为存储器操作数,MOV BX,[SI]

(5)ADD BYTE PTR[BP],256

解:错,两个操作数长度不相等,ADD BYTE PTR[BP],10

PTR是强制转换运算符 BYTE PTR就是把【BP】中的内容转换成字节 然后+256 因为操作数的类型必需一制 所以出错 因为256不是字节

(6)MOV DATA[SI],ES:AX

解:错,寄存器不存在段的概念,MOV DATA[SI],AX

(7)JMP BYTE PTR[BX]

解:错,转移地址的字长至少16位,JMP WORD  PTR[BX]

jmp指令的操作数是地址,实际执行效果是修改IP的值。

由于BYTE PTR使得BX指向的数据为字节类型,而IP为字类型,数据类型不匹配,故该指令不正确。

指令的正确写法可以是jmp word PTR [BX],此时将BX指向的字类型数据赋给IP;

或者jmp dword ptr [BX],该指令把BX所指向的双字类型数据的高位字赋给CS,低位字赋给IP。

(8)OUT 230H,AX

解:错,端口地址超过8位二进制数的表达范围时,必须采用DX寄存器。

直接寻址:8 位端口地址,地址范围:0-0FFH。    如 IN    AL,30H

间接寻址:16 位端口地址,由 DX 指定端口地址。如 IN    AL,DX

(9)MOV DS,BP

解:正确

(10)MUL 39H

解:错,当指令显式提供一个操作数时,该操作数不能为立即数

3.7 已知AL=7BH,BL=38H,试问执行指令ADD AL,BL后,AF、CF、OF、PF、SF、ZF的值分别为多少?

解:AF=1、CF=0、OF=1、PF=0、SF=1、ZF=0

3.9 试判断下列程序执行后BX的内容。

MOV  CL,3

MOV  BX,0B7H

ROL   BX,1

ROR   BX,CL

解:ROL   BX,1       ;BX=016EH

ROR   BX,CL     ;BX=0C02DH。

所以BX=0C02DH。

3.11 分别指出以下两个程序段的功能

(1)MOV CX,  10

     LEA SI,  FIRST

     LEA DI,  SECOND

     STD

     REP  MOVSB

解:按减地址的方式将数据段FIRST开始地址的10个字节数据传送至附加段SECOND开始的存储单元中。

MOV  CX, 10  ;//这不用解释吧
CLD   ;//串地址正向增值,也就是类似i++操作
LEA SI , First ;//将数据段First的地址偏移量送SI
LEA DI , Secnd ;//将数据段Secnd的地址偏移量送DI
REP MOVSB  ;//REP 就是字符串的无条件重复前缀  
使REP后的指令无条件重复CX值指定的次数,
MOVSB  就是将源串一字节传送到目地串,并自动修改指针值
(MOVSB和REP重复使用,MOVSB先执行,REP后执行。
MOVSB第一次执行时完成的动作是:
先将(SECOND)&lt;—(FERST),
然后将SI&lt;—SI+1,DI&lt;—DI+1。
REP指令第一次执行时,将CX&lt;—CX—1,然后重复执行REP MOVSB。)。
所以它的功能是:
将DS:First单元开始的10个字节数据复制到ES:Second单元开始的内存中。

(2)CLD

     LEA DI,  [1200H]

     MOV CX,  0FF00H

     XOR AX,  AX

     REP  STOSW

解:按照增地址的方式将附加段中偏移地址为1200H单元开始的FF00H个字单元清0。

CLD  ;同上
LEA DI , [0404H]  ;//同上,差不多意思
MOV CX , 0080H  ;//同上
XOR  AX , AX ;//XOR  AX , AX 是异或指令,对应位相同则为0,不同为1,
所以相同的两个数相异或,结果为0,
同时XOR又属于逻辑运算指令,该类指令执行后标志位清0,也就是FLAG=0。(简单来说就是AX清零)
REP STOSW  ;//REP作用同上,STOSW是存入串指令的字操作,STOSB(字节)STOSW(字)。
所以它的功能是:将ES:0404H单元开始的80H个字(100H个字节)的内存填充0。

3.12 执行以下两条指令以后,标志寄存器FLAGS的6个状态位的分别为多少?

MOV  AX ,  84A0H

ADD  AX,   9460H

解:CF=1, ZF=0, SF=0, OF=1, PF=1, AF=0

3.14 已知AX=8060H,DX=03F8H,端口PORT1的地址是48H,内容为40H;PORT2的地址是84H,内容为85H。请指出下列指令执行后的结果。

(1)OUT  DX,  AL

解:将60H输出到03F8H的端口中。

(2)IN AL,  PORT1

解:AL=40H

(3)OUT DX,  AX

解:将8060H输出到03F8H的端口中。

(4)IN AX,  48H

解:由48H端口读入16位数据

(5)OUT PORT2,  AX

解:将8060H输出到84H端口中。

第8次作业练习题

(一)教材《微型计算机原理与接口技术》第4版习题

4.2 若程序的数据段定义如下,写出各指令语句独立执行后的结果。

DSEG    SEGMENT
DATA1  DB  10H,  20H,  30H
DATA2  DW  10 DUP(?)
STRING  DB  ‘123’
DSEG    ENDS
(1)MOV  AL,  DATA1
(2)MOV  BX,  OFFSET DATA2
(3)LEA  SI,  STRING
     MOV  DI,  WORD PTR  DATA1
     ADD  DI,  SI

解:(1)AL=10H

(2)BX=0003H

(3)SI=0017H   DI=2010H  DI=2027H

Data1 从偏移 0 开始 占 3字节
Data2 从偏移 3 开始 占 10 个字 20字节
String 从偏移 23=17h 开始,占3字节

所以 BX=0003
LEA SI,String 之后 SI为String的偏移地址 所以 SI=0017h

4.6  假设数据项定义如下:

DATA1  DB  ‘HELLO!GOOD MORNING!’
DATA2  DB  20 DUP(?)

用串操作指令编写程序段,使其分别完成以下功能:

(1)从左到右将DATA1中的字符串送到DATA2中。

(2)传送完毕后,比较DATA1和DATA2中的内容是否相同。

(3)把DATA1中的第3和第4字节装入AX。

(4)将AX中的内容存入DATA2+5开始的字节单元中。

解:
 

(1) MOV  AX,  SEG  DATA1
      MOV  DS,  AX
      MOV  AX,  SEG  DATA2
      MOV  ES,   AX
      LEA   SI,   DATA1
      LEA   DI,   DATA2
      MOV  CX,   20
      CLD
      REP   MOVSB


(2) LEA   SI,  DATA1
      LEA   DI,  DATA2
      MOV  CX,  20
      CLD
      REPZ  CMPSB
(3) LEA   SI,   DATA1
      ADD   SI,   2
      LODSW
(4) LEA   DI,   DATA2
      ADD  DI,   5
      MOV  CX,  7
      CLD
      REP  STOSW

4.7  执行下列指令后,AX寄存器的内容是多少?

TABLE  DW  10,  20,  30,  40,  50
ENTRY  DW  3

MOV  BX,  OFFSET  TABLE
ADD  BX,  ENTRY
MOV  AX,  [BX]

解:因为TABLE的内容为 0AH  00H  14H  00H  1EH  00H  28H  00H  32H  00H

所以,AX=1E00H

(二)程序设计

1、请完成将中断类型码为10H的某中断服务子程序MYINT的中断向量放入向量表的程序段。

参考答案:

MOV AX,0000H
MOV DS,AX
MOV SI,10H*4
MOV BX,OFFSET MYINT
MOV [SI],BX
MOV BX,SEG MYINT 
MOV [SI+2],BX

2、编程实现将下列MEM1单元中的10个无符号数按从大到小的顺序进行重新排列。

DSEG   SEGMENT
   MEM1   DW  1000H,1001H,1002H,1007H,1008H,1009H,1003H,1004H,1005H,1006H
DSEG   ENDS

补充的代码段部分: 

CSEG   SEGMENT
        ASSUME  CS:CSEG , DS:DSEG

START:  MOV  AX,  DSEG
         MOV  DS,  AX
         LEA   DI,  MEM1
         MOV  BL,  9
;外循环
NEXT1:  MOV  SI,  DI
         MOV  CL,  BL
;内循环
NEXT2:  MOV  AX,  [SI]
         ADD  SI,  2
         CMP  AX,  [SI]   ;两数比较
         JNC   NEXT3   ;若大于则不交换
         MOV  DX,  [SI]
         MOV  [SI-2],  DX
         MOV  [SI],  AX  ;交换两数

NEXT3:  DEC   CL
         JNZ    NEXT2
         DEC   BL
         JNZ    NEXT1

         MOV   AH,  4CH
         INT    21H
CSEG    ENDS
         END   START

  • 14
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值