您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页32位微机原理考试重点

32位微机原理考试重点

来源:意榕旅游网
1,原码:0表示 “+”,1表示“-”,数值位与真值数值位相同。

反码:正数的反码与原码表示相同。负数反码符号位为1,数值位为原码数值各位取反。 补码:正数的补码表示与原码相同。负数补码的符号位为1,数值位等于反码加1。 [X]补= [X]反+1 负数直接求补: 从最低位起,到出现第一个1以前原码中的 数字不变,以后逐位取反,但符号位不变。

2,各种编码方法的表数范围:

n+1位二进制编码x表示的整数范围: 原码、反码:-2n<x<2n 补码:-2n≤x<2n

8位原码、反码的表数范围是-127~+127,补码的表数范围是-128~+127;16位原码、反码的表数范围是-32767~+32767,补码的表数范围是-32768~+32767

3,原码、反码、补码表示小结:

正数的原码、反码、补码表示均相同, 符号位为0,数值位同数的真值。

零的原码和反码均有2个编码,补码只有1个编码。 负数的原码、反码、补码表示均不同, 符号位为1,数值位:原码为数的绝对值 反码为每一位均取反码 补码为反码再在最低位+1

由[X]补求[-X]补:逐位取反(包括符号位),再在最低位+1

4,进位标志CF(Carry Flag):运算结果的最高位产生进位或借位时,或循环指令也会影响该位。

奇偶标志PF(Parity Flag):运算结果的低8位中所含1的个数为偶数个,则该位置1。 辅助进位标志AF(Auxiliary Carry Flag):加减法运算时,如果第3位与第4位之间有进位或借位产生,则该位置1。一般用于BCD运算中是否进行十进制调整的判断依据。零标志ZF(Zero Flag):运算结果为零,则该位置1。 符号标志SF(Sign Flag):与运算结果符号位(即最高位)相同。 溢出标志OF(Overflow Flag):当运算结果超出结果寄存器的表达范围时,该位置1。 跟踪标志TF(Trap Flag):控制CPU按调试的单步方式执行指令。 中断允许标志IF(Interrupt Enable Flag):控制CPU对外部可屏蔽中断(INTR)的响应。当IF=1时,允许CPU响应外部可屏蔽中断;当IF=0时,禁止响应INTR,但不禁止CPU对非屏蔽中断(NMI)的响应。 方向标志DF(Direction Flag):用于控制串操作指令中的地址变化方向 。

5,立即寻址方式:8086 CPU指令系统中,有一部分指令所用的8位或16位操作数就在指令中提供,这种方式叫立即寻址方式。

 例如:

MOV AL,80H;将十六进制数80H送入AL

MOV AX,1090H;将1090H送AX,AH中为10H,AL中为90H

寄存器寻址方式:如果操作数在CPU的内部寄存器中,那么寄存器名可在指令中指出。这种寻址方式就叫寄存器寻址方式。

 例如:

INC CX ;将CX的内容加1

MOV AX, BX ;将BX内容送AX,BX内容不变 ROL AH,1 ;将AH中的内容不带进位循环左移一位

采用寄存器寻址方式的指令在执行时,操作就在CPU内部进行,不需要使用总线周期,执行速度快。

直接寻址方式:使用直接寻址方式,数据在存储器中,存储单元有效地址EA由指令直接指出,所以直接寻址是对存储器进行访问时最简单的方式 例如:MOV AX, [ 2000H ]

寄存器间接寻址方式:采用寄存器间接寻址方式时,操作数一定在存储器中,存储单元的有效地址由寄存器指出。这些寄存器可以是BX,BP,SI和DI,即有效地址等于其中某一个寄存器的值

寄存器相对寻址方式(直接变址寻址):操作数有效地址EA为基址或变址寄存器内容与指令中指定位移量之和,操作数在存储器中。可用寄存器及其对应的默认段情况与寄存器间接寻址方式相同。

基址变址寻址方式:用这种寻址方式时,操作数的有效地址等于基址寄存器的内容加上一个变址寄存器的内容,16位寻址时,基址寄存器可用BX和BP,变址寄存器可用SI和DI;32位寻址时,基址寄存器可用任何32位通用寄存器,变址寄存器可用除ESP以外的32位通用寄存器。

用MOV指令实现两内存字节单元内容的交换 1、MOV BL, [2035H];

MOV CL, [2045H]; MOV [2045H], BL; MOV [2035H], CL; 2、MOV AL, [2035H];

XCHG AL, [2045H]; MOV [2035H], AL;

测试某状态寄存器(端口号27H)的第2位是否为1 IN AL, 27H

TEST AL, 00000100B JNZ ERROR ;若第2位为1,转ERROR处理 设数据段: ADDR1 DF 1234567890ABH

则 LES EBX,ADDR1

指令执行后 (ES)=1234H, (EBX)=567890ABH

【例题】实现两个无符号双字加法运算。设目的操作数存放在DX和AX寄存器中,其中DX存放高位字。源操作数存放在BX、CX中,其中BX存放高位字。如指令执行前(DX)=0002H,(AX)=0F365H,(BX)=0005H,(CX)=0E024H 指令序列为 ADD AX,CX

ADC DX,BX

则第一条指令执行后,(AX)=0D389H,SF=1,ZF=0,CF=1,OF=0 第二条指令执行后,(DX)=0008H,SF=0,ZF=0,CF=0,OF=0 【例题】比较AL的内容数值大小。 CMP AL,100 ;(AL)-100 JB BELOW ;(AL)<100,转到BELOW处执行 SUB AL,100 ;(AL)>=100,(AL)-100→AL INC AH ;(AH)+1→AH BELOW: …

【例题】设x、y、z均为双字长数,它们分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,存放时高位字在高地址中,低位字在低地址中,编写指令序列实现 w← x+y+24 – z,并用w和w+2单元存放运算结果。 MOV AX,X MOV DX,X+2 ADD AX,Y ADC DX,Y+2 ADD AX,24 ADC DX,0 SUB AX,Z SBB DX,Z+2 MOV W,AX MOV W+2,DX

【例题】无符号数0A3H与11H相乘。 MOV AL,0A3H ;(AL)=0A3H MOV BL, 11H ;(BL)=11H MUL BL ;(AX)=0AD3H 【例题】若(AL)= 0B4H,(BL)=11H,求执行指令IMUL BL 和 MUL BL 后的乘积值。

(AL)= 0B4H为无符号数的180D,带符号数的-76D (BL)=11H为无符号数的17D,带符号数的17D

则执行IMUL BL 的结果为(AX)=0FAF4H =-1292D,CF=OF=1 执行MUL BL 的结果为(AX)= 0BF4H = 3060D,CF=OF=1 【例题】写出实现无符号数0400H/0B4H运算的程序段。 MOV AX,0400H ;(AX)=0400H MOV BL,0B4H ;(BL)=0B4H DIV BL ;商(AL)=05H,余数(AH)=7CH 【例题】写出实现有符号数0400H /0B4H运算的程序段。 MOV AX,0400H ;(AX)=0400H MOV BL,0B4H ;(BL)=0B4H IDIV BL ;(AL)=0F3H,(AH)=24H

算术运算综合举例【例3-36】

计算:(C-120 + A*B) / C,保存商和余数到X和Y中,其中A、B、C、X和Y都是有符号的字变量 。编制程序如下: MOV AX, C

SUB AX, 120 CWD

MOV CX, DX

MOV BX, AX ;(CX, BX)←(DX, AX) MOV AX, A

IMUL B ; (DX, AX)←A*B ADD AX, BX ;计算32位二进制之和 ADC DX, CX

IDIV C ;AX是商,DX是余数 MOV X, AX ;保存商到指定单元 MOV Y, DX …

课堂练习 计算:(V-(X*Y+Z-540))/X,其中X,Y,Z,V均为16位带符号数,已分别装入X,Y,Z,V单元中,上式计算结果的商存入AX,余数存入DX寄存器。编制程序如下: mov ax, x imul y mov cx, ax mov bx, dx mov ax, z cwd

add cx, ax adc bx, dx sub cx, 540 sbb bx, 0 mov ax, v cwd

sub ax, cx sbb dx, bx idiv x

【例题】压缩BCD码的加法运算。 MOV AL,68H ;(AL)=68H,表示压缩BCD码68 MOV BL,28H ;(BL)=28H,表示压缩BCD码28 ADD AL,BL ;二进制加法:(AL)=68H+28H=90H DAA ;十进制调整:(AL)=96H ;实现压缩BCD码加法:68+28=96 【例题】压缩BCD码的减法运算。 MOV AL,68H ;(AL)=68H,表示压缩BCD码68 MOV BL,28H ;(BL)=28H,表示压缩BCD码28 SUB AL,BL ;二进制减法:(AL)=68H-28H=40H DAS ;十进制调整:(AL)=40H ;实现压缩BCD码减法:68-28=40

【例题】 AND AL,77H ;将AL中第3位和第7位清零。 AND AX,BX ;两个寄存器逻辑与

AND AL,1111 0000B ;屏蔽AL寄存器低4位 AND MEM-BYTE,AL;存储单元和寄存器逻辑与 例题】

OR AL,88H ;将AL寄存器中第3位和第7位置1 OR BX,0C000H ;将BX中第15位和第14位置1 【例题】逻辑非运算。 MOV AX,878AH ;(AX)=878AH NOT AX ;(AX)=7875H NOT WORD PTR[1000H];将1000H和1001H两单 ;元中的内容求反码,再送回这两单元中

【例题】测试AX中的第12位是否为0,不为0则转L。 TEST AX,1000H JNE L / JNZ L

例3-54:(BX)=84F1H,把 (BX) 中的 16 位数每 4 位压入堆栈 MOV CH, 2 ; 循环次数 MOV CL, 4 ; 移位次数 NEXT: ROL BX, CL MOV AH, BL AND AH, 0FH ROL BX, CL MOV AL, BL AND AL, 0FH PUSH AX DEC CH JNZ NEXT

例题:设BLOCK数据块中存储有正数和负数,试编写程序将正负数分开,分别存放在Dplus和Dminus开始的存储区域 mov si,offset block mov di,offset dplus mov bx,offset dminus mov ax,ds mov es,ax ;数据都在一个段中,所以设置es=ds mov cx,count ;cx←字节数 cld

go_on: lodsb ;从block取出一个数据 test al,80h ;检测符号位,判断是正是负 jnz minus ;符号位为1,是负数,转向minus stosb ;符号位为0,是正数,存入dplus jmp again ;程序转移到again处继续执行 minus: xchg bx,di stosb ;把负数存入dminus xchg bx,di

again: loop go_on ;字节数减1

例:检验一段被传送过的数据是否与源串完全相 同,程序如下: CLD

MOV CX,100 初始化 MOV SI,2400H MOV DI,1200H;

REPE CMPSB ;串比较,直到ZF=0或CX=0 JZ EQQ DEC SI

MOV BX,SI ;第一个不相同字节偏移地址→BX MOV AL,[SI] ;第一个不相同字节内容→AL JMP STOP

EQQ: MOV BX,0 ;两串完全相同,BX=0 STOP:HLT

 例题:在某字符串中查找是否存在“$”字符。若存在,则将“$”字符所在地址送入

BX寄存器中,否则将BX寄存器清“0”。程序如下: CLD ;清除方向标志DF MOV DI,0100H ;送目标串首元素偏移地址 MOV CX,100 ;字串长度 MOV AL,′$′ ;关键字→AL REPNE SCASB ;找关键字 JNZ ZER ;判断是否找到 DEC DI MOV BX,DI ;关键字所在地址→BX JMP ST0 ZER: MOV BX,0 ;未找到,0→BX ST0: HLT

例题:比较两个长度为count的字符串是否完全相同,若相同置al=0,不相同置al=0ffh mov si,offset string1 mov di,offset string2 mov cx,count cld mov al,0ffh ;标记初始为不同 mov al,0 ;字符串相等,设置00h output:mov result,al ;输出结果标记

 例3.61 若AL最高位为0,设置(AH)=0;若AL最高位为1,则设置(AH)=FFH。

即编程实现符号扩展指令CBW功能  方法一:用JZ指令实现。 test al, 80h ;测试最高位 jz set0 ;最高位为0则转到set0 mov ah, 0ffh ;最高位为1,则将AH置0FFH jmp next ;无条件转向next set0: mov ah, 0

next:…

 方法二:用JNZ指令实现。 test al, 80h ;测试最高位 jnz set1 ;最高位为1则转到set1 mov ah, 0h ;最高位为0,则将AH置0 jmp next ;无条件转向next set1: mov ah, 0ffh next:…

 例3.62 计算|X-Y|,X和Y是存放于X单元和Y单元的16位操作数,结果存入

result mov ax, X

sub ax, Y ;X-Y送AX,下面求绝对值

jns next ;绝对值为正,不需处理,转向next保存结果 neg ax ;绝对值为负,进行求补得到绝对值 next: mov result, ax ;保存结果  例3.63 编写程序段判断DX中1的个数 xor al, al

again: test dx, offffh ;等价于cmp bx,0 je next shl dx, 1 jnc again inc al jmp again

next: … ;AL保存1的个数

例3.64 比较AX和BX中两个无符号数的大小,将较小的存放到AX中 cmp ax, bx ;比较ax和bx JB next ;若ax<bx,则转移到next xchg ax, bx ;若ax≥bx,则两者交换 next: …

例3.65 比较AX和BX中两个有符号数的大小,将较小的存放到AX中 cmp ax, bx ;比较ax和bx JL next ;若ax<bx,则转移到next xchg ax, bx ;若ax≥bx,则两者交换 next: …

例3.66 a、b是双精度数,分别存于DX,AX 及BX,CX 中,a > b时转 L1,否则转L2 cmp dx, bx ;比较dx和bx JG l1 ;若dx>bx,则转移到l1 JL l2 ;若dx<bx,则转移到l2 cmp ax, cx ;若dx=bx,则比较ax和cx JA l1 ;若ax>cx,则转移到l1 l2: …… l1: ……

例3-67:求首地址为 ARRAY 的 n个字之和,结果存入 sum单元

mov cx, n ;将计数值n送CX xor ax, ax ;累加器AX清零 xor dx, dx ;DX清零 xor si, si ;SI清零 again: add ax, array[si] ;将下一个数据累加到AX adc dx, 0 ;将产生的进位累加到DX

add si, 2 ;SI加2,指向下一个数据 loop again ;若CX不为0,继续循环 mov sum, ax ;结果低16位送sum单元 例4.21】

 (1)编写程序把 BX 中的二进制数以十六进制数的形式显示在屏幕上 。 CODE SEGMENT ASSUME CS:CODE

START: MOV CH, 4 ;设置循环初值为4 ROTAT: MOV CL, 4 ROL BX, CL ;BX循环左移4位 MOV AL, BL

AND AL, 0FH ;把最右面要显示的4位取到AL中 ADD AL, 30H ;将其加30H转换为ASCII码 CMP AL, 3AH ;判断是否大于9 JL PRINT ;“0”~“9”,转向PRINTIT直接显示 ADD AL, 7H ;“A” ~“F”, ASCII 值再加7 PRINT: MOV DL, AL ;2号功能调用,显示该字符 MOV AH, 2 INT 21H DEC CH JNZ ROTAT ;若循环次数未到,则继续循环 MOV AH, 4CH INT 21H ;程序结束,返回DOS CODE ENDS END START

【例4.24】 数据段中从BUF单元开始的数据区内存放着一组有符号字数据,其中第一个单元存放数组元素个数,请编一程序求出该数组中的最大值、最小值及总和,并分别存入MAX、MIN、SUM单元中 DATA SEGMENT BUF DW 12 DW 5,-4,0,3,100,-51,69,-21,-5,255,33,150 MAX DW ? MIN DW ? SUM DW ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE, DS:DATA

START: MOV AX, DATA MOV DS, AX MOV SI, 2 ;初始化SI、AX、BX、DX MOV AX, BUF[SI] MOV BX, BUF[SI] MOV DX, BUF[SI] MOV CX, BUF ;初始化循环计数器CX DEC CX L: ADD SI, 2

CMP BX, BUF[SI] ;比较 JL LESS

CMP DX, BUF[SI] JG GREATER JMP S

LESS: MOV BX, BUF[SI] ;大数送入BX JMP S

GREATER: MOV DX, BUF[SI] ;小数送入DX S: ADD AX, BUF[SI] ;求累加和,送入AX LOOP L

MOV MAX,BX ;最大值、最小值及总和分别存 MOV MIN,DX ;入MAX、MIN、SUM单元 MOV SUM,AX MOV AH,4CH INT 21H CODE ENDS END START

例4.25】字符串STRING以回车符作为结束标志,编程统计该字符串的长度 DATA SEGMENT LEN DB ?

STRING DB „computer science and technology‟,0DH DATA ENDS

CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV AX, DATA MOV DS, AX MOV ES, AX LEA DI, STRING ;串的首地址送入DI MOV DL, 0 ;置串长度初值为0 MOV AL, 0DH ;串结束标志送入AL AGAIN: SCASB ;搜索串 JE DONE ;找到结束标志,转向DONE结束 INC DL ;否则,串长度加1 JMP AGAIN

DONE: MOV LEN,DL ;串长度送入LEN

MOV AH, 4CH INT 21H

CODE ENDS END START

【例4.20】从键盘接收两个有符号十进制数,并求它们的和,再将结果以有符号十进制数的形式在屏幕上显示输出。 DATA SEGMENT

MES1 DB „input the first number:$‟ MES2 DB „input the second number:$‟ MES3 DB „the sum is:$‟ X DW ? Y DW ? SUM DW ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX MOV DX,OFFSET MES1 MOV AH,9 INT 21H ;显示输入提示信息 CALL READ ;调用子程序READ,输入第一个数 MOV X,AX ;将输入的第一个数送入变量X CALL CRLF ;调用子程序CRLF MOV DX,OFFSET MES2 MOV AH,9 INT 21H ;显示输入提示信息 CALL READ ;调用子程序READ,输入第二个数 MOV Y,AX ;将输入的第二个数送入变量Y ADD AX,X ;两数相加 MOV SUM,AX ;和送到SUM,入口参数 MOV DX,OFFSET MES3 MOV AH,9 INT 21H ;显示输出提示信息 CALL WRITE ;调用子程序WRITE,显示结果 MOV AH,4CH INT 21H

READ PROC NEAR ;输入有符号十进制数的子程序READ PUSH BX PUSH CX PUSH DX XOR BX,BX ;用BX保存结果 XOR CX,CX ;正负标志,0为正,-1为负

MOV AH,1 ;输入一个字符 INT 21H

CMP AL, „+‟ ;比较是否为“+” JZ READ1 ;是“+”,转向READ1继续输入 CMP AL,„-‟ ;否则,比较是否为“-” JNZ READ2 “+”和“-”,转向READ2 MOV CX,-1 ;是“-”,设置-1标志 Read1: … Read2: … Read3: … Read4: … READ ENDP

READ1: MOV AH,1 ;继续输入字符 INT 21H

READ2: CMP AL,„0‟ ;是否在0~9之间 JB READ3 ;数据结束 CMP AL,„9‟ JA READ3

SUB AL,30H ;在0~9之间,转换为对应数值 SHL BX,1 ;用移位指令实现已输入数值乘10 MOV DX,BX ;即:(BX)←(BX)×10 SHL BX, 1 SHL BX, 1 ADD BX, DX

MOV AH, 0 ;已输入数值乘10+新输入值 ADD BX, AX ;相加 JMP READ1 ;继续输入字符

READ3: CMP CX, 0 ;判断该数值正负 JZ READ4 ;是正数,转向READ4 NEG BX ;是负数,进行求补

READ4: MOV AX, BX ;出口参数,数值送入AX POP DX POP CX POP BX RET ;子程序返回

READ ENDP

WRITE PROC NEAR ;显示有符号十进制数的子程序WRITE PUSH AX PUSH BX PUSH DX

MOV AX, SUM ;取出要显示的数据 TEST AX, AX ;判断零、正数或负数 JNZ WRITE1

;不是

MOV DL, „0‟ ;是零,显示“0”后退出 MOV AH, 2 INT 21H

JMP WRITE5

WRITE1:JNS WRITE2; ;是正数,转向WRITE2

MOV BX, AX ;是负数, AX数据暂存于BX以免被修改 MOV DL, „-‟ ;显示“-” MOV AH, 2 INT 21H

MOV AX, BX ;恢复 AX数据 NEG AX ;数据求补(求绝对值) WRITE2:MOV BX, 10 PUSH BX ;10压入堆栈,作为退出标志 WRITE3:CMP AX, 0 ;数据(商)是否为零 JZ WRITE4 ;为零转向显示 SUB DX, DX ;扩展被除数(DX,AX),DX清零 DIV BX ;数据除以10:(DX,AX)÷10 ADD DL, 30H ;余数(0~9)转换为ASCII码 PUSH DX ;数据各位先低位后高位压入堆栈 JMP WRITE3

WRITE4:POP DX ;数据各位先高位后低位弹出堆栈 CMP DL, 10 ;是结束标志10,则退出 JE WRITE5

MOV AH, 2 ;进行显示 INT 21H

JMP WRITE4 WRITE5:POP DX POP BX POP AX RET ;子程序返回 WRITE ENDP

CRLF PROC NEAR ;使光标回车换行的子程序 PUSH AX PUSH DX MOV AH, 2 MOV DL, 0DH INT 21H ;显示回车符 MOV DL, 0AH INT 21H ;显示换行符 POP DX POP AX RET

CRLF ENDP

CODE ENDS END START

(1) 设计要求: 在源程序中设置数据段、堆栈段及代码段。在数据段中定义8个字节数据,把这些数据转换成十六进制数的ASCII码存在上述数据之后,然后在屏幕上显示这些数据。显示数据用DOS功能2号调用,每个数据用空格分隔。 1:NAME EX1 ;程序命名伪指令,程序名为EX1 2:PAGE 50,70 ;列表文件每页50行每行70字符 3:;---------------------------------------------------- 4:DAT SEGMENT PARA ′DAT′

5: A1 DB 12H,34H,56H,78H,9AH 6: DB 0BCH,0DEH,0F0H

7: B1=$-A1 ;赋值伪指令,求A1(符号地址)到当

前汇编指针地址($)的字节数 8: B2=B1*2 ;求2倍B1

9: A2 DB B2 DUP (?); 数据重复定义伪指令,定

义ASCII码字符区 10:DAT ENDS 11:;---------------------------------------------------- 11: ;---------------------------------------------------- 12: STAC SEGMENT PARA STACK ′STA′ 13: STA1 DW 100DUP(?) 14: STAC ENDS

15: ;---------------------------------------------------- 16: CODE SEGMENT PARA ′CODE′ 17: ASSUME CS:CODE,DS:DAT 18: ASSUME SS:STAC,ES:DAT 19: STAR PROC FAR 20: PUSH DS

21: XOR AX,AX 22: PUSH AX 23: MOV AX,DAT

24: MOV DS,AX ;段寄存器赋值 25: MOV ES,AX

26: LEA SI,A1 ;取有效地址 27: LEA DI,A2

28: MOV CX,B1 ;循环次数

29:G1:MOV BL,2 ;每个字节处理两次 30: MOV AL,[SI] ;被处理的字节送AL 31: MOV BH,AL ; AL暂存到BH 32: PUSH CX 33: MOV CL,4

34: ROR AL,CL ;循环右移4位 35: POP CX

36:G2:AND AL,0FH ;取AL低4位,高4位清零 37: ADD AL, 30H 38: CMP AL, 3AH JB AA 39: ADD AL,7 40:AA: MOV [DI],AL ;处理完毕送目标地址 41: INC DI

42: MOV AL,BH 43: DEC BL 44: JNZ G2 45: INC SI

46: LOOP G1 ;CX-1,若CX≠0则返回G1 47:MOV SIOFFSET A2 ;A2的偏移地址送SI寄存器 48:MOV CX,B2 49:CALL P1 50:RET

显示ASCII码字符子程序如下: 51:P1 PROC

52: MOV BL,2 53:G: MOV DL,[SI] 54: MOV AH,2 55: INT 21H

56: INC SI 57: DEC BL 58: JNZ T

59: MOV DL,′′ ;加空格 60: MOV AH,2 61: INT 21H 62: MOV BL,2

63:T: LOOP G ;cx-1循环处理 64: RET 65:P1 ENDP 66:CODE ENDS 67: END STAR

例9-3】 利用8255A的A口方式0与微型打印机相连,将内存缓冲区BUFF中的字符打印输出。试完成相应的软硬件设计。(CPU为8088)  说明:

• 由PC0充当打印机的选通信号,通过对PC0的置位/复位来产生选通。同时,由PC7

来接收打印机发出的“BUSY”信号作为能否输出的查询。

• 8255A的控制字为:10001000 即88H

• A口方式0,输出;C口高位方式0输入,低位方式0输出 • PC0置位: 00000001 即 01H • PC0复位: 00000000 即 00H

• 8255A的4个口地址分别为:00H,01H,02H,03H。  DADA SEGMENT

BUFF DB 'This is a print program!','$'  DATA ENDS

 CODE SEGMENT

ASSUME CS:CODE, DS:DATA START:MOV AX, DATA MOV DS, AX

MOV SI,OFFSET BUFF

MOV AL, 88H ;8255A初始化,A口方式0,输出

OUT 03H, AL ; C口高位方式0输入,低位方式0输出 MOV AL, 01H;

OUT 03H,AL ;使PC0置位,即使选通无效 WAIT: IN AL, 02H

TEST AL, 80H ;检测PC7是否为1即是否忙 JNZ WAIT ; 为忙则等待 MOV AL,[SI]

CMP AL,'$' ;是否结束符 JZ DONE ; 是则输出回车

OUT 00H,AL ;不是结束符,则从A口输出 MOV AL,00H OUT 03H, AL MOV AL, 01H

OUT 03H,AL ;产生选通信号

INC SI ;修改指针,指向下一个字符 JMP WAIT

DONE: MOV AL,0DH

OUT 00H,AL ;输出回车符 MOV AL, 00H OUT 03H,AL MOV AL, 01H

OUT 03H,AL ;产生选通 WAIT1: IN AL, 02H

TEST AL, 80H ;检测PC7是否为1 JNZ WAIT1 ; 为忙则等待 MOV AL,0AH

OUT 00H,AL ;输出换行符 MOV AL, 00H OUT 03H,AL

MOV AL, 01H OUT 03H,AL MOV AH,4CH INT 21H CODE ENDS

END START

 利用8086、8255A、输入开关、发光二极管,完成如下功能

 8255A的A口读取开关K1状态,B口连接发光二极管L1~L8。设开关闭合时读入

的值为1,开关断开时读入的值为0;端口输出为0时灯亮。若开关K1=0,发光二极管全灭;若开关K1=1,发光二极管从左向右循环点亮;

 (1)若用IOYa(有效时A15-A4的状态为000000101001)选通8255A,用8086

的A0 A1信号进行口选择,给出8255A的四个口地址。(2)为完成上述实验功能,请在图上画出接线图。

(3)编写汇编程序,完成上述功能。(主程序可调用延时1秒子程序DELAY和按任意键退出子程序BREAK,假定这两个子程序已存在,不需编写)  (1)8255A的四个口地址:290H,291H,292H,293H  (2)连线

MY_STACK

SEGMENT

DB 100 DUP(?) MY_STACK ENDS

MY_DATA SEGMENT P8255_A DW 0290H P8255_B DW 0291H P8255_C DW 0292H P8255_M DW 0293H LA DB ? MY_DATA ENDS

MY_CODE SEGMENT

ASSUME CS:MY_CODE, DS:MY_DATA, SS:MY_STACK START: MOV AX,MY_DATA MOV DS,AX

MOV DX,P8255_M ;设置8255控制字 MOV AL,90H ;1001 0000 OUT DX,AL MOV LA,FEH ;初值1111 1110 AA: MOV DX,P8255_A ;读取A口状态 IN AL,DX

TEST AL,01H

JZ ALL1 ;K1=0跳转ALL1 MOV AL,LA ROL AL,1 MOV LA ,AL

MOV DX,P8255_B OUT DX,AL ;输出 CALL DELAY CALL BREAK JMP AA

ALL1:MOV DX,P8255_B

MOV AL,0FFH ;灯全灭 OUT DX,AL CALL DELAY CALL BREAK JMP AA

MY_CODE ENDS END START

 【例10-1】 若要查询8251A接收器是否准备好,则可用下列程序段完成 MOV DX,0FFF2H ;状态口 L:IN AL,DX ;读状态口 AND AL,02H ;查Dl=1?准备好了吗? JZ L ;未准备好,则等待 MOV DX, 0FFF0H ;数据口 IN AL,DX ;已准备好则输入数据 异步模式下的初始化程序举例

 设8251A工作在异步模式,波特率系数(因子)为16,7个数据位/字符,偶校验,2

个停止位,发送、接收允许,设端口地址为00E2H和00E4H。完成初始化程序  根据题目,可确定模式字为:11111010B即FAH,控制字为:00110111B 即37H,

初始化程序如下:

 MOV AL, 0FAH ;送模式字  MOV DX,00E2H

 OUT DX, AL ;异步,7位/字符,偶校验,2个停止位

 MOV AL,37H ;设置控制字,使发送、接收允许,清出错标志

 OUT DX, AL ;有效

同步模式下的初始化程序举例  设端口地址为52H,采用内同步方式,2个同步字符(设同步字符为16H),偶校验,

7位数据位/字符

 根据题目,可确定模式字为:00111000B即38H,控制字为:10010111B即97H。

它使8251A对同步字符进行检索;同时使状态寄存器中的3个出错标志复位;使8251A的发送器、接收器启动;控制字还通知8251A,CPU当前已经准备好进行数据传输。初始化程序如下:

 MOV AL,38H ;设置模式字,同步,用2个同步字符,  OUT 52H,AL ; 7个数据位,偶校验  MOV AL,16H

 OUT 52H,AL ;送同步字符16H  OUT 52H,AL

 MOV AL, 97H ;设置控制字,使发送器和接收器启动  OUT 52H, AL

利用状态字进行编程的举例

 先对8251A进行初始化,然后对状态字进行测试,以便输入字符。本程序段可用来

输入80个字符。

 8251A的控制和状态端口地址为52H,数据输入和输出端口地址为50H。字符输入

后,放在BUFFER标号所指的内存缓冲区中 。程序如下:

 MOV AL,0FAH ;设置模式字,异步,波特率因子为16,  OUT 52H,AL ;用7个数据位,2个停止位,偶校验  MOV AL,35H ;设置控制字,使发送器和接收器启动,  OUT 52H,AL ;并清除出错指示位  MOV DI,0 ;变址寄存器初始化

 MOV CX,80 ;计数器初始化,共收取80个字符

两台微型计算机通过8251A相互通信的举例

 通过8251A实现相距较远的两台微型计算机相互通信。利用两片8251A通过标准串

行接口RS-232C实现两台8086微机之问的串行通信,可采用异步或同步工作方式 。 两台微型机通过8251A通信举例(发送端初始化程序与发送控制程序)

 STT: MOV DX,8251A控制端口  MOV AL,7FH

 OUT DX,AL ;将825lA定义为异步方式,8位数据,1位停止位  MOV AL,11H ;偶校验,取波特率系数为64,允许发送。  OUT DX,AL

 MOV DI,发送数据块首地址 ;设置地址指针  MOV CX,发送数据块字节数 ;设置计数器初值  NEXT:MOV DX,8251A控制端口  IN AL,DX

 AND AL,01H ;查询TXRDY有效否?  JZ NEXT ;无效则等待  MOV DX,8251A数据端口、

 MOV AL,[DI]; ;向8251A输出一个字节数据。  OUT DX,AL

 INC DI ;修改地址指针

 LOOP NEXT ;未传输完,则继续下一个  HLT

 SRR:MOV DX,8251A控制端口  MOV AL,7FH

 OUT DX,AL ;初始化8251A,异步方式,8位数据

 MOV AL, 14H ;1位停止位,偶校验,波特率系数64,允许接收。  OUT DX,AL

 MOV DI,接收数据块首地址 ;设置地址指针  MOV CX,接收数据块字节数;设置计数器初值  COMT:MOV DX,8251A控制端口  IN AL,DX

 ROR AL,1 ;查询RXRDY有效否?  ROR AL,1

 JNC COMT ;无效则等待  ROR AL,1

 ROR AL,1 ;有效时,进一步查询是否有奇偶校验错。  JC ERR ;有错时,转出错处理  MOV DX,8251A数据端口

 IN AL,DX ;无错时,输入一个字节到接收数据块。  MOV [DI],AL

 INC DI ;修改地址指针

 LOOP COMT ;未传输完,则继续下一个  HLT

 ERR:CALL ERR-OUT

编写查询方式下的串口通讯程序,实现两台计算机简单通讯,在A机上键入的字符,在B机上显示;反之亦然 CODE SEGMENT

ASSUME CS:CODE START PROC FAR MOV DX, 3FBH MOV AL, 80H OUT DX, AL

MOV DX, 3F8H MOV AL, 12

OUT DX, AL;除数低位 MOV DX, 3F9H MOV AL, 0

OUT DX, AL;除数高位 MOV DX,3FBH MOV AL,03H

OUT DX,AL;设置通讯字 MOV DX,3F9H MOV AL,0

OUT DX,AL;中断允许字 MOV DX,3FCH MOV AL,0AH

OUT DX,AL;Modem控制字 LP1: MOV AH, 1 INT 16H

JZ PP ;未按键 MOV AH,1

INT 21H ;键入字符 MOV DX,3F8H

OUT DX,AL ;发送 PP: MOV DX,3FDH

IN AL,DX ;读状态 TEST AL,01H

JZ QQ ;未准备好

MOV DX,3F8H

IN AL, DX ;接收字符 MOV DL, AL MOV AH, 2

INT 21H ;显示字符 QQ: JMP LP1 RET START ENDP CODE ENDS

END START

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务