考试只考汇编语言
一、 填空题。(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
2K×8位RAM芯片的外部引脚应有11地址线,8条数据线。
2K=2*1K=2 * 2^10 = 2^11 -->11根地址线
8位 8根数据线
具有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=0;
OF(溢出):一个寄存器如果存放的值超过所能表示范围,就称为溢出,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+2 (2)80H+80H (3)F9H+63H
参考答案:
(1)EFH+2=F1H CF= 0 OF=0 SF=1 ZF=0
(2)80H+80H=00H CF= 1 OF=1 SF=0 ZF=1
(3)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=0
(2)80H-81H=0FFH CF= 0 OF=0 SF=1 ZF=0
(3)F9H-63H=96H CF= 0 OF=0 SF=1 ZF=0
详解:
总结:
CF:看最高位是否进位或借位,如果最高位有进位或借位则CF=1
OF:{1、 (A,B,C都是16进制) A+B=C 若A,B为一负一正则不会溢出,OF=0,
反之看A,B原码的最高位和C的最高位,若A,B原码的最高位和C的原码最高位不同,则为溢出OF=1,
若相同则不溢出,OF=0 也就是说负数+负数=负数为不溢出,负数+负数=正数为溢出
2、(A,B,C都是16进制) A-B=C 若A,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中。
参考答案:
(
1)XOR AX,F000H 高四位取反,异或是相同为0,不同为1
AND AX,F00FH 其他位清0,
OR AX,000FH 低四位为1
(2)MOV AX,DX
AND DX,0842H
XOR DX,0842H
JZ ZERO
┆
ZERO: … DX中的第1、6、11位同时为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