Bootstrap

微机原理 复习

第一章导论

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)

  1. 段内直接

        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)

  1. 段间直接

        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

;