微机原理及应用习题库硬件应用设计题汇编语言程序设计题

更新时间:2024-06-04 11:38:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8 15

假设有一字节型数组ARRAY,编写完整的汇编语言程序求该数组中负数的个数。其中,在该数组的第一个字节存放的是数组中所包含的数据的个数,第二个字节用来存放结果,即数组中负数的个数,数组中的第三个字节开始存放的是数组中的数据。

1. 写出编程思想; 2. 编写完整的源程序。

1. 编程思想

为统计数组中负数的个数,需要逐个判断数组中的每个数据,然后将所有数据中凡是符号位为1的数据的个数累加起来,便是数组中所包含的负数的个数。

2.完整的源程序

STACK SEGMENT STACK DB 256 DUP(?) STACK ENDS DATA SEGMENT

ARRAY DB 200 DUP(?) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX LEA DI,ARRAY MOV SI,DI MOV CL,[DI] XOR CH,CH MOV BL,CH INC DI INC DI

AGAIN:TEST BYTE PTR[DI],80H JZ POSI INC BL POSI: INC DI

LOOP AGAIN MOV [SI]+1,BL MOV AH,4CH INT 21H CODE ENDS

END START

1

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8 15

编一个完整的汇编语言程序,完成从键盘输入一个字符,若输入的是1字符,则在屏幕上显示你的英文名字;若输入的是2字符,则在屏幕上显示你的学号。若输入的不是1或者2字符,则重新输入。

STACK SEGMENT STACK DB 256 DUP(?) STACK ENDS DATA SEGMENT

STRING1 DB ‘DO YOU WANT TO INPUT STRING?(Y/N):$’ CRLF DB 0DH,0AH,’$’

STRING2 DB ‘PLEASE INPUT STRING.’,0DH,0AH,’$’ NAME DB ‘ZHANG SAN.’ ,0DH,0AH,’$’ NUMBER DB ‘020701053.’ ,0DH,0AH,’$’ DATA ENDS

CODE SEGMENT

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

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

MOV AH,01H INT 21H

CMP AL,’Y’ JE INPUT CMP AL,’y’ JNE DONE INPUT: LEA DX,CRLF MOV AH,09H INT 21H

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

AGAIN: MOV AH,01H INT 21H CMP AL,’1’ JE DISPNAME CMP AL,’2’

JE DISPNUMBER

2

JMP AGAIN

DISPNAME: LEA DX,NAME MOV AH,09H INT 21H JMP DONE

DISPNUMBER:LEA DX,NUMBER MOV AH,09H INT 21H

DONE: MOV AH,4CH INT 21H CODE ENDS

END START

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8 15

假设有一字节型数组ARRAY,编写完整的汇编语言程序求该数组中小于80H的数的个数。其中,在该数组的第一个字节存放的是数组中所包含的数据的个数,第二个字节用来存放结果,数组中的第三个字节开始存放的是数组中的数据。

1. 写出编程思想; 2. 编写完整的源程序。

1.编程思想

将数组中的每个数逐个与80H比较,根据大小关系方可统计出数组中小于80H的数的个数 2.完整的源程序

STACK SEGMENT STACK DB 256 DUP(?) STACK ENDS DATA SEGMENT

ARRAY DB 200 DUP(?) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX LEA DI,ARRAY MOV SI,DI MOV CL,[DI] XOR CH,CH MOV BL,CH INC DI

3

INC DI

AGAIN:CMP BYTE PTR[DI],80H JAE L1 INC BL L1: INC DI

LOOP AGAIN MOV [SI]+1,BL MOV AH,4CH INT 21H CODE ENDS

END START

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8 15

在存储器DATABUF以下连续的单元存放着由字符0~ 9或A~ F组成的一串字符(字符个数自定义或用其它方法求解),试编写完整的8086汇编语言程序,将其转换成数字存回原处。 (如某单元的字符为‘1’,即31H,就转换成01H;为‘A’, 即41H,就转换成0AH)

1. 写出编程思想; 2. 编写完整的源程序。

1.编程思想

将存储器DATABUF以下连续的单元中的每个数与39H(1字符的ASCLL码)比较,若该数小于等于39H,则将该数减去30H,否则将该数减去37H,其结果就是该字符对应的数字。 2. 完整的源程序

STACK SEGMENT STACK DB 256 DUP(?) STACK ENDS DATA SEGMENT

DATABUF DB ‘1234ABCDdcsa56’ COUNT EQU $-DATABUF DATA ENDS

CODE SEGMENT

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

MOV SI,OFFSET DATABUF MOV CX,COUNT NEXT: MOV AL,[SI] CMP AL,39H JBE L1

4

SUB AL,7 L1: SUB AL,30H MOV [SI],AL INC SI

LOOP NEXT MOV AH,4CH INT 21H CODE ENDS

END START

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8 15

在当前数据段,偏移地址为DATAB开始的顺序80个单元中,存放着某班80个同学某门课考试的成绩,编写程序统计高于等于90分,80分—89分,70分—79分,60分—69分,低于60分的人数各为多少,将结果放在同一数据段、偏移地址为BTRX开始的顺序单元中。

1. 写出编程思想。 2. 编写完整的源程序。

1. 编程思想

将偏移地址为DATAB开始的顺序80个单元中的数分别与90、80、70、60比较,根据比较的大小关系就可统计出高于等于90分,80分—89分,70分—79分,60分—69分,低于60分的人数。

2. 完整的源程序

STACK SEGMENT STACK DB 256 DUP(?) STACK ENDS DATA SEGMENT

DATAB DB 80 DUP(?) BTRX DB 5 DUP(00H) DATA ENDS

CODE SEGMENT

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

MOV SI,OFFSET DATAB MOV DI,OFFSET BTRX XOR BX,BX XOR DX,DX MOV CX,80 NEXT: MOV AL,[SI]

5

CMP AL,90 JB C80

INC BH ;≥90分的人数 JMP AAA C80: CMP AL,80 JB C70

INC BL ;≥80分的人数 JMP AAA C70: CMP AL,70 JB C60

INC DH ;≥70分的人数 JMP AAA C60: CMP AL,60 JB AAA

INC DL ;≥60分的人数 JMP AAA AAA: INC SI

LOOP NEXT MOV AL,80 SUB AL,BH SUB AL,BL SUB AL,DH

SUB AL,DL ;<50分的人数 MOV [DI],BH MOV [DI]+1,BL MOV [DI]+2,DH MOV [DI]+3,DL MOV [DI]+4,AL MOV AH,4CH INT 21H CODE ENDS

END START

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8 15

编写完整的汇编语言程序,实现从键盘输入一串字符,并在屏幕上显示出来。1. 写出编程思想。

2. 编写完整的汇编语言程序。

1. 编程思想

6

用DOS 0AH号功能完成从键盘输入一串字符,用DOS 09H号功能完成屏幕的显示。 2. 完整的汇编语言程序

STACK SEGMENT STACK DB 256 DUP(?) STACK ENDS DATA SEGMENT

STRING1 DB ‘DO YOU WANT TO INPUT STRING?(Y/N):$’ CRLF DB 0DH,0AH,’$’

STRING2 DB ‘PLEASE INPUT STRING.’,0DH,0AH,’$’ BUFIN DB 20H DB ?

BUFIN1 DB 20H DUP(?) DATA ENDS

CODE SEGMENT

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

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

MOV AH,01H INT 21H

CMP AL,’Y’ JE INPUT CMP AL,’y’ JNE DONE INPUT: LEA DX,CRLF MOV AH,09H INT 21H

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

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

MOV AL,BUFIN+1 CBW

LEA SI,BUFIN+2 ADD SI,AX

MOV BYTE PTR [SI],’$’ LEA DX,CRLF MOV AH,09H INT 21H

LEA DX,BUFIN+2

7

MOV AH,09H INT 21H

MOV AH,4CH INT 21H CODE ENDS

END START

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8 15

已知有100个8位无符号数已存放在缓存区INX中,编写完整的汇编语言程序,实现对这100个数据由高到低排序。

1。写出编程思想。

2。编写完整的汇编语言程序。

1. 编程思想

利用气泡排序法对这100个8位无符号数两两进行比较,从而完成值的大小从大至小排序。 2. 完整的汇编语言程序

STACK SEGMENT STACK DB 256 DUP(?) STACK ENDS DATA SEGMENT

INX DB 100 DUP(?) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV CH,100-1 B10: LEA SI,INX MOV CL,CH B20: MOV AL ,[SI]

CMP AL ,[SI]+1 JAE B30 XCHG AL, [SI]+1 MOV [SI],AL B30: INC SI

DEC CL JNZ B20 DEC CH

JNZ B10

8

MOV AH,4CH INT 21H CODE ENDS

END START

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8 15

编写完整的汇编语言程序,实现以下功能:

从键盘输入一串字符,将其按ASCII码值的大小从小至大排序,并将排好序的新的字符串输 出到屏幕上显示出来。

1。写出编程思想。

2。编写完整的汇编语言程序。

1. 编程思想

用DOS 0AH号功能完成从键盘输入一串字符,利用气泡排序法对输入的字符串中字符两两进行比较,从而完成按ASCII码值的大小从大至小排序。对排好序的新的字符串,用DOS 09H号功能完成屏幕的显示。 2. 完整的汇编语言程序

STACK SEGMENT STACK DB 256 DUP(?) STACK ENDS DATA SEGMENT

STRING1 DB ‘DO YOU WANT TO INPUT STRING?(Y/N):$’ CRLF DB 0DH,0AH,’$’

STRING2 DB ‘PLEASE INPUT STRING.’,0DH,0AH,’$’ BUFIN DB 20H DB ?

BUFIN1 DB 20H DUP(?) DATA ENDS

CODE SEGMENT

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

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

MOV AH,01H INT 21H

CMP AL,’Y’

9

JE INPUT CMP AL,’y’ JNE DONE INPUT: LEA DX,CRLF MOV AH,09H INT 21H

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

B10: B20: B30: DISP: CODE

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

MOV AL,BUFIN+1 CBW

LEA SI,BUFIN+2 ADD SI,AX

MOV BYTE PTR [SI],’$’LEA DX,CRLF MOV AH,09H INT 21H

MOV CH,BUFIN+1 DEC CH

LEA SI,BUFIN+2 MOV CL,CH MOV AL ,[SI]

CMP AL ,[SI]+1 JAE B30 XCHG AL, [SI]+1 MOV [SI],AL INC SI

DEC CL JNZ B20 DEC CH JZ DISP

JMP B10

LEA DX,BUFIN+2 MOV AH,09H INT 21H

MOV AH,4CH INT 21H ENDS

END START 10

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8 15

在首址为DAT的字数组中存放有100个无符号数,求出它们的平均值,并统计大于、等于及小于此平均数的个数。

1. 简述编程思想,画出流程图; 2. 编写完整的源程序。 1. 编程思想

先求出100个无符号数的和,除以100就是平均值;然后用每个数与平均值比较就可得出大于、等于及小于此平均数的个数。 2. 完整的汇编语言程序

STACK SEGMENT STACK DB 256 DUP(?) STACK ENDS DATA SEGMENT

DAT DB 100 DUP(?) LVEL DB 0 GDAT DB 0 EDAT DB 0 LDAT DB 0 DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV CX,100 LEA SI,DAT MOV AX,0 L1: ADD AL,[SI] ADC AH,0 INC SI LOOP L1 MOV BL,100 DIV BL

MOV LVEL,AL MOV CX,100 LEA SI,DAT CMP [SI,AL JA DY JE XD INC LDAT

11

JMP L2

DY: INC GDAT JMP L2 XD: INC EDAT L2: INC SI LOOP L1

MOV AH,4CH INT 21H CODE ENDS

END START

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8 15

编一个完整的汇编语言程序,求某数的绝对值,并将结果放回原处。STACK SEGMENT STACK DB 256 DUP(?) STACK ENDS DATA SEGMENT XADR DW 3456H DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,XADR TEST AX,8000H JNS DONE NEG AX

MOV XADR,AX MOV AH,4CH INT 21H CODE ENDS

END START

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8

12

15

编一个完整的汇编语言程序,完成将以DSRC为首址的连续的100个字节搬家到DDST以下单元。

STACK SEGMENT STACK DB 256 DUP(?) STACK ENDS DATA SEGMENT

DSRC DB 100 DUP(?) DDST DB DUP(?) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX LEA SI,DSRC LEA DI,DDST MOV CX,100 NEXT: MOV AL,[SI] MOV [DI],AL INC SI INC DI

LOOP NEXT MOV AH,4CH INT 21H CODE ENDS

END START

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8 15

编写FAR类型子程序实现以十六进制数在屏幕上显示AL的内容。 1. 写出编程思想。 2. 编写完整的源程序。 CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK DISPLAY PROC FAR

PUSH AX PUSH CX PUSH DX

13

PUSH AX MOV CL,4 ;处理高位十六进制数

SHR AL,CL CALL CHANG ;十六进制数变换成ASCII码

MOV AH,02 MOV DL,AL INT 21H ;显示一位字符

POP AX AND AL,0FH ;处理低位十六进制数 CALL CHANG

;十六进制数变换成ASCII码

MOV AH,02 MOV DL,AL INT 21H ;显示一位字符

POP DX POP CX POP AX RET DISPAL ENDP

CODE ENDS

END DISPLAY

MOV AH,4CH INT 21H CODE ENDS

END START

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8 15

编写FAR类型子程序实现统计一个字(AX)中“1”的个数。

14

1.写出编程思想。 2.编写完整的源程序。 1.编程思想

由于AL中有两位十六进制数,每一位的值为0~9、0AH~0FH,在显示时需要将它们转换成相应的ASCII码,然后调用INT 21H的02H号功能进行显示。 2.完整的源程序 CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

COUNTER1 PROC NEAR PUSH AX

COU1:

SHR AX,1 ADC BL,0 LOOP COU1 MOV CX,16 XOR BL,BL

POP AX RET COUNTER1 ENDP

CODE ENDS

END DISPLAY

微机原理及应用 汇编语言程序设计 第32讲~第38讲 0.8 0.8 15

设在BUFFER中已经保存有字型数据(x1,x2,?,xn),其中前2个字节为数据的个数,计算数据的差分,并保存在DIFF缓冲区中。 1.写出编程思想。 2.编写完整的源程序。 1.编程思想

可根据数据的差分定义来编成计算,其公式为:

dxk?

xk?xk?12(k?1,2,?,n?1)

15

DEC DI

DEC DI

LOOP LP2

POP DI

POP SI POP CX LOOP LP1

POP DI POP SI POP CX POP AX RET SORT

ENDP

PRODUCT PROC NEAR PUSH AX PUSH CX MOV AL,17 MOV BH,59 LEA SI,AVG

PR1:

ADD AL,BH CMP AL,100 JAE PR1 CMP AL,40 JB PR1 MOV [SI],AL INC SI LOOP PR1 POP CX

MOV AL,5

26

;产生模拟数据

PR2:

MOV BH,3 LEA SI,AVG LEA DI,MIN

ADD AL,BH CMP AL,15 JAE PR2 MOV BL,[SI] SUB BL,AL MOV [DI],BL INC SI INC DI LOOP PR2 POP AX RET

PRODUCT ENDP CODE ENDS

END START

第四章 8086汇编语言程序设计

第一节 伪指令(重点?)

CPU指令与伪指令之间的区别:

(1)CPU指令是给CPU的命令,在运行时由CPU执行,每条指令对应CPU的一种特定的操作。而伪指令是给汇编程序的命令,在汇编过程中由汇编程序进行处理。

(2)汇编以后,每条CPU指令产生一一对应的目标代码;而伪指令则不产生与之相应的目标代码。

1、数据定义伪指令

(1)数据定义伪指令的一般格式为: ?[变量名] 伪指令 操作数[,操作数…] DB 用来定义字节(BYTE)

DW 用来定义字(WORD) DD 用来定义双字(DWORD)

27

(2)操作数的类型可以是: ①常数或常数表达式

?例如: DATA_BYTE DB 10,5,10H DATA_WORD DW 100H,100,-4 DATA_DW DD 2*30,0FFFBH ?可以为字符串(定义字符串最好使用DB) ?例如:char1 DB ‘AB’ ?可以为变量

?可以为?号操作符

例如:X DB 5,?,6

?号只是为了给变量保留相应的存储单元,而不赋予变量某个确定的初值。 ?重复次数:N DUP(初值[,初值…]) ?例如:ZERO DB 2 DUP(3,5)

XYZ DB 2 DUP(0,2 DUP(1,3),5)

?在伪操作的操作数字段中若使用$,则表示的是地址计数器的当前值。

2、补充内容:

(1)类型 PTR 地址表达式例如:MOV BYTE PTR [BX],12H

INC BYTE PTR [BX]

注意:单操作数指令,当操作数为基址、变址、基+变的时候必须定义

3、符号定义伪指令 (1)EQU

格式:名字 EQU 表达式

EQU伪指令将表达式的值赋予一个名字,以后可用这个名字来代替上述表达式。 例:CONSTANT EQU 100

NEW_PORT EQU PORT_VAL+1

(2) =(等号)

与EQU类似,但允许重新定义 例:

┇ EMP=7 ;值为7 ┇ EMP=EMP+1 ;值为8

(3)LABEL

LABEL伪指令的用途是定义标号或变量的类型 格式:名字 LABEL 类型

变量的类型可以是BYTE,WORD,DWORD。标号的类型可以是NEAR或FAR

4、段定义伪指令

与段有关的伪指令有:

SEGMENT、ENDS、ASSUME、ORG

28

(1)段定义伪指令的格式如下:

段名 SEGMENT [定位类型] [组合类型] [’类别’]

段名 ENDS

SEGMENT和ENDS

这两个伪指令总是成对出现,二者前面的段名一致。二者之间的删节部分,对数据段、附加段及堆栈段,一般是符号、变量定义等伪指令。对于代码段则是指令及伪指令。此外,还必须明确段和段寄存器的关系,这可由ASSUME语句来实现。

(2)ASSUME 格式:

ASSUME 段寄存器名:段名[,段寄存器名:段名[,…]]

ASSUME伪指令告诉汇编程序,将某一个段寄存器设置为某一个逻辑段址,即明确指出源程序中逻辑段与物理段之间的关系。

(3)ORG

伪指令ORG规定了段内的起始地址或偏移地址,其格式为: ORG <表达式>

表达式的值即为段内的起始地址或偏移地址,从此地址起连续存放程序或数据。

5、汇编程序的一般结构(重点?)(记住) DATA SEGMENT …

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA BGN: MOV AX ,DATA MOV DS,AX ….

MOV AH,4CH INT 21H CODE ENDS END BGN

29

本文来源:https://www.bwwdw.com/article/pim6.html

Top