第一章导论
1.3
冯诺依曼体系结构
(1)以二进制形式表示指令和数据
(2)程序和数据事先放在存储器中(预存储)
(3)由运算器、控制器、输入设备和输出设备五大部件组成
字长、主频、架构
地址总线AB
数据总线DB
控制总线CB
运算器ALU
控制器CU
指令寄存器IR
指令译码器ID
可编程逻辑阵列PLA
程序计数器PC 存放下一条要执行指令所在的存储单元的地址
地址寄存器AR
数据缓冲寄存器DR
累加器A
标志寄存器FLAGS(程序状态字PSW)
寄存器阵列RA
存储器
位Bit、字节Byte、字Word
内存容量
K----2^10 M----2^20 G---2^30 T------2^40
第二章 数制和编码
2.2
原码
反码
正数的反码与原码相同
负数的反码是在原码的基础上,符号位不变(仍为1),数值位按位取反
[-0]反=(2^8-1)-0 =1111 1111B
[-127]反=(2^8-1)-127=1000 0000B
补码
正数的补码与其原码、反码相同
负数的补码是在原码基础上,符号位不变,数值位按位取反,末位加1(反码+1)
[+48]补=0011 0000B=30H 字长扩展 =0000 0000 0011 0000B=0030H
[-48]补=1101 0000B=0D0H =1111 1111 1101 0000B=0FFD0H
[-128]补=2^8-128(用定义算)=1000 0000B=80H =0FF80H
溢出
符号位进位CF、数值部分最高位(次高位)进位DF
OF=CF⊕DF
同时有进位或者同时没有进位,结果没有溢出
负+负 正+正 可能溢出
正-正 正+负 不溢出
第三章 8086微处理器
3.1
3.2
主频是指芯片所使用的主时钟频率,直接影响计算机的运行速度
8086有20根地址线,直接对2^20=1M个存储单元进行访问 00000H~FFFFFH
总线接口单元BIU-----------访问内存
执行单元EU----------访问I/O
存储器分段结构 段地址:段内偏移地址(有效地址)
AX累加器
BX基址寄存器 BX用来存放操作数在内存中数据段内的偏移地址,BP用来存放操作室在堆栈段内的偏移地址
CX计数器 在设计循环程序时放循环此时
DX数据寄存器 在寄存器间接寻址的I/O指令中存放I/O端口地址,在双字长乘法运算时,DX与AX一起存放一个双字长操作数,其中DX存放高16位
SP堆栈指针寄存器
BP基指寄存器 堆栈段内的偏移地址
SI源变址寄存器
DI目的变址寄存器
IP程序指针寄存器,用户不能直接访问IP
FLAGS标志寄存器
状态标志位
CF进位标志位
PF奇偶标志位,低8位含有偶数个1时,PF为1
AF辅助进位标志位,低字节的低4位向高4位有进位或借位时,AF=1
ZF零标志位,结果为0,ZF为1
SF符号标志位,最高位为1,SF=1
OF溢出标志位,溢出,OF=1
控制标志位
TF跟踪(陷阱)标志位,TF置1,处于单步工作方式
IF中断允许标志位,用来控制可屏蔽中断的控制标志位,用STI指令将IF置1,表示允许CPU接受外部从INTR引脚上发来的可屏蔽中断请求信号;用CLI指令将IF清0,禁止CPU接受可屏蔽中断请求信号。IF的状态对非屏蔽中断及内部中断没有影响
DF方向标志位,用STD将DF置1,串操作按减地址方式进行(每操作一次地址自动递减);若用CLD将DF清0,串操作按递增地址方式进行
8086引脚
地址/数据分时复用引脚AD15~AD0,传送地址时单向输出,传送数据时双向输入或输出
地址/状态时分复用引脚A19/S6~A16/S3,当访问存储器时,A19~A16,与AD15~AD0一起构成访问存储器的20位物理地址;
控制引脚
NMI非屏蔽中断请求信号
INTR可屏蔽中断请求信号,CPU在每个指令周期的最后一个时钟周期检测该信号是否有效,若此信号有效,表明有外设提出了中断请求,这时若IF=1,则当前指令执行完立即响应中断
M/IO*
物理地址20位A19~A16、D15~D0
逻辑地址 段地址:偏移地址
端口地址
8086系统可访问的8位I/O端口有65536(64K)个
基本的读周期由4个时钟周期组成
第四章 8086指令系统
4.2
4.3
寻址方式
数据寻址方式
-
立即数寻址方式
MOV BL,80H MOV AX,1090H
-
寄存器寻址方式
(AX,BX,CX,DX,SI,DI,SP,BP
MOV CL,DL
MOV AX,BX
-
存储器寻址方式
直接寻址
MOV AL,[1064H]
MOV AL,value (用符号地址来表示偏移量)
寄存器间接寻址 BX、SI、DI
MOV ES:[DI],AX
寄存器相对寻址 BX、SI、DI、BP
MOV [SI+10H],AX
MOV CX,[BX+COUNT]
MOV AL,TABLE[BP]
基址变址寻址 BX、BP SI、DI
MOV [BX+DI],AX
MOV AH,[BP][SI]
基址变址相对寻址
MOV AH,[BX+DI+1234H]
MOV AX,COUNT[BX][SI]
-
I/O端口寻址
端口直接寻址方式
IN AL,21H
端口间接寻址方式
MOV DX,120H OUT DX,AX
>FFH,必须先通过DX
地址寻址方式
(CS):(IP)
- 段内转移
NEAR:更新(IP)
- 段内直接
JMP LABEL 无条件转移(近转移)
JZ getzero 条件转移(短转移)
JMP NEAR PTR PROGIA -32768~+32767
JMP SHORT QUEST -128~+127
2.段内间接
程序转移地址存放在寄存器或存储单元中
JMP BX
JMP WORD PTR [BP+TABLE]
- 段外转移
FAR: (CS):(IP)
- 段间直接
JMP LABLE_NAME
JMP FAR PTR NEXTROUTINT
2.段间间接
JMP VAR_DOUBLEWORD (已定义的32位的存储器变量)
JMP DWORE PTR[BP][DI]
8086指令系统
-
数据传送类
MOV dst,src
reg/mem<------data
reg/mem<------>reg
reg/mem<------>seg
CS不能做目的操作数
不能meg<----->meg、seg<----->seg、seg<-----data
-
堆栈操作指令
push src (SP)<-----(SP)-2 ((SP)+1:(SP))<-----(src)
pop dst (SP)<-----(SP)+2 (dst)<-----((SP)+1:(SP))
src: reg、seg、mem
dst不能为CS
dst、src不能是立即数
-
数据交换指令
XCHG dst,src (dst)<---->(src)
reg<------>reg/mem 段寄存器的内容不能交换
-
输入/输出指令
IN acc,port acc<---port
IN acc,DX
OUT port,acc
OUT DX,acc
-
字节装换指令
XLAT
XLAT src_table AL<-----(BX)+(AL)
MOV BX,OFFSET Hex_tabel (BX)<---表首址 offset取出偏移地址
MOV AL,0AH (AL)<----序号
XLAT Hex_table
-
地址传送指令
LEA reg16,mem
LEA BX,value 等同于MOV BX,OFFSET value
mov bx,value这是错误的
地址指针装入DS指令LDS
LDS SI,[0010H]
-
标志传送指令
LAHF load AH from flags
SAHF store AH into flags
PUSHF、POPF
-
算术运算指令
加法ADD、ADC
例4.3计算三个字节十六进制之和:3BH+74H+2CH
MOV AL,BUF ADD AL,BUF+1 ADD AL,BUF+2 MOV AUM,AL HLT
例4.4计算两个多字节十六进制数之和:3B74AC0F8H+20D59E36C1H=?
被加数和加数均有5个字节,利用循环
MOV CX,5 MOV SI,0 CLC LOOPER: MOV AL,DATA2[SI] ADC DATA1[SI],AL INC SI DEC CX JNZ LOOPER HLT
减法SUB、SBB
例4.5内存数据段存放了200个带符号的字节数,首地址为TAB1,要求将各数取绝对值后存入已TAB2为首地址的内存区
LEA SI,TAB1 LEA DI,TAB2 MOV CX,200 CHECK: MOV AL,[SI] OR AL,AL JNZ NEXT NEG AL NEXT: MOV [DI],AL INC SI INC DI DEC CX JNZ CHECK HLT
例4.6在数据段从MYDATA开始的存储单元中分别存放两个8位无符号数,试比较它们的大小,并将大者传送到MAX单元
LEA BX,MYDATA MOV AL,[BX] INC BX CMP AL,[BX] INC DONE MOV AL,[BX] DONE: MOV MAX,AL HLT
乘法MUL、IMUL
除法DIV、IDIV
符号扩展指令
字节扩展CBW
字扩展CWD
十进制调整指令AAA、DAA
例4.7计算4609+3875
LEA SI,STRING1 LEA BX,STRING2 LEA DI,SUN MOV CX,4 CLC NEXT: MOV AL,[SI] ADC AL,[BX] AAA MOV [DI],AL INC SI INC BX INC DI DEC CX JNZ NEXT HLT
-
位操作指令
逻辑运算(影响SF、ZF、PF,将CF置0)
AND
OR
NOT
XOR
TEST
清零进位标志位 ADD AX,AX OR AL.AL
清零操作数 XOR AX,AX
某几位取反 XOR 和1异或 不变的和0异或
清零/置位某几位 与0AND 与1OR
移位指令
SHL、SAL 最高位移入CF,最低位补0
SHR 最低位移入CF,最高位补0 SAR 最高位不变
移位大于1,只能用CL表示
循环移位(只影响CF、OF)
ROL
ROR
RCL
RCR
串操作指令
总是用SI寄存器寻址操作数,用DI寄存器寻址目的操作数
每一次操作以后修改地址指针,是增量还是减量取决于方向标志DF
有的串操作指令可加重复前缀
REP CX不为0重复
REPE/PRPZ 相等/ZF为零且CX不为0
REPNE/REPNZ 不相等/不为零且CX不为零
串传送MOVS
传送内容 ES:DI<------DS:SI
改指针 SI、DI
判断
例4.11将数据段中首地址为BUFFER1的200个字节传送到附加数据段首地址为BUFFER2的内存区
LEA SI,BUFFER1 LEA DI,BUFFER2 MOV CX,200 CLD REP MOVSB HLT
串装入
串送存
4.13将字符“#”装入以AREA为首址的100个字节中
LEA DI,AREA MOV AX,'##' MOV CX,50 CLD REP STOSW HLT
例4.14一个数据块由大写或小写的英文字母、数字和各种其他符号组成,其结束符是回车符CR(ASCII码为0DH),数据块的首地址为BLOCK1.将数据块传送到BLOCK2为首地址的内存区,并将其中所用的英文字母(a~z)转换成相应的大写字母(A~Z),其余不变
小写字母61H~7BH
LEA SI,BLOCK1 LEA DI,BLOCK2 CLD NEXT: LODSB CMP AL.0DH ;是否是回车符 JZ DONE CMP AL,61H ;是都小于'a' JC OK CMP AL,7BH ;是否大于'z' JNC OK ;是,跳转Ok SUB AL,20H ;否则,AL减20 OK: STOSB JMP NEXT DONE: HLT
串比较CMPS
例4.15比较两个字符串,找出其中第一个不相等字符的地址。如果两个字符全部相同,则转到ALMATCH进行处理。这两个字符串长度均为20,首地址分别为STRING1何STRING2
LEA SI,STRING1 LEA DI,STRING2 MOV CX,20 CLD REPE CMPCB JZ ALLMATCH DEC SI DEC SI HLT ALLMATCH: MOV SI,0 MOV DI,0 HLT
退出循环(1)CX=0,ZF=1 (2)CX!=0,ZF=0
串扫描SCAS
例4.16在包含100个字符的字符串中寻找第一个回车符CR(ASCII码为0DH),找到后将其地址保留在(ES:DI)中,并在屏幕中显示字符“Y”。如果字符串中没有回车符,则在屏幕上显示字符“N”。该字符串的首地址为STRING
LEA DI,STRING MOV AL,0DH MOV CX,100 CLD REPNE SCASB JZ MATCH MOV DL,'N' YMP DSPY MATCH: DEC DI MOV DL,'Y' DSPY: MOV AH,02H INT 21H HLT
指令重复前缀
-
控制转移指令
无条件转移JMP
条件转移JCC
JB=JC
JA=JNC
无符号 | 有符号 |
A大于、B小于、E等于 | G大于、L小于、E等于 |
JB(JNAE) | JL(JNGE) |
JNB(JAE) | JLE(JNG) |
JBE(JNA) | JNL(JGE) |
JNBE(JA) | JNLE(JG) |
例4.18在以DATA1为首地址的内存数据段内,存放了200个16位带符号数,试将其中最大和最小的带符号数找出来,分别存放到以MAX和MIN为首的内存单元中
(为了寻找最大和最小的元素,可先取出数据块中的一个数据作为标准暂且将它同时存放到MAX和MIN单元中,然后将数据块中的其他数据逐个分别与MAX和MIN中的数据比较,大于MAX,取代原来MAX中的内容,MIN也一样)
LEA SI,DATA1 MOV CX,200 CLD LODSW MOV MAX,AX MOV MIN,AX DEC CX NEXT: LODSW CMP AX,MAX JG GREATER CMP AX,MIN JL LESS JMP GOON GREATER: MOV MAX,AX JMP GOON LESS: MOV MIN,AX GOON: LOOP NEXT HLT
循环控制指令LOOP
将CX的内容减1,如果结果不等于0,则跳转到指令中指令的短标号处
LOOPZ/LOOPE
将CX的内容减1,如果结果不等于0且零标志ZF=1,则跳转到指令中指令的短标号处
LOOPNE/LOOPNZ
将CX的内容减1,如果结果不等于0且零标志ZF=0,则跳转到指令中指令的短标号处
过程调用与返回指令
CALL
将指令指针IP压入堆栈,然后将相对位移量disp加到IP上
- IP压栈(保存下一条指令的地址)
- 更新IP
RET
第五章 汇编语言程序设计
5
伪指令
DB、DW
超过两个字符的字符串只能用DB伪指令定义
?
DUP
EQU
COUNT=10
DATA SEGMENT ARRY1 DB 10,21,32,65 ARRY3 DB 9 DUP(?) DATA ENDS STACK SEGMENT STACK DW 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: ....... CODE ENDS END START
子程序
PROC
........
RET
........
ENDP
CALL指令
子程序返回
子程序封装
保护子程序(入栈保护、保护现场)
主程序的公用寄存器
参数传递(寄存器、地址表、堆栈)
宏
MACRO
.....
ENDM
- 子程序的入口参数送相应的寄存器
- 子程序编号送AH
- 发出中断请求:INT 21H
例5.5利用DOS系统功能调用在屏幕上显示一行提示信息,然后接受用户从键盘输入的信息并将其存入内存缓冲区
DATA SEGMENT FARS DB 100 ;定义输入缓冲区 DB ? DB 100 DUP(?) MESG DB 'WHAT IS YOUR NAME ?$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX DISP: MOV DX,OFFSET MESG MOV AH,9 INT 21H MOV AH,10 INT 21H MOV AH,4CH INT 21H CODE ENDS END BEGIN
例5.6编写程序实现将键入的4位十进制数(如5,,则键入0005)以压缩BCD数形式存入字变量SW中
DATA SEGMENT BUF DB 5,0,5 DUP(?) SW DW ? DATA ENDS ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF MOV AH,10 INT 21H MOV AX,WORD PTR BUF+4 AND AX,0F0FH MOV CL,4 SHL AL,CL OR AH,AH MOV BYTE PTR SW,AL MOV AX,WORD PTR BUF+2 AND AX,0F0FH SHL AL,CL OR AL,AH MOV BYTE PTR SW+1,AL MOV AH,4CH INT 21H CODE ENDS END START
第六章 半导体存储器
6.3
存储容量-----字数*位数
- 位扩展
扩数据线,一次读写的位数多
- 字扩展
扩地址线,容量扩展
- 字位扩展
先位扩,后字扩
用 2114(1K* 4)RAM 芯片构成 4K* 8 存储器 8片1K*4bit-------->1K*8bit--------->4K*8bit注意3-8译码器的连线不同
第七章 输入/输出与中断
7.3
数据信息、状态信息、控制信息
8086I/O端口与内存单元独立编制
指令
访问I/O In al,30h
访问内存 mov al,[30h]
接口
M/IO*
- 无条件传输
硬件简单
- 查询传输
三态门 不能处理实时性的
- 中断
响应速度快,实时性高
- DMA
高速、大量 硬盘---->内存
中断
中断的定义
在CPU执行程序的过程中,出现了某种紧急情况或异常的事件(中断请求),CPU需暂停正在执行的程序,转去处理该事件(执行中断服务程序),并在处理完毕后返回断点处继续执行被暂停的程序。断点处是指返回主程序时执行的第一条指令的地址
中断源分为软件中断和硬件中断
优先级:软件中断、NMI、INTR、单步中断
中断处理过程:
- 中断请求
- 中断响应
保护断点
更新程序指针为中断服务程序的入口地址
- 保护断点
(硬件自动完成)
关中断、将标志寄存器内容入栈保存以及将CS和IP内容入栈保存
中断向量更新给CS、IP
- 中断处理
- 中断返回
中断优先级确定:软件查询、硬件排队电路、专用中断控制芯片
中断嵌套
中断向量表
中断向量,中断服务程序的入口地址
中断类型号0~255
256种中断,占256*4=1024个单元
每个中断向量栈4个存储单元
低地址的两个单元---------中断服务程序入口地址的偏移量IP
高地址的两个单元---------中断服务程序入口地址的段地址CS
8086的中断向量表位于内存的前1KB,地址范围为00000H~003FFH
每个中断服务程序入口地址在中断向量表中的位置由“中断类型号*4”计算
IP<--------(4n,4n+1)
CS<-------(4n+2,4n+3)
CPU转入中断类型号为n的中断服务程序
第八章 可编程接口芯片及应用
8
8283 计数/定时
送控制字
写初值
计数初值 n=Fclk/F=T/Tclk=T*Fclk
CLK时钟频率Fclk 周期Tclk
OUT输出波形频率F 周期T
例如 : 要求输出信号周期为 1s, 接入计数器通道 CLK 引脚 的时钟频率为1KHz, 则 CR 应初始化为: 1000
例8.2使用8253计数器2产生频率为40KHz的方波,设8253的端口地址为0040H~0043H,已知是时钟端CLK输入信号的频率为2MHz
2000000/40000=50
50BCD=0101 0000B=50H
MOV AL,10010111B MOV DX,0043H OUT DX,AL MOV AL,50H MOV DX,0042H OUT DX,AL
实验
如果给初值寄存器送初值为送 0 ,则计数多少次?如何读出当前计数值?给计数通道的 CR 送初值 0 ,可以实现最大计数:二进制下计数 65536十进制下计数 10000原因:采用减 1 计数器
5255
并行输入(缓冲)/输出(锁存器)
实验