微型计算机期末复习

考点1:进制之间的转换,题型如下

image.png

考点2:补码的计算,题型如下:

image.png

8086CPU的寄存器结构(第二章)

题型一

image.png
image.png

image.png
image.png
image.png
image.png
IP 指令寄存器
指示代码段中指令的偏移地址,与代码寄存器 CS 连用,确定下一条的指令的物理地址
标志寄存器
用于反映指令执行结果或者控制指令执行形式(16 位)
EU
通用寄存器:保存运算的中间结果、提供地址全部或部分的偏移量
EU 控制电路:从 BIU 的指令队列中取指令执行,根据指令要求向 EU 各功能部件发送响应的控制命令
EU 功能:
从BIU的指令队列中取指令、译码指令、执行指令 为BIU提供偏移地址。
BIU
地址加法器:根据段地址和偏移地址,形成20位的偏移地址。
总线控制电路:产生总线控制信号,如访问存储器或者IO端口的读写信号等。
BIU 功能:

  1. 根据段地址和偏移地址,形成20位的偏移地址。
  2. 产生总线控制信号,如访问存储器或者IO端口的读写信号等。
  3. 从内存取指令,放入到指令队列中

题型二

image.png

简单的汇编指令(第三章)

题目 1

image.png

题型 2

image.png

INC DL
XCHG DL DH
2.
AND BL 0FH
SUB BL BH

DS 5600H
ES 3400H
SS 1200H

微型计算机汇编语言程序设计(第四章)

读入和写入

键盘输入字符串(0AH 号)字符串存入到 BUF 中

LEA DX,BUF
MOV AH,0AH
INT 21H

image.png
输出字符串(09 号)BUF 中以 ‘$’ 结束的字符串显示在屏幕上,如果没有结束标志出现乱码

LEA DX,BUF
MOV AH, 09H
INT 21H

返回操作系统(4CH)

MOV AH,4CH
INT 21H

0-15 的平方值

;在内存中从TABLE单元开始的连续16个单元中,存放着0~15的平方值(平方表),查表求
;任意数X(0≤X≤15)的平方值,将结果保存在RESULT中。

黄色部分可以换成 XLAT ;MOV AL [BX+AL]
BX:指向表的首地址 AL:表中某一项与表格首地址的偏移量

;在内存中从TABLE单元开始的连续16个单元中,存放着0~15的平方值(平方表),查表求
;任意数X(0≤X≤15)的平方值,将结果保存在RESULT中。
DATAS SEGMENT
    ;此处输入数据段代码
    TABLE DB 0,1,4,9,16,25,36,49,64,81
     	  DB 100,121,144,169,196,255
     	  x DB 11
     	RESULT DB ?;定义结果存放单元 
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS ;初始化数据段
    MOV DS,AX 
    ;此处输入代码段代码
    LEA BX,TABLE ;设置平方表的基地址
    MOV AH,0
    MOV AL,X ;取待查数
    ADD BX,AX ;计算在表中具体地址
    MOV AL,[BX]
    MOV RESULT,AL
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

image.png

无符号整数BUF中的最大值(最小值)

求无符号整数BUF中的最大值(最小值)存入MAX中

最大值是 JAE,最小值是 JBE

;求无符号整数BUF中的最大值(最小值)存入MAX中
DATAS SEGMENT
    BUF DB -6,0,1,5,20,40,-5,2,3 
    ;无符号最大数是(-5==10000101,补码是11111011,FB)
    ;无符号最小数是0
    N = $ - BUF
    MAX DB ?
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX ;初始化数据段
    MOV CX,N-1 ;循环次数
    MOV SI,OFFSET BUF ;SI指向数组地址
    MOV AL,[SI] ;AL记录当前最大值(最小值)
LOP:
    INC SI;SI不断++
    CMP AL,[SI] ;比较当前数和暂时最大数
    JAE NEXT ;如果暂时最大数大于当前数,跳转
    ;CMP AL,[SI]
    ;JBE NEXT ;如果暂时最小数小于当前数,跳转
    MOV AL,[SI] ;否则将[SI]送给AL
NEXT:
    LOOP LOP ;继续循环
    MOV  MAX,AL
    MOV  AH,4CH
    INT  21H
CODES ENDS
    END START

有符号整数BUF中的最大值(最小值)

最大值是 JGE 最小值是 JAE

;求有符号整数BUF中的最大值(最小值)存入MAX中
DATAS SEGMENT
    BUF DB -6,0,1,5,20,40,-5,2,3 
    ;有符号最大数是40 换成十六进制是28
    ;有符号最小数是-6 换成十六进制是FA
    N = $ - BUF
    MAX DB ?
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX ;初始化数据段
    MOV CX,N-1 ;循环次数
    MOV SI,OFFSET BUF ;SI指向数组地址
    MOV AL,[SI] ;AL记录当前最大值(最小值)
LOP:
    INC SI;SI不断++
    ; CMP AL,[SI] ;比较当前数和暂时最大数
    ; JGE NEXT ;如果暂时最大数大于当前数,跳转
    CMP AL,[SI]
    JLE NEXT ;如果暂时最小数小于当前数,跳转
    MOV AL,[SI] ;否则将[SI]送给AL
NEXT:
    LOOP LOP ;继续循环
    MOV  MAX,AL
    MOV  AH,4CH
    INT  21H
CODES ENDS
    END START

统计数组BUF中正数、负数、0的个数

统计数组BUF中正数、负数、0的个数顺序存放在变量NUM中。

;统计正数负数0的个数
DATAS SEGMENT
    BUF DB -6,0,1,5,20,40,-5,2,3 ;六个正数,两个负数,一个0
    N = $ - BUF
    NUM DB 3 DUP(?)
DATAS ENDS

CODES      SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:    MOV AX,DATAS
          MOV DS,AX
          LEA SI,BUF ;指向BUF的地址
          MOV CX,N
LOP:      CMP BYTE PTR[SI],0;遍历每个数字与0比较大小,声明是字节还是字
          JL A1 ;小于
          JZ A2 ;等于
          INC NUM
          JMP A3
A1:       INC NUM + 1 ;字节存储,+1
          JMP A3
A2:       INC NUM + 2
A3:       INC SI ;下一个数组
          LOOP LOP
          MOV AH,4CH
          INT 21H
CODES      ENDS
          END START

从键盘输入一个正整数,判断是否是回文数

从键盘输入一个正整数,判断是否是回文数,是则输出“YES”,否则输出“NO”。例如1551、131是回文数。(选做)

DATAS SEGMENT
    msg db 'Enter an integer: $'
    yes_msg db 0DH,0AH,'YES$';打印前先要换行
    no_msg db 0DH,0AH,'NO$' ;打印前先要换行
    input db 11,?,10 dup('$') ;假设不超过10个
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    mov AX,DATAS
    mov DS,AX
    mov AH,09H ;输出字符串
    lea DX,msg
    int 21H

    mov AH,0AH ;读入字符串
    lea DX,input;DX存有字符串
    int 21H
    
    ;检查时是否是回文数字(用双指针)
    mov si, dx
    add si, 2 ;缓冲区大小,N1表示最大可输入字符数,N2实际输入字符数
    mov di, dx
    add di, 2
find_end:
    cmp byte ptr [DI], 0DH  ; 检查当前字符是否是ODH,回车符
    jE end_find_end          ; 如果是,则跳出循环
    inc DI                  ; 否则,移动到下一个字符
    jmp find_end             ; 继续查找

end_find_end:
    dec DI

check_pali:
    cmp SI,DI
    jGE is_pali ;如果SI>=DI说明是回文数
    mov Al,[SI]            ; 从起始位置加载字节
    mov Bl,[DI]            ; 从结束位置加载字节
    cmp Al,Bl              ; 比较字符
    jNE not_pali
    inc SI
    dec DI
    loop check_pali

is_pali:
    mov AH,09H
    lea DX,yes_msg
    int 21H
    jmp end_program

not_pali:
    mov AH,09H
    lea DX,no_msg
    int 21H

end_program:
    mov AH,4CH
    int 21H
CODES   ENDS
        END START

image.png

image.pngimage.png

字母的数字

若有一变量str1中存放字符串”goodmorning”,编写完整的汇编程序统计str1中有多少个字母“o”,并将统计结果存入变量result中。(16分)

DATAS SEGMENT
	str1 DB "goodmorning"
	N = $ - str1
	result DB ?
DATAS ENDS

CODES SEGMENT
	Assume DS:DATAS,CS:CODES
START:
	MOV AX,DATAS
	MOV DS,AX
	MOV CX,N
    xor al,al
	LEA SI,str1
Lop:
	CMP BYTE PTR [SI],'o'
    JNZ A1
	INC al 
A1:
    INC SI
  	LOOP Lop
    mov result,al
	mov ah,4ch
 	int 21h
	
CODES ENDS
END START

image.png

芯片的存储容量和地址范围的计算(第五章)

6264

image.png
image.png
image.png

62256

image.png
image.png
image.png

题目

image.png

查询方式的输入/输出程序设计(第八章)

image.png

  1. 查询式输入接口模型

image.png

  1. 查询式输出接口模型

image.png

  1. 题目

image.png

LOP:
  IN AL,44H
  TEST AL,00001000B
  JZ LOP
  MOV AL,100
  OUT 43H,AL

8253 初始化(第九章)

第一题

image.png
例1:设0#计数器,工作于方式3,计数初值为2000H,采用BCD计数方式;1#计数器,工作于方式2,计数初值为1234,采用二进制计数方式。设8253的端口地址为80H~83H。试编写其初始化程序。

Mov AL,00100111B
OUT 83H,AL
MOV AL,20H
OUT 80H,AL

Mov AL,01110100B
OUT 83H,AL
MOV AX,1234
OUT 81H,AL
MOV AL,AH
OUT 81H,AL
;8253的控制端口是83H 选择计数器0(00) 读入计数器(10) 方式3(011) BCD计数方式
MOV AL,00100111B ;控制字
OUT 83H,AL
;送计数初值
MOV AL,20H
OUT 80H,AL ;送入到计数器0的端口

;8253的控制端口是83H 选择计数器1(01) 读入计数器(11) 方式2(010) 二进制计数方式
MOV AL,01110100B ;控制字
OUT 83H,AL
MOV AX,1234
;送计数初值
OUT 81H,AL ;先送入低字节
MOV AL,AH 
OUT 81H,AL ;再送入高字节

第二题

8个LED灯自上而下依次点亮,每个LED灯亮1秒。此题中CLK0=1000HZ。

image.png

;地址范围
;OUT74LS373(锁存器) 1111 1111 1000(IO0) 0000 
;IN74HC245(缓冲器)  1111 1111 1001(IO1) 0000
;P0(计数器0)			1111 1111 1010 (IO2)  0000
;CP(控制端口)      1111 1111 1010(IO2) 0110(A1和A2是1)
OUT74LS373 EQU 0FF80H;
IN74HC245 EQU  0FF90H
P0 EQU 0FFA0H
CP EQU 0FFA6H

DATAS SEGMENT
LED DB 1H
DATAS ENDS

CODES SEGMENT
	ASSUME CS:CODES,DS:DATAS
START:
	MOV  AX,DATAS
	MOV  DS,AX
	MOV  DX,CP;(16位,采取间接端口寻址)
	;计数器0(00) 先读低8位(11) 方式0(000)  二进制(0)
	MOV  AL,00110000B
	OUT  DX,AL
	CALL INIT
CYCLE:
	MOV  DX,IN74HC245
	IN   AL,DX;读取端口IN74HC245的内容,并赋值给AL
	TEST AL,00001000B;如果B3(OUT0)的内容低电平,则亮灯
	JZ continue ;不断进行亮灯
	ROL LED,1
	CALL INIT
continue:
	MOV AL,LED
	MOV DX,OUT74LS373
	OUT DX,AL;亮灯:读取AL的内容,并给端口OUT74LS373
	JMP CYCLE
INIT PROC
	;输入时钟信号1000HZ(CLO0),输出周期1s信号(OUT0)
	;先读取低8位,后读取高8位(11)
	MOV DX,P0
	MOV AX,1000;计数值是1s*1000HZ = 1000
	OUT DX,AL
	MOV AL,AH
	OUT DX,AL;1000一直减到0,输出1s周期的低电平信号
	RET
INIT ENDP
CODES ENDS
END START

8255(方式 0)

题目一

image.png
image.png

当开关合上,16个LED灯从上而下依次循环发光,每次只能点亮一个LED灯;
当开关打开,保持当前LED灯的点亮状态不变,下次开关合上时,从当前的LED灯开始点亮。

image.png

;地址范围 0000 0010 1101 0 00(PA) 01(PB) 10(PC) 11(CP) 0   
PA EQU 02D0H;A端口
PB EQU 02D2H;B端口
PC EQU 02D4H;C端口
CP EQU 02D6H;控制端口

DATAS SEGMENT
LED DW 1H ;00000000(B端口) 00000001(A端口)
DATAS ENDS
 
CODE SEGMENT
	ASSUME CS:CODE,DS:DATAS
START:
	MOV AX,DATAS
	MOV DS,AX
	
	;MOV AL,1(控制方式)00(方式0)0(端口A输出)1(C口高输入)00(端口B输出)1(C口低输入)B
  MOV AL,1001001B
	;控制方式
	MOV DX,CP ;16位需要间接端口
	OUT DX,AL
CYCLE:
	;C口输入
	MOV DX,PC 
	IN AL,DX
	;检测PC1是否是0,如果是0,说明关闭,反之说明打开
	TEST AL,11111101H
	JZ OFF
	CALL DELAY;延迟效果
	ROL LED,1;00000000(B端口) 00000010(A端口)不断左移
OFF:
	LEA SI,LED
	;A口输出
	MOV AL,[SI]
	MOV DX,PA
	OUT DX,AL ;读取AL的值,给到端口PA
	INC SI
	;B口输出
	MOV AL,[SI]
	MOV DX,PB ;读取AL的值,给到端口PB
	OUT DX,AL
	JMP CYCLE
;实现延迟效果
DELAY PROC
	MOV CX,0FFFFH
WAIT1:
	LOOP WAIT1
	RET
;返回指令,用于从 DELAY 过程返回到调用它的代码
DELAY ENDP
CODE ENDS
END START

题目二

七段数码管静态显示
image.png
image.png
image.png

  1. 共阴极:比如显示7,abc段高电平点亮,因此D2D1D0为1,D7D6D5D4D3为0,故7的段选码为00000111B,即07H。
  2. 若采用共阳极接法,比如显示7,abc段低电平点亮,因此D2D1D0为0,D7D6D5D4D3为1,故7的段选码为11111000B,即0F8H。

本次试验7段数码管采用共阳极接法。数字0~9的段选码依次为0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
本次试验7段数码管采用共阴极接法。数字0~9的段选码依次为3FH,06F,5BH,4FH,66F,6DH,7DH,07H,7FH,6FH

  1. 当开关合上,数码管循环显示0~9,当开关断开,数码管显示的数字保持不变。

image.png

;地址范围
;IOA 1111 1111 1101 0000
;IOB 1111 1111 1101 0010
;IOC 1111 1111 1101 0100
;IOCON 1111 1111 1101 0110
IOA	EQU 0FFD0H
IOB	EQU 0FFD2H
IOC	EQU 0FFD4H
IOCON	EQU 0FFD6H
DATA SEGMENT
;共阳极
TABLE DB  0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;共阴极
;TABLE DB 3FH,06F,5BH,4FH,66F,6DH,7DH,07H,7FH,6FH
TABLE_END=$

DATA ENDS
CODE SEGMENT
	ASSUME CS:CODE,DS:DATA
START:	MOV AX,DATA
	MOV DS,AX
	LEA SI,TABLE
	;1(控制字)00(A方式0)0(A输出)1(C高输入)0(B方式0)0(B输出默认)1(C低输入)
	MOV AL,10001001B
	MOV DX,IOCON
	OUT DX,AL
A1:	MOV AL,[SI]
	MOV DX,IOA;数码管连接在端口A上
	OUT DX,AL
	MOV DX,IOC;从IOC读入当前的状态
	IN  AL,DX
	TEST AL,00000001B ;如果PC0是1,说明开关断开,跳转到A1
	JNZ A1
	CALL DELAY;循环显示,给一定的延迟
	CMP BYTE PTR[SI],0;如果[SI]==0,说明要进行下一次循环
	JNZ A2
	LEA SI,TABLE
A2:
	INC SI ;下一个数字
	JMP A1
DELAY PROC
	MOV CX,0FFFFH
NEXT:
	LOOP NEXT
	RET
DELAY ENDP
CODE ENDS
END START

题目三

共阳极
image.png

IOA	1111 0000 0110 0000   0F060H 
IOB 1111 0000 0110 0010		0F062H
IOC 1111 0000 0110 0100		0F064H
CP  1111 0000 0110 0110		0F066H
IOA EQU 0F060H 
IOB EQU 0F062H
IOC EQU 0F064H
CP  EQU 0F066H
DATAS SEGMENT
  TABLE DB 0F9H,0A4H,0B0H 
DATAS ENDS 
CODES SEGMENT
  ASSUME CS:CODES,DS:DATAS
START:
  MOV AX,DATAS
  MOV DS,AX
  ;MOV AL,1(控制字方式)00(A方式0)0(A口输出)1(C高输入)0(B方式0)0(B口输出)1(C低输入)
  MOV AL 10001001
  MOV DX,CP
  OUT DX,AL
  ;读取C口的状态
NEXT:
  MOV DX,IOC
  IN  AL,DX
  ;仅有1开关合上,显示数字1
  CMP AL,10000000B
  JZ A1
  ;仅有2开关合上,显示数字2
  CMP AL,00000001B
  JZ A2
  ;1和2开关合上,显示数字3
  CMP AL,00000000B
  JZ A3
  ;1和2开关断开,不显示数字
  ;CMP AL,10000001B
  MOV DX,IOA
  MOV AL,00H
  OUT DX,AL
  JMP NEXT
A1:
  MOV DX,IOA
  MOV AL,0F9H
  OUT DX,AL
  JMP NEXT
A2:
  MOV DX,IOA
  MOV AL,0A4H
  OUT DX,AL
  JMP NEXT
A3:
  MOV DX,IOA
  MOV AL,0B0H 
  OUT DX,AL
  JMP NEXT
  CODES ENDS 
END START
IOA EQU 0F060H 
IOB EQU 0F062H
IOC EQU 0F064H
CP  EQU 0F066H
  MOV AX,DATAS
  MOV DS,AX
  MOV AL 10001001
  MOV DX,CP
  OUT DX,AL
NEXT:
  MOV DX,IOC
  IN  AL,DX
  CMP AL,10000000B
  JZ A1
  CMP AL,00000001B
  JZ A2
  CMP AL,00000000B
  JZ A3
  MOV DX,IOA
  MOV AL,00H
  OUT DX,AL
  JMP NEXT
A1:
  MOV DX,IOA
  MOV AL,0F9H
  OUT DX,AL
  JMP NEXT
A2:
  MOV DX,IOA
  MOV AL,0A4H
  OUT DX,AL
  JMP NEXT
A3:
  MOV DX,IOA
  MOV AL,0B0H 
  OUT DX,AL
  JMP NEXT
  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值