第一章导论
1.3
冯诺依曼体系结构
(1)以二进制形式表示指令和数据
(2)程序和数据事先放在存储器中(预存储)
(3)由运算器、控制器、存储器、输入设备和输出设备五大部件组成
字长、主频、架构
地址总线AB:(单向)在对存储器或I/O端口进行访问时,传送由CPU提供的要访问存存储单元或I/O端口的地址信息,以便选中要访问的存储单元或I/O端口
数据总线DB:(双向)从存储器取指令或读写操作数,对I/O端口进行读写操作,指令码或数据信息通过数据总线送往CPU或由CPU送出
控制总线CB:(双向)各种控制或状态信息通过控制总线由CPU送往有关部件,或者从有关部件送往CPU
运算器ALU
控制器CU
指令寄存器IR
指令译码器ID
可编程逻辑阵列PLA
程序计数器PC 存放下一条要执行指令所在的存储单元的地址
地址寄存器AR
数据缓冲寄存器DR
累加器A
标志寄存器FLAGS(程序状态字PSW)
用来存放执行算术运算指令、逻辑运算指令或测试指令后建立的各种状态码以及对CPU操作将进行控制的控制信息
CF进位标志位
ZF零标志位
OF溢出标志位
寄存器阵列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
同时有进位或者同时没有进位,结果没有溢出
负+负 正+正 可能溢出
正-正 正+负 不溢出
设机器字长为8位,最高位为符号位,试对以下两式进行二进制补码运算,并判断结果是否溢出?
(1)59+91
0011 1011+0101 1011=1001 0100
不溢出
(2)-52+8
1100 1100+0000 1000=1101 0100
不溢出
第三章 8086微处理器
3.1
3.2
主频是指芯片所使用的主时钟频率,直接影响计算机的运行速度
8086有20根地址线,直接对2^20=1M个存储单元进行访问 00000H~FFFFFH
总线接口单元BIU-----------访问内存
执行单元EU----------访问I/O
存储器分段结构 段地址:段内偏移地址(有效地址)
BIU的功能是负责完成CPU与存储器或I/O设备之间的数据传送
EU的功能是负责指令执行
8086地址总线由20根,寻址范围00000H~FFFFFH
8086CPU中16bit寄存器有14个
AX、BX、CX、DX、SP、BP、SI、DI、CS、DS、SS、ES、IP、FLAGS
段寄存器有4个,CS、DS、ES、SS
可以用作偏移地址
BX----存放操作数在内存中数据段的偏移地址
BP----存放操作数在堆栈段内的偏移地址
DI、SI----在字符串操作时,存放操作数的偏移地址,SI--源串在数据段内的偏移地址,DI----存放目的串在附加段数据段内的偏移地址
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
逻辑地址 段地址:偏移地址
物理地址:CPU对存储器进行访问时实际寻址所使用的20位地址
逻辑地址为0ABCDH:4321H
物理地址为0AFFF1H
写出下列指令中存储器操作数物理地址的计算表达式
MOV BX,[DI]
DS*16+DI
MOV AX,[BX+SI]
DS*16+BX+SI
ADD ES:[BX],AL
ES*16+BX
SUB AX,[1000H]
DS*16+1000H
MOV 5[BP+DI],AL
DS*16+5*(BP+DI)
端口地址
8086系统可访问的8位I/O端口有65536(64K)个
基本的读周期由4个时钟周期组成
第四章 8086指令系统
4.2
4.3
寻址方式
指令中给出的寻找操作数的方法
MOV BX,[2000/H]
直接寻址
ADD AL,[BX+DI+80H]
基址变址相对寻址
SUB AX,1000H
立即数寻址
PUSH WORD PTR [BP+10H]
寄存器相对寻址
数据寻址方式
-
立即数寻址方式
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)方式
程序传送分为无条件传送(硬件简单)和条件传送(查询传送、轮询、三态门)
中断传送方式响应速度快,实时性高
DMA----高速、大量 (硬盘---->内存)
- 无条件传输
硬件简单
- 查询传输
三态门 不能处理实时性的
- 中断
响应速度快,实时性高
- DMA
高速、大量 硬盘---->内存
中断
中断的定义
在CPU执行程序的过程中,出现了某种紧急情况或异常的事件(中断请求),CPU需暂停正在执行的程序,转去处理该事件(执行中断服务程序),并在处理完毕后返回断点处继续执行被暂停的程序。断点处是指返回主程序时执行的第一条指令的地址
中断源分为软件中断和硬件中断
优先级:软件中断、NMI、INTR、单步中断
中断处理过程:
- 中断请求
- 中断响应
保护断点
更新程序指针为中断服务程序的入口地址
- 保护断点
(硬件自动完成)
关中断、将标志寄存器内容入栈保存以及将CS和IP内容入栈保存
中断向量更新给CS、IP
- 中断处理
- 中断返回
中断优先级确定:软件查询、硬件排队电路、专用中断控制芯片
中断嵌套
中断向量表
什么是中断向量表?
中断向量,中断服务程序的入口地址
中断向量表是存放中断向量的一个特定的内存区域,长度为1K
中断类型号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 计数/定时
写代码完成8254的初始化,让8254的0#计数器工作在方式3
CODE SEGMENT ASSUME CS: CODE START: MOV AL,00110110B MOV DX,0606H OUT DX,AL MOV AX,18432 MOV DX,0600H OUT DX,AL MOV AL,AH OUT DX,AL MOV AH,4CH INT 21H CODE ENDS END START
送控制字
写初值
计数初值 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
并行输入(缓冲)/输出(锁存器)
初始化
MOV AL,10101110B ;控制字送AL MOV DX,100000001B ;控制字寄存器地址送DX OUT DX,AL ;控制字送控制寄存器 MOV AL,00001101B ;PC6置1,允许A口中断 OUT DX,AL MOV AL,00000100B ;PC2置0,禁止B口中断 OUT DX,AL
实验
基本输入输出
使8255端口A工作在方式0并作为输出口,端口B工作在方式0并作为输出口。用一组开关信号接入端口B,端口A输出线接至一组数据灯上,然后通过对8255编程来实现输入输出功能
code segment assume cs:code start: mov al,10000010b mov dx,0606h out dx,al next: mov dx,0602h in al,dx mov dx,0600h out dx,al mov ah,1 int 16h jz next mov ah,4ch int 21h code ends end start
流水灯显示实验
使8255的A口和B口均为输出,数据灯D7~D0由左向右,每次仅亮一个灯,循环显示,D15~D8与D7~D0正好相反,由右向左,每次仅点亮一个灯,循环显示
IOY0 EQU 0600H ;片选IOY0对应的端口始地址 MY8255_A EQU IOY0+00H*2 ;8255的A口地址 MY8255_B EQU IOY0+01H*2 ;8255的B口地址 MY8255_C EQU IOY0+02H*2 ;8255的C口地址 MY8255_MODE EQU IOY0+03H*2 ;8255的控制寄存器地址 SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE START: MOV DX, MY8255_MODE MOV AL, 80H OUT DX, AL MOV BX, 8001H AA1: MOV DX, MY8255_A MOV AL, BH OUT DX, AL ROL BH, 2 MOV DX, MY8255_B MOV AL, BL OUT DX, AL ROL BL, 1 CALL DELAY CALL DELAY JMP AA1 DELAY: PUSH CX MOV CX, 0F000H AA2: PUSH AX POP AX LOOP AA2 POP CX RET CODE ENDS END START
应用题
1.读程序
(1)设(SP)=1000H,(AX)=5000H,(BX)=1000H,执行下列程序片段后,(SP)=?,(AX)=?,(BX)=?
PUSH AX
PUSH BX
POP AX
(SP)=0FFEH
(AX)=1000H
(BX)=1000H
(2);数据段
MSG1 DB "HOW OLD ARE YOU?$"
MSG2 DB 30,?,30 DUP(?)
……
;代码段
……
MOV DX,OFFSET MSG1
MOV AH,09H
INT 21H
MOV DX,OFFSET MSG2
MOV AH,0AH
INT 21H
该程序段的功能是
向用户显示“HOW OLD ARE YOU?”的提示,并接收用户输入的最多30个字符的字符串(包括空格,但不包括回车符),存储在
MSG2
指向的缓冲区中(3)阅读下列程序段,回答问题
LEA BX,MYDATA
MOV AL,[BX]
INC BX
CMP AL,[BX]
JNC DONE
MOV AL,[BX]
DONE:MOV MAX,AL
HLT
程序中LEA BX,MYDATA指令的含义是:
将MYDATA所代表的内存地址的偏移量加载到BX
该程序段完成的功能是:
比较MYDATA中的前两个值的大小,将大的存到MAX中
2.写程序
已知内存SCORE单元中存有10个学生的考试成绩,分别为53,49,67,91,85,83,74,69,95,86。试编写程序,将最低分存入MIN单元内
.model small .stack 100h .data SCORE DB 53,49,67,91,85,83,74,69,95,86 ; 10个学生的考试成绩 MIN DB ? ; 用来存储最低分的变量 .code main proc MOV AX, @data ; 初始化数据段 MOV DS, AX MOV AL, [SCORE] ; 假设SCORE的第一个元素就是最低分,先加载它 MOV MIN, AL ; 将这个值存入MIN MOV CX, 10 ; CX寄存器用于计数,这里有10个元素 LEA BX, SCORE + 1 ; BX寄存器指向SCORE数组的第二个元素 ; 开始循环,比较并找到最低分 NEXT_ELEMENT: CMP AL, [BX] ; 比较AL(当前最低分)和BX指向的元素 JGE SKIP_UPDATE ; 如果AL >= [BX],则跳过更新 ; 如果找到更低的分数,则更新AL和MIN MOV AL, [BX] MOV MIN, AL SKIP_UPDATE: INC BX ; 移动到下一个元素 LOOP NEXT_ELEMENT ; 减少CX,如果CX不为0,则跳转回NEXT_ELEMENT ; 最低分已存储在MIN中,程序可以继续或结束 ; 这里简单结束程序 MOV AX, 4C00h ; DOS功能号4Ch,终止程序 INT 21h main endp end main
3.存储器系统设计
某8位机,系统地址总线为A15~A0,数据总线为D7~D0,现需使用16K*8bit存储芯片构成64KB存储系统,需要多少块这样的存储芯片?请设计存储芯片与CPU之间的连线图,译码器选用2-4译码器,并给出每个芯片的地址范围。
16K*8bit---->64K*8bit 4块
4.接口应用
设8255A的端口地址为80H~83H,其控制字格式如下图
(1)将A口、B口设置成方式0,A口和C口为输入口,B为输出口,试编程完成初始化
控制字10011001
MOV AL,10011001B
MOV DX,83H
OUT DX,AL
(2)假设该8255A的A口连接着8个LED灯,试编写程序,使这八个风从左到右依次轮流点亮(低电平点亮,高电平熄灭),每次只点亮一个LED灯
.model small .stack 100h .data ; 这里没有需要显式声明的数据,因为我们将直接操作端口 .code main proc ; 初始化数据段 mov ax, data mov ds, ax mov al, 10011001b out 83h, al ; 初始化LED控制循环 mov cx, 8 ; LED数量 mov al, 00h ; 初始LED全灭(虽然这不是必须的,因为每次循环都会重新设置AL) next_led: ; 准备点亮一个LED(将AL左移,并在最低位设置0) shl al, 1 or al, 01h ; 如果shl后最低位为0,则此步确保它变为1(但实际上由于shl,我们不需要这一步) and al, 0FEh ; 清除最低位以点亮LED(这是点亮LED的正确步骤) ; 将AL的值输出到8255A的A口 out 80h, al ; 添加延时以便观察LED的变化 ; 这里使用简单的软件循环延时作为示例 mov dx, 5000h delay: dec dx jnz delay ; 继续点亮下一个LED loop next_led ; 程序结束 ; 在DOS环境中,我们通常使用INT 21h的4Ch功能号来退出程序 mov ax, 4C00h int 21h main endp end main