像初中数学一样的微机课
Lesson 1 微型计算机原理
Ⅰ.各种进制
Binary(2) Octal(O) Decimal(D) Hexadecimal(H)
Ⅱ.二进制与十进制之间的转化
Lesson 2 微处理结构
Ⅰ.计算机中多字节数据的存储
小端存储:高高低低(高地址存高字节)
Ⅱ.算术运算与逻辑运算
Ⅲ.补码的运算
原码:首位为符号位 其余位为绝对值
反码:正数=原码 负数=符号位(1)+按位取反
补码:正数=原码 反码+1
n位补码的表数范围:
(1000 0000 - 0111 1111)
为什么最小的数是1000 0000?
按照道理来说 +0 和 -0在补码表示法中都为0000 0000,而1000 0000在补码表示中什么也不代表,由于在无符号数中1000 0000代表128,所以将1000 0000表示为-128,因为符号位为1。
Lesson 3
Ⅰ.8086内部寄存器
8086内部寄存器有:
- 8个通用寄存器
- 4个段寄存器
- 1个指令指针寄存器
- 1个标志寄存器
Ⅱ.通用寄存器
CPU在完成数据加工时临时存放数据(执行单元)
前四个数据寄存器可以分成高8位和低8位两个独立的寄存器 对其中某8位的操作并不影响另外对应8位的数据
AX BX CX DX(16位)
(AH AL BH BL CH CL DH DL)
SI DI BP SP (8位)
Ⅲ.段寄存器
DS 数据段寄存器(Data Segment)
CS 代码段寄存器(Code Segment)
ES 附加段寄存器(Extra Segment)
SS 堆栈段寄存器(Stack Segment)
用于CPU在计算20位的物理地址的时候,其中一部分的数据来源
这些段寄存器的内容与有效的地址一起,用于确定内存的物理地址。通常用DS确定数据段的基地址,CS确定代码段的基地址,ES确定附加段的基地址,SS确定堆栈段的基地址。
Ⅳ.指令指针IP
- 用于指示CPU下一条指令的偏移地址(总线接口)
- IP与CS联用,确定下一条指令的物理地址,控制指令序列的执行流程
- IP寄存器是一个专用的寄存器
Ⅴ.标志寄存器FLAG
标志寄存器反应指令的结果或者控制指令的形式
标志的分类
状态标志:用来记录程序运行的状态信息,许多指令的执行都将相应地设置它。
- CF(Carry Flag):进位标志 CF=1有进位 CF=0无进位
- ZF(Zero Flag):零标志 ZF=1表示为零
- SF(Sign Flag):符号标志 SF=1表示运算结果为负数
- PF(Parity Flag):奇偶标志 PF=1表示低8位有偶数个1
- OF(Overflow Flag):溢出标志 OF=1 表示有符号数运算产生溢出 怎么判断两个数相加是否溢出:最高位进位⊕次高位进位=1则溢出
- AF(Auxiliary Flag):辅助进位标志 AF=1表示低4位有进位或者借位
控制标志:可由程序根据需要用指令设置,用于控制处理器执行指令的方式。
- DF(Direction Flag):方向标志 DF=1操作地址递减 DF=1表示操作地址递增
- IF(Interrupt Flag):中断允许标志 IF=1表示接受外部中断
- TF(Trap Flag):跟踪标志 TF=1表示单步运行 TF=0表示正常运行
总结:状态标志的值由指令执行后的结果决定,控制标志的值由特定指令设置或者清除。
进位标志CF 和 溢出标志OF 的应用场合?
进位标志只使用在无符号数运算内,溢出标志只使用在有符号数运算内。
Lesson 4
Ⅰ.数据在内存储器中的存储情况
- 字节:8位
- 字:16位
- 双字:32位
Ⅱ.8086CPU
- 20根地址线,最大可寻址空间为
MB,从00000H~FFFFFH
- 16根数据线(因为该CPU的机器字长为16位)
从逻辑地址转化到物理地址的公式:PA(Physical Address) = SA(Segment Address)×16+EA(Extra Address)
物理地址=段地址×16+段内偏移 (16表示每段的大小为16位)
1.为什么每段最大限制为64KB?
因为该CPU里只有16根数据线,所以每次访问数据的时候,最多访问16位,也就是
KB
2.为什么只能通过逻辑地址向物理地址转换?
因为一个物理地址可以对映多个逻辑地址。
解:设物理地址为P,段地址为S,段内偏移为E。
若逻辑地址已知,即S,E均为已知数,则可以求出P。
若物理地址已知,即P为已知数,此时只能得出一个一次函数:XXX = 16*S + E,逻辑地址不唯一。
Ⅲ.补充内容
最小模式和最大模式:
- 最小模式:在系统中只有一个微处理器。
- 最大模式:在系统中有两个或两个以上的微处理器(主处理器,协处理器)
周期:
- 指令周期:执行一条指令所需要的时间
- 总线周期:CPU与外部交换一次信息(通过总线)
- 时钟周期:时钟脉冲的重复周期
特殊地,8086CPU的总线周期至少由4个时钟周期组成,分别以T1,T2,T3,T4表示,一个总线周期完成一次数据传输,在T1期间由CPU输出地址,在T2,T3,T4期间传输数据。
Ⅳ.8086的引脚
- 地址总线
- 数据总线
- 控制总线
- 其他(时钟与电源)

~
地址/数据复用引脚
~
地址/状态总线复用
高8位数据是否有效(低电频有效),=0时有效,=1时无效。用于在取数据时,确定所取数据的位数(8位、16位)。
读信号(低电频有效),=0时表示正在读存储器/IO操作。
写信号(低电频有效),=0时表示正在CPU正在对存储器或I/O端口进行写操作。
地址锁存允许信号,在总线周期T1时钟周期时产生正脉冲,利用其下降沿将地址信息存入地址锁存器,目的是将地址信息保存起来,然后再传输数据信息,达到地址信息与数据信息分时复用传送目的。
在最小方式工作(即在系统中只有一个微处理器)的情况下,=1表示CPU和存储器进行数据传输;=0表示CPU和I/O设备进行数据传输;在DMA方式下,M/IO为高阻态;
1.为什么数据总线为双向,地址总线只输出?
因为通过内存储器(或通过I/O设备)之间交换数据是双向的。而寻求某个内存单元的地址信号只能由CPU发出,所以为输出(单向)。
2.三态
高电频,低电频,高阻态(相当于连接为断开的情况,即等于没有连接在总线上,不影响其他器件的工作)
a1, a2为无符号数
if(a1 > b1)a1 = a1*2;
else if(a1 < b1)a1高两位;
elsea1按位取反;
AX=0; CX=100;
while(CX >= 1)
{AX = AX + CX;CX--;
}
...
AX = 0;
CX = 100;
do
{AX = AX + CX;CX--;
}while(CX >=1);
MOV AX, 0;MOV CX 100;
A1: ADD AX CX;DEC CX;CMP AX, 1;JAE A1;...
Lesson 6 汇编语言程序设计
Ⅰ.完整段结构
STACK SEGMENT;定义堆栈DW 256 DUP(?)
STACK ENDSDATA SEGMENTAA DB 12, 25, 36
DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA, SS:STACK;START: .........CODE ENDSEND START
Ⅱ.常量、标识符、标号和表达式
一、常量
1.数字常量:直接用数字表示的常量
- 二进制 Binary
- 十进制 Decimal
- 十六进制 Hexadecimal (字母打头必须前面补0,否则将出现汇编语法错误)
2.字符串常量:包含在单引号内的一个或两个ASCII字符,它所代表的数值就是该字符的ASCII码
- ‘0’ : 30H
- ‘A’ : 41H
- 'a' : 61H
3.符号常量:用标识符(常量名)表示的常量,它具有一个设定的数值从而被引用
二、标识符
有特定意义的字符序列,标识符可用作符号常量、名字、变量和标号等
- 命名规则
- 0 ≤ 31个ASCII码字符
- 由[ A-Z ]、[ a-z ]、[ 0-9 ] 、[ ? ]、[ @ ]、[ $ ] 及 [ _ ] 构成,其中除数字以外,所有规定的字符都可作为标识符的第一个字符
- ? 不能单独作为标识符
- 无独立的保留字及运算符
三、标号
指令性语句存放地址的符号表示,常用语指令的转移和子程序的调用
四、表达式与运算符
由操作数(常量、变量、标号)和运算符构成

1.逻辑运算符:AND、OR、NOT、XOR
AND AL, 86H AND 0FH ;其中第一个AND是指令、第二个AND是逻辑运算符
- 逻辑运算符只能对常数(或相当等于常数)进行运算
- CPU不执行任何操作,在汇编之后,在目标程序中只是一个常数
2.运算符:EQ(equal)、NE(not equal)、LT(less than)、LE(less equal)、GT(greater than)、GE(greater equal)
Ⅲ. 指示性语句
一、程序结束伪指令END
格式:END 标号 ; 标号为程序中第一条指令性语句标号
二、段定义伪指令
1.段定义伪指令
段名 SEGMENT [定位方式][组合方式][‘类别名’]…
段名 ENDS
- 定义数据段、附加段和堆栈段时,处于SEGMENT/ENDS伪指令中间的语句,只能包括伪指令语句,不能包括指令语句。
2.段寄存器说明伪指令
ASSUME 段寄存器:段名1, 段寄存器:段名2...
- 在代码段告诉汇编程序CS、DS、ES、SS应具有的符号段基址,但是段寄存器(CS除外)还必须用传送指令赋值
MOV AX, DATA
MOV DS, AX
; 为什么不能直接MOV DS DATA?
; 因为这里的DATA是立即数,立即数不能直接送给段寄存器
三、数据定义伪指令
- 指令
| DB(Define byte) | (8位)一个字节 |
| DW(Define word) | (16位)两个字节 |
| DD(Define double word) | (32位)四个字节 |
- 参数
DB 10 DUP(12H)
; 复制次数 DUP(填充内容)
四、符号定义伪指令
- EQU:符号常量 EQU 表达式;
- PURGE: PURGE 名字;
(在赋予新值前需要使用PURGE撤销)
- “=”:符号常量 = 表达式
(其功能与EQU相似,只是无须使用PURGE命令而已)
五、名字和变量
1.名字
- 在源程序的段定义语句中命名取定,段名可以作为段基址使用
ARRAY DB 10H,5AH,0C7H,98H,’ABCD’
COUNT EQU $-ARRAY; 返回ARRAY长度,其中$表示该行的偏移地址
2.变量
- 求段基址:MOV AX,SEG AA;(其中SEG AA为立即寻址,是AA的段地址)
- 求偏移地址:MOV AX,OFFSET BB;(其中OFFSET BB为立即寻址,是BB的偏移地址)
- 求符号名的类型值:MOV AL,TYPE CC;(其中TYPE CC为立即寻址,是CC类型的字节数)
- 求长度属性:BUF DW N DUP(?);LENGTH BUF = N ;说明:只有当数据用赋值符DUP定义时,LENGTH才等于数组的元素个数,否则LENGTH等于1
- 规模属性:SIZE 符号名;返回变量的总字节数:SIZE=LENGTH*TYPE
3.属性运算符
- 类型指定运算符PTR:INC BYTE PTR [2000H];按PTR前面指定的类型去寻址
Ⅳ.DOS系统功能调用
- 传送入口参数到指定寄存器
- 调用子功能的功能编号放在AH寄存器中
- 执行 INT 21H指令
调用结束后返回相应结果,并由CF标志表示调用的是否成功,当出现调用错误时CF=1,AX返回出错编号
1.键盘单字符输入(1号)
MOV AH, 1
INT 21H
- 功能:等待从键盘输入一个字符
- 返回:AL = (输入的ASCII码的值)
2.输出单字符(2号)
MOV DL, 'A'
MOV AH, 02
INT 21H
- 功能:将DL里的字符从屏幕上输出
3.输出字符串(9号)
MOV DX, OFFSET BUF
MOV AH, 09
INT 21H
- 功能:BUF中以 '$' 为结束标志的字符串显示在屏幕上,当无 '$' 时会出现乱码。解决方案:初始化数组时DUP('$')
4.键盘输入字符串(10号)
MOV DX, OFFSET BUF; DS: DX为键盘缓冲区
MOV AH, OAH
INT 21H
- 功能:等待从键盘输入一串字符,回车结束,字符串存入键盘缓冲区
- 键盘缓冲区定义:
BUF DB 81 ; 缓冲区的大小DB ? ; 实际输入的字符大小DB 80 DUP(?) ; 字符串存放区
5.返回操作系统(4CH)
MOV AH, 4CH
INT 21H
- 功能:将控制权交给操作系统
本章习题:
1.试编制一程序,求出下列公式中的Z值,并存放在RESULT单元中。其中,X、Y的值分别存放在VARX、VARY单元中。
Z=[(X+Y)×8-X]/2
DATAS SEGMENT;此处输入数据段代码 VARX DB 4VARY DB 4RESULT DB ? DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码 STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV AL, VARXADD AL, VARY MOV CL, 3 ; 移位>1需要先放入CLSHL AL, CL SUB AL, VARX SAR AL, 1MOV RESULT, ALMOV AH, 4CHINT 21H CODES ENDSEND START2.内存中自TABLESQ开始的10个单元连续存放着自然数0到9的平方值,任给一数x(0 <= x <= 9)在XX单元中,查表求出X的平方值,将结果存入YY单元中(利用DOS的1号功能调用)。
DATAS SEGMENT;此处输入数据段代码 TABLESQ DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81XX DB ?YY DB ? DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码 STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV AH, 1 ;输入一个数INT 21HSUB AL, 30H ;ASCII->数字MOV XX, ALMOV BX, OFFSET TABLESQ ;取值XLATMOV YY, ALMOV AH, 4CHINT 21HCODES ENDSEND START3.从键盘输入字符 "HELLO SUGAR"并显示在屏上
DATAS SEGMENT;此处输入数据段代码 KEYBUF DB 12, ?, 13 DUP('$') DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码 STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV DX, OFFSET KEYBUF;KEYBUF[0]是首地址,KEYBUF[1]是个数MOV AH, 0AHINT 21HMOV AH, 09HINT 21HMOV AH,4CHINT 21H CODES ENDSEND START
8255和8253
开始之前首先认真的忏悔一下 不知道为啥自己上课整理的内容 到这之前就停了。可能因为自己去忙别的事情了吧,awsl。每年都是:下个学期会不那么忙,后来发现都是骗人的。
总之这个就是考试之前有一些东西需要总结。
Ⅰ.8253
1. 8253控制字最后一位D0=0表示二进制,D1表示十进制,how does it supposed to understand?
老师上课的时候说有很多人搞不懂这个,然后我上课的那一瞬间是懂了,然后现在再看自己记的笔记就完全...忘记了。
8253的工作方式控制字D0=1时,表示写入计数值为BCD码,但写入时,按十六进制数写入。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
