微机原理复习题

考试只考汇编语言

一、 填空题。(10)

任意数的原码、反码、补码、二进制、十进制、十六进制、压缩、非压缩BCD码、ASCII码表示。
原码反码补码只针对有符号数

知识点

16进制数的表示:
1、在C,C++规定,16进制数必须以 0x 开头,且不区分大小写。如:0xff,0xFF,0X102A等等;
最后一点很重要,C/C++中,10进制数有正负之分,比如12表示正12,而-12表示负12,;但8进制和16进制只能用达无符号的正整数。
2、在8086汇编中,十六进制数,由0-9及字母A-F组成的,后面跟字母H,第一个字符必须是0-9,如果以A-F开头,必须在其前加0 如A8H错误 0A8H正确

计算机中的数制转换
在这里插入图片描述
原码反码补码
原码 :最高位是符号位,0代表正数,1代表负数,非符号位为该数字绝对值的二进制。

反码:正数的反码与原码一致,负数的反码是对原码按位取反,只是最高位(符号位)不变。

补码:正数的补码与原码一致,负数的补码是对原码按位取反加1,符号位不变。
在这里插入图片描述
BCD码
BCD码(又称8421码)是表示十进制数的,非压缩BCD码是用8位表示的,其实只用低4位,高4位全为0。
例如,十进制数36,用非压缩BCD码表示为:0000 0011 0000 0110 ,这是两个字节。

压缩BCD码,就把高4位的0省掉了,用一个字节表示两个BCD码了。

还是,十进制数36,用压缩BCD码表示为:0011 0110 ,就一个字节就行了。节省了一个字节。
在这里插入图片描述

习题

1将下列十进制数分别转换为二进制数和十六进制数。
128      625      67.5  24.25
参考答案:128=1000 0000B=80H          625=10 0111 0001B=271H
          67.5=100 0011.1=43.8H         24.25=1 1000.01B=18.4H
2将下列二进制数分别转换成十进制数和十六进制数。
1 0110.001     11000.0101   110 0010   10 1110
参考答案:1 0110.001B=22.125=16.2H        1 1000.0101B=24.3125=18.5H
          110 0010B=98=62H               10 1110B=46=2EH  
3写出下列十进制数的原码和补码(采用8 位二进制数表示)。
87  -58  48  -100
参考答案:
(87)原码=0101 0111B         (87)补码=0101 0111B
(-58)原码=1011 1010B        (-58)补码=1100 0110B
(48)原码=0011 0000B         (48)补码=0011 0000B
(-100)原码=1110 0100B       (-100)补码=1001 1100B
4写出下列十进制数的压缩BCD码表示形式。
        918  125
参考答案:918=100100011000BCD    125=000100100101BCD
5按照字符所对应的ASCII 码表示,写出下列字符或符号所对应的16进制ASCII 码值。
           ‘A’   ‘b’    ‘1’     CR     ‘$’
参考答案:字符‘A’的ASCII 码值是41H              字符‘b’的ASCII 码值是62H
字符‘1’的ASCII 码值是31H              符号CR的ASCII 码值是0DH  
字符‘$’的ASCII 码值是24H

6 已知X=-78,Y=15,求[X+Y]补
参考答案:求[X+Y]补=C1H
在这里插入图片描述

28位RAM芯片的外部引脚应有11地址线,8条数据线。
2K=2*1K=2 * 2^10  = 2^11  -->11根地址线
88根数据线
具有15条地址线、8条数据线的RAM芯片存储容量是32KB。
15条地址线 -->2^10  *  2^5 --> 32K 
8条数据线 --> 8=8b=1B
故存储容量是32K * 8--> 32K *8b -->32KB

注意:B和b在表示容量时是不同的。

7、现已知有逻辑地址1000:F000H,试计算其对应的物理地址。(必考)
在这里插入图片描述
参考答案:
逻辑地址1000:F000H所对应的物理地址为:1F000H

二、简答题。(20)

CF,OF,SF,ZF,PF知识点

5个标志类
CF(进位):无符号运算,若是结果超过了寄存器存放的最大值,CF=1,若没有则返回CF=0OF(溢出):一个寄存器如果存放的值超过所能表示范围,就称为溢出,OF溢出OF=1,没有溢出OF=0
SF(符号):符号标志位,如果运算结果为负数,SF=1,反之若为正数SF=0
ZF(为零)0标志,一条语句结果是0,ZF=1,反之结果不为零ZF=0
PF(奇偶):奇偶标志位,转化为二进制后,若是1的个数为偶数个,则PF=1,若是为奇数个PF=0

**
习题:

 给出下列8位数据在执行加法运算后,CF、OF、SF、ZF的值。(必考)
(1)EFH+2280H+80H         (3)F9H+63H
参考答案:
(1)EFH+2=F1H    CF= 0   OF=0    SF=1     ZF=0280H+80H=00H  CF= 1   OF=1    SF=0     ZF=13)F9H+63H=5CH  CF= 1   OF=0    SF=0     ZF=0   
10给出2.6中的每小题在执行减法运算后,CF、OF、SF、ZF的值。
参考答案:
(1)EFH-2=EDH    CF= 0   OF=0    SF=1     ZF=0280H-81H=0FFH  CF= 0   OF=0    SF=1     ZF=03)F9H-63H=96H  CF= 0   OF=0    SF=1     ZF=0

详解:
在这里插入图片描述

总结:

CF:看最高位是否进位或借位,如果最高位有进位或借位则CF=1
OF:{1(A,BC都是16进制)  A+B=CA,B为一负一正则不会溢出,OF=0,
		反之看A,B原码的最高位和C的最高位,若A,B原码的最高位和C的原码最高位不同,则为溢出OF=1,
		若相同则不溢出,OF=0  也就是说负数+负数=负数为不溢出,负数+负数=正数为溢出
	2(A,BC都是16进制)  A-B=CA,B同为正数或负数则不会溢出,OF=0,
		反之看A原码的最高位和C的最高位,若A原码的最高位和C的原码最高位不同,则为溢出OF=1,
		若相同则不溢出,OF=0    也就是说负数-正数=负数,是不溢出,负数-正数= 正数是溢出
	}
SF:看最高位符号位,为1,SF=1,0,SF=0
ZF:看运算结果是否为0,运算结果为0,ZF=1,运算结果为1,ZF=0

有关寄存器的知识点

寄存器的分类


1、偏移地址在指令中,操作数在内存中,MOV指令默认的操作数存储在DS中(数据段寄存器)
此时采用段加偏移。
2、【有效地址】  --也叫偏移地址
物理地址=段地址左移一位+【有效地址】  物理地址是5位的
段地址DS左移一位 3200H
3、寻址方式
MOV AX [1个地址]  直接寻址
MOV	AX,[1个寄存器BX] 寄存器间接寻址
MOV	AX,[1个寄存器+1个地址] 寄存器相对寻址
MOV AX,[2个寄存器] 基址变址寻址
MOV	AX,[2个寄存器+1个地址] 相对基址变址寻址
MOV	AX,地址  立即寻址  没有寄存器,不需要寻址
MOV	AX,寄存器 寄存器寻址  有寄存器,寄存器中的数据就是我们要的地址

12、设BX=0123H,DI=1000H,DS=3200H,试指出下列各条指令中源操作数的寻址方式,对于是存储器操作数的,还需写出其操作数的有效地址和物理地址。(必考)
(1)MOV AX,[2A38H]
(2)MOV AX,[BX]
(3)MOV AX,[BX+38H]
(4)MOV AX,[BX+DI]
(5)MOV AX,[BX+DI+38H]
(6)MOV AX,2A38H
(7)MOV AX,BX
参考答案:
(1)直接寻址 有效地址=2A38H,物理地址=32000H+2A38H=34A38H
(2)寄存器间接寻址 有效地址=0123H,物理地址=32000H+0123H=32123H
(3) 寄存器相对寻址 有效地址=0123H+38H=015BH,物理地址=32000H+015B=3215BH
(4) 基址变址寻址 有效地址=0123H+1000H=1123H,物理地址=32000H+1123H=33123H
(5)相对基址变址寻址 有效地址=0123H+1000H+38H=115BH,物理地址=32000H+115BH=3315BH
(6)立即寻址
(7)寄存器寻址


常用汇编指令
13设AX=96BCH,BX=AC4DH,CF=0。求分别执行指令ADD AX,BX和SUB AX,BX后,AX与BX的值各为多少?并指出标志位SF、ZF、OF、CF、PF(奇偶校验位)、AF(半进位)的状态。
参考答案:
执行ADD AX,BX后,AX=4309H,BX= AC4DH ,SF=0 ZF=0 OF=1 CF=1 PF=1 AF=1
执行SUB AX,BX后,AX=EA6FH,BX= AC4DH ,SF=1 ZF=0 OF=0 CF=1 PF=1 AF=1

题目写的CF=0表明这是一个不带进位的add指令

PF奇偶位  看后8位,进行校验,如果后八位有偶数个1时,PF=1,若为奇数个1则PF=0
AF半进位  看后四位 后四位有进位则AF=1,否则AF=0;

14采用三种不同的方法实现AX与DX的内容交换。(看看记记)
参考答案:
第一种:用指令XCHG,交换寄存器AX,DX中的内容
XCHG AX,DX
第二种:
压入AX的字数据,压入DX的字数据 此时栈顶元素是DX,POP AX,将栈顶元素DX的内容的值赋给AX寄存器后栈顶元素是AX,将栈顶元素AX的内容赋值给DX寄存器,实现了寄存器AX,DX的内容交换

PUSH AX
PUSH DX
POP AX
POP DX

第三种?:将AX寄存器的数据给BX

MOV BX,AX
MOV AX,DX
MOV DX,BX

15编写程序段实现:当DL中存放的数据是奇数时使AL=1,否则使AL=-1。
参考答案:

TEST DL,01H
JNZ   NEXT
MOV AL,-1
JMP EXIT
NEXT:MOV AL,1 
EXIT:   

解释:
判断是奇数还是偶数用与运算,奇数和01H与运算是1,偶数是0,故测试这个就好了,JNZ指令是如果结果不是0,也就是说是奇数的话,就跳转到NEXT,JMP是无条件转移,程序结束,跳转退出。

16、用尽可能少的指令实现使DL中的高4位内容与低4位内容互换。
参考答案:

MOV CL,4
    ROL DL,CL   ;ROR DL,CL

解释:要先定义循环次数CL也就是计数寄存器,因为要移动4位,所以CL为4,然后循环左移或者右移都可以ROL/ROR DL,CL

17、编写程序段,判断AL中的带符号数是不是负数。若是负数,则将-1送给AH;否则,将1送给AH。
参考答案:

SUB AL,0
JS negn
MOV AH,1
JMP post
negn: 
MOV AH,-1 
Post:

18假设DX=87B5H,CL=4,CF=0,确定下列各条指令单独执行后DX中的值。
(1)SHL DL,1
(2)SHR DX,CL
(3)SAR DX, CL
(4)ROL DX,CL
(5)ROR DX,CL
(6)RCL DX,CL
(7)RCR DX,1
参考答案:

1)DX=876AH
(2)DX=087BH
(3)DX=F87BH
(4)DX=7B58H
(5)DX=587BH
(6)DX=7B54H
(7)DX=43DAH

解释: 在这里插入图片描述

19按下列要求编写指令序列。
(1)将AX中的低4位置1,高4位取反,其它位清0。
(2)检查DX中的第1、6、11位是否同时为1。
(3)清除AH中最低3位而不改变其它位,将结果存入BH中。
参考答案:

1XOR AX,F000H   高四位取反,异或是相同为0,不同为1
          AND AX,F00FH   其他位清0OR AX,000FH     低四位为12MOV AX,DX
          AND DX,0842H
          XOR DX,0842H            
          JZ  ZERO
            ┆
     ZERO:  …              DX中的第1611位同时为1的情况
            ┆

编写汇编指令序列将AX中的第2,6,8位清0,其它位置1。
编写汇编指令序列将AX中的第0,5,7位置1,其它位清0。
清零用AND ,取反用XOR,变为1用OR

20分析下面的程序段完成什么功能?(提示:请将DX与AX中的内容作为一个整体来考虑)
MOV CL, 04
SHL DX, CL
MOV BL, AH
SHL AX, CL
SHR BL, CL
OR DL, BL
参考答案:实现将存放在DX与AX中的32位数据逻辑左移4位
21设SS=1000H,SP=2000H,AX=345AH,BX=F971H,Flags=4509H,试分析执行以下指令
PUSH BX
PUSH AX
PUSH F
POP CX
之后,SP、SS、CX的值各为多少?
参考答案:SP=1FFCH SS=1000H CX=4509H
22指出下列指令中哪些是错误的,并说明错误原因。
(1)MOV DL,CX (2)MOV DS,1000H
(3)MOV [DL],[BX] (4)MOV DL,[BX][BP]
(5)XCHG AX,[5000H] (6)PUSH 3541H
(7)INC [BX] (8)POP CS
(9)MOV A[BX+SI],0 (10)MOV AL,300
参考答案:
(1)数据类型不匹配 (2)立即数不能直接送段寄存器
(3)两个存储器操作数之间不能直接传送数据
(4)源操作数寻址不能为基址加基址
(5)正确 (6)PUSH指令的操作数不能为立即数
(7)存储器操作数类型不明确 (8)CS不能作为POP指令的目的操作数使用
(9)目的操作数类型需明确 (10)两个操作数数据类型不匹配

23。设AL=86H,BL=21H,在分别执行MUL和IMUL指令后,各自的结果是多少?OF=?,CF=?
参考答案:

执行MUL BL后,结果AX=1146H;OF=1,CF=1
执行IMUL BL后,结果AX=F046H;OF=1,CF=1     

单操作数的有符号乘指令

语句格式 :IMUL OPS

功 能 :字节乘法:(AL)*(OPS)---->AX

              字  乘   法:(AX)*(OPS)---->DX,AX

               双字乘法:(EAX)*(OPS)---->EDX,EAX

2、无符号乘指令

语句格式 :MUL OPS

功 能 :字节乘法:(AL)*(OPS)---->AX

              字  乘   法:(AX)*(OPS)---->DX,AX

               双字乘法:(EAX)*(OPS)---->EDX,EAX

————————————————

有符号数作运算,有符号数al范围是-128~127,但结果al=c0h(十进制192)显然已经超过了al的有效范围,按常理ah要存放进位了,假如最后的结果中ah=1 那这个题的OF就不溢出了(of=0),可是ah=0,所以最后的决定结果OF=0溢出了
十六进制表示负数通常用的是补码的方式表示.
正数的补是它本身.
负数的补码是它本身的值每位求反,最后再加一.
如:-3,3的十六进制为0003,-3的十六进制就是FFFD(3求反之后是C,再加1,成D

三、编程题。(30分)
编程题框架:

data segment; 定义数据段
a db ?;定义变量
b db ?;定义变量
c db ?;定义变量
string db c='$'
data ends    //我定义了一个数据段

code segment;定义代码段
assume cs:code,ds:data,es:data  //指定 寄存器装载什么段
start:
	push ds
	sub ax,ax

code ends;
 end start;

4.10 编写一个汇编语言程序,将字符串“Hello Wowld!”中的全部小写字母转换为大写字母,并存放回原地址处。

在字母范围 大写->小写+20h ,小写->大写-20h
大写字母地址大

参考程序:

data  segment //定义数据段
string  db  "hello wowld!" //定义字符串
len    equ  $-string //equ伪指令 len=$-string
data  ends

code segment
     assume cs:code,ds:data 
start:
     mov ax,data
     mov ds,ax  //数据段的地址装入专用寄存器
     mov bx,offset string
     mov cl,len  //cl存放数组长度len
next:mov al,[bx] //将bx寄存器的内容放入al中
     cmp al,'a' //串比较指令
     jb  lop // <= 'a'
     cmp al,'z'
     ja  lop
     sub al,20h   
     mov [bx],al
lop: inc bx
     dec cl
     jnz next
     mov ah,4ch
     int 21h  //中断
code ends
end start

DATA	SEGMENT
string	DB	"Hello World!"	;将需要转换的字符串存放到string中,定义类型为DB型
LEN EQU $-string			;等值伪指令EQU,将LEN表示string的长度
DATA	ENDS
CODE	SEGMENT
		ASSUME	CS:CODE,DS:DATA
START:	MOV	AX,DATA	;由于DATA为立即数,不能用赋值给段寄存器DS,需要借助AX通用寄存器
		MOV	DS,AX	;将AX赋值给DS
		MOV	BX,OFFSET string	;BX获取string的有效地址用于取出string中的字符串
		MOV	CL,LEN	;CL为string字符串的长度
NEXT:	MOV	AL,[BX]	;此时[BX]为string所存放字符串的内容,赋值给AL
		CMP	AL,'a'	;由于是DB字节类型,只需要将AL的一个字节单元与单个字符'a'进行比较
		JB	LOP		;JB为小于跳转,即AL存放的字节单元的内容所对应的ASCII码值小于'a'所对应的ASCII码值,跳转到LOP标签处 否则不跳转执行下一条指令
		CMP	AL,'z'	;若执行到此条指令,代表AL>='a',接下来需要与'z'进行比较即可
		JA	LOP		;JA为大于跳转,即AL存放的字节单元的内容所对应的ASCII码值大于'z'所对应的ASCII码值,跳转到LOP标签处 否则不跳转执行下一条指令  
		SUB	AL,20H	;执行到此条指令,表示以及确定此时的AL为小写字母,AL-20H表示将小写字母转换为所对应的大写字母(小写字母比对应的大写字母的ASCII码值大20H)
		MOV	[BX],AL	;将小写字母转换为对应的大写字母结束后,结果AL存放回原来的物理地址[BX]处
LOP:	INC	BX		;BX+1(因为DB字节类型),表示判断下一个字节单元存放的字符串
		DEC	CL		;CL-1,表示字符串string所需要判断字符的长度减一
		JNZ	NEXT	;若CL不为0,即字符串string仍有需要判断的字符,跳转到NEXT标签处
		MOV	AH,4CH	;调用4CH号功能,返回DOS操作系统指令
		INT	21H		;终止当前程序的运行,并返回DOS系统
CODE	ENDS
		END	START

(1)美元符是指当前地址,这句话一般放在string的后面, 所以当前美元符的地址刚好是string结束的地址。减去string开始的地址,,就是string的长度,,len中也就是string的长度。

4.11 编写一个带符号数四则运算的程序,完成(Z-(X*Y+200))/20的运算,商送V单元,余数送W单元。这里,X、Y、Z均为16位的带符号数,内容用户自己定义。
参考程序:

data   segment 
x dw  2
y dw  -10
z dw 300
v dw ?
w dw ? 
data   ends
code segment
     assume cs:code,ds:data
start:
     mov ax,data
     mov ds,ax  
     mov ax,x
     mov bx,y
     imul bx   //ax = ax*bx
     mov cx,200
     mov bx,0   //bx 清零
     add ax,cx   
     adc dx,bx   
     mov cx,z
     mov bx,0
     sub cx,ax
     sbb bx,dx
     xchg cx,ax //将ax,cx的地址交换
     xchg bx,dx
     mov bx,20
     idiv bx
     mov v,ax
     mov w,dx
     mov ah,4ch
     int 21h
 code ends
     end start

4.12 编写一个汇编语言程序,完成以下要求。从BUF单元处定义有10个带符号字数据:-1、3、24、94、62、72、55、0、-48、99,试找出它们中的最大值和平均值,并依次分别存放至该数据区的后两个单元中(假设这10个数的和值不超过16位范围)。最小值?
参考程序:

data   segment 
buf dw  -1,3,24,94,62,72,55,0,-48,99
n   equ ($-buf)/2
max dw ?
ave db ?,? 
data   ends
code segment
     assume cs:code,ds:data
start:
     mov ax,data
     mov ds,ax
     lea si,buf
     clc
     xor ax,ax
     xor dx,dx
     mov ax,[si]
     mov cx,n
next:adc dx,[si]
     cmp ax,[si]
     jge goon
     mov ax,[si]
goon:add si,2
     loop next
     mov max,ax
     mov bl,n
     mov ax,dx
     idiv bl
     mov ave,al
     mov ave+1,ah
     mov ah,4ch
     int 21h
 code ends
     end start
DATA	SEGMENT
BUF	DW -1,3,24,94,62,72,55,0,-48,99
N	EQU	($-BUF)/2	;由于定义的BUF为DW字类型,每个数据占两个物理单元
					,最后个数除以二,这里的N为BUF的长度
MAX	DW	?			;用于存放BUF中最大的数据值
AVE	DB	?	?		;由于题目规定平均值需要存放在最大值后,定义两个DB类型,
					第一个存放商(平均值的整数部分),第二个存放余数(平均值的小数部分)
DATA	ENDS
CODE	SEGMENT
		ASSUME	CS:CODE,DS:DATA
START:	MOV	AX,DATA	;由于DATA为立即数,DS为段寄存器,
					立即数不能直接给段寄存器赋值,需要引用AX通用寄存器
		MOV	DS,AX	;通用寄存器赋值给段寄存器
		LEA	SI,BUF	;LEA取有效地址指令。将源操作数的有效地址送到指令中指定的寄存器中,
					源操作数只能是存储器操作数,目的操作数只能是16位的通用寄存器
		CLC			;标志位操作指令CLC。CF=0,使进位标志位CF清零
		XOR	AX,AX	;AX清零操作
		XOR	DX,DX	;DX清零操作
		MOV	AX,[SI]	;将SI内容赋值给AX,即BUF中的内容,由于AX为16位通用寄存器,
					且BUF也为DW类型,一个数据占两个物理单元,即该指令操作是正确合法的
		MOV	CX,N	;CX为循环次数/BUF存放的数据个数
NEXT:	ADC	DX,[SI]	;由于BUF单元处定义的是带符号字数据,进行运算的时候需要相加,
					所以要使用ADC带进位的加法指令 即DX为所有数相加之后的和 
					用来存放最后的和的结果
		CMP	AX,[SI]	;比较AX和[SI]中的大小
		JGE	GOON	;若AX>=[SI]跳转大GOON标签处,否则执行下一条指令 即AX
		MOV	AX,[SI]	;执行到此条指令表[SI]要比AX大,需要将数值大的[SI]存到AX中,
					使得AX始终存放最大值
GOON:	ADD	SI,2	;由于BUF为DW数据类型,所以需要SI+2才可以指向下一个数据
		LOOP NEXT	;CX-1,若CX≠0,跳转 即接着比较下一个数
		MOV	MAX,AX	;执行到此指令表示数据已经全部比较完成,最大值存放在AX中
		MOV	BL,N	;BL为BUF的数据总个数
		MOV	AX,DX	;将最后的所有数据的和的结果赋值给AX
		IDIV BL		;IDIV带符号的除法指令 隐含被除数为AX(存放着所有数的总和) 商为AL 余数为AH
		MOV	AVE,AL	;将商(平均分的整数部分)赋值给AVE
		MOV	AVE+1,AH;由于AVE为DB数据类型,下一个存储单元+1即可,将AH余数(平均分的小数部分)赋值给AVE+1
		MOV	AH,4CH	;DATA	SEGMENT
string	DB	"Hello World!"	;将需要转换的字符串存放到string中,定义类型为DB型
LEN EQU $-string			;等值伪指令EQU,将LEN表示string的长度
DATA	ENDS
CODE	SEGMENT
		ASSUME	CS:CODE,DS:DATA
START:	MOV	AX,DATA	;由于DATA为立即数,不能用赋值给段寄存器DS,需要借助AX通用寄存器
		MOV	DS,AX	;将AX赋值给DS
		MOV	BX,OFFSET string	;BX获取string的有效地址用于取出string中的字符串
		MOV	CL,LEN	;CL为string字符串的长度
NEXT:	MOV	AL,[BX]	;此时[BX]为string所存放字符串的内容,赋值给AL
		CMP	AL,'a'	;由于是DB字节类型,只需要将AL的一个字节单元与单个字符'a'进行比较
		JB	LOP		;JB为小于跳转,即AL存放的字节单元的内容所对应的ASCII码值小于'a'所对应的ASCII码值,跳转到LOP标签处 否则不跳转执行下一条指令
		CMP	AL,'z'	;若执行到此条指令,代表AL>='a',接下来需要与'z'进行比较即可
		JA	LOP		;JA为大于跳转,即AL存放的字节单元的内容所对应的ASCII码值大于'z'所对应的ASCII码值,跳转到LOP标签处 否则不跳转执行下一条指令  
		SUB	AL,20H	;执行到此条指令,表示以及确定此时的AL为小写字母,AL-20H表示将小写字母转换为所对应的大写字母(小写字母比对应的大写字母的ASCII码值大20H)
		MOV	[BX],AL	;将小写字母转换为对应的大写字母结束后,结果AL存放回原来的物理地址[BX]处
LOP:	INC	BX		;BX+1(因为DB字节类型),表示判断下一个字节单元存放的字符串
		DEC	CL		;CL-1,表示字符串string所需要判断字符的长度减一
		JNZ	NEXT	;若CL不为0,即字符串string仍有需要判断的字符,跳转到NEXT标签处
		MOV	AH,4CH	;调用4CH号功能,返回DOS操作系统
		INT	21H		;终止当前程序的运行,并返回DOS系统
CODE	ENDS
		END	START

四、分析题。(40分)

1.分析下面的电路。编写完整的汇编程序实现读取74HC244芯片接的4个开关,控制74HC573接的4个LED亮灭。(思考:改变片选信号,改变LED连接位置该如何改变程序)

code segment public 'code'
    assume cs:code
start:
in al,10h
out 00h,al
jmp start
code ends
end start

2.分析下面的电路,编写完整的汇编程序实现读取8255A芯片PB口接的4个开关,控制8255A芯片PA口接的4个LED亮灭。(思考:改变开关连接位置,改变LED连接位置,假如连到PC口,该如何改变程序)

data segment
pa8255 equ 00h;8255各端口地址
pb8255 equ 02h
pc8255 equ 04h
cw8255 equ 06h
data ends
code segment public 'code';代码段
    assume cs:code,ds:data;段使用设定
start:
mov ax,data;设置数据段地址
mov ds,ax
mov al,82h;8255控制字
out cw8255,al;送到控制端口
next:
in al,pb8255
mov cl,4
shr al,cl
out pa8255,al
jmp next
code ends
end start

3.分析下面的电路,设CLK0的输入脉冲为100kHz,编写完整的汇编程序实现通过8253A的定时器0输出100Hz方波。(思考:改变定时器,改变输入输出频率,该如何改变程序)

data segment;数据段
cw_8253 equ 26h
t0_8253 equ 20h
t1_8253 equ 22h
t2_8253 equ 24h
data ends
code segment public 'code';代码段
    assume cs:code,ds:data;段使用设定
start:
mov ax,data;设置数据段地址
mov ds,ax
mov al,36h
out cw_8253,al;送到控制端口
mov ax,1000
out t0_8253,al;t0的低8位
mov al,ah
out t0_8253,al;t0的高8位
loop $
code ends
end start

4.分析下面的电路,写出8259的初始化程序段,要求:中断的触发方式为边沿触发,需要写ICW4,中断类型号为60H,普通全嵌套方式,非缓冲方式,自动中断结束方式。
(思考:改变片选信号,改变中断类型号,该如何改变程序)

mov al,13h
out 10h,al
mov al,60h
out 12h,al
mov al,03h
out 12h,al

5.在仿真软件Proteus中采用8086,74hc573,74hc138,8251等元件设计电路实现在虚拟终端上输出“Hello,world!”。

stack segment stack
dw 128 dup(0)
stack ends
data segment
dat8251 equ 10h
cmd8251 equ 12h
count0 db 0
str1 db "Hello,world!",0dh,0ah
len  equ  $-str1
data ends
code segment public 'code'
    assume cs:code,ss:stack,ds:data
delay macro n;延时的宏
push cx
mov cx,n;循环次数
loop $
pop cx
endm
printf macro str,len;从串口输出字符串
lea bx,str;加载字符串首地址
mov cx,len;加载字符串长度
mov count0,0;计数
state0:
in al,cmd8251;读状态
test al,01h;判断传输完一个字节
jz state0
mov al,count0;取下一个字节
xlat
out dat8251,al;输出
inc count0;计数
loop state0
endm
start:
mov ax,data
mov ds,ax
mov al,6dh
out cmd8251,al;01,00,11,01停止位1位,无校验,数据位8位,异步方式k=1
mov al,15h
out cmd8251,al;0,0,0,1,0,1,0,1  ,内部复位,,错误标志复位,,允许接收,,允许发送
next:
printf str1,len
delay 50000
jmp next
code ends
end start
  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值