搜索
您的当前位置:首页微机原理及应用B习题【部分】及解答

微机原理及应用B习题【部分】及解答

来源:乌哈旅游
1、试编写求两个无符号双字长数之和的程序。两数分别在MEM1和MEM2单元中,和放在SUM单元。

解:STACK SEGMENT STACK DW 64 DUP(?) STACK ENDS DATA SEGMENT

MEM1 DW 7890H,5678H MEM2 DW 1234H,4786H SUM DW 2 DUP(?) DATA ENDS CODE SEGMENT

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

MOV DS,AX LEA SI,MEM1 LEA DI,MEM2 LEA BX,SUM MOV AX,[SI] ADD AX,[DI] MOV [BX],AX INC SI INC SI INC DI

INC DI INC BX INC BX

MOV AX,[SI] ADC AX,[DI] MOV [BX],AX

MOV AH,4CH INT 21H

CODE ENDS END START

设计的两个数分别是:56787890,47861234。运行结果显示知:SUM单元07188--0718B存入了最后结果,可得:56787890+47861234=9DFE8AC4。

2、试编写程序,比较AX,BX,CX中带符号数的大小,并将最大的数放在AX中。

解:STACK SEGMENT STACK

DW 64 DUP(?) STACK ENDS DATA SEGMENT

MEM DW 1234H,5611H,1221H CODE SEGMENT

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

MOV DS,AX

LEA DI,MEM ;取出3个数

MOV AX,[DI]

MOV BX,[DI+02H] MOV CX,[DI+04H] CMP AX,BX JLE A1

CMP AX,CX JLE A3

MOV AX,AX JMP A5

A1: CMP BX,CX

JLE A3

MOV AX,BX JMP A5

A3: MOV AX,CX

JMP A5

A5: HLT ;程序运行到此暂停,查看AX的值可知结果,接下来的命 MOV AH,4CH ;令需用AH,故,如果程序运行完再查看AX,则看不到结果。 INT 21H CODE ENDS END START

存入的三个数:1234H,5611H,1221H.运行后的最大的数的结果在AX显示为:5611H。

3、请用子程序结构编写如下程序:从键盘输入一个二位十进制的月份数(01~12),然后显示出相应的英文缩写名。 解:STACK SEGMENT DW 64 DUP(?)

STACK ENDS

DATA SEGMENT

BUFF1 DB 'PLEASE WRITE YOUR NUMBER:','$' ;输入界面 BUFF2 DB 'THE MONTH IS:','$' ;输出界面 BUFF3 DB 3 ;缓存地址 DB ?

DB 3 DUP (?) BUFF4

'JAN$','FEB$','MAR$','APR$','MAY$','JUN$','JNL$','AUG$','SEPT$' ,'OCT$','NOV$','DEC$'

BUFF5 DB 'WRONG INPUT!$' ;错误输入提示 DB

DATA ENDS

CODE SEGMENT

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

MOV DX,OFFSET BUFF1 MOV AH,09H INT 21H

XOR DX,DX

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

MOV DL,0DH MOV AH,2H INT 21H

MOV DL,0AH MOV AH,2H INT 21H

MOV DX,OFFSET BUFF2 MOV AH,09H INT 21H

XOR AX,AX XOR BX,BX MOV AL,0AH

MOV DI,OFFSET BUFF3 MOV BH,[DI+02H] MOV BL,[DI+03H] SUB BH,30H MUL BH AND BX,0FH ADD BX,AX DEC BX XOR AX,AX MOV AL,04H

MUL BL XOR BX,BX

;显示第一行 ;输入月份(01—12) ;回车换行 ;显示第二行 ;主程序开始

LEA DI,BUFF4 MOV BX,DI ADD BX,AX

CMP AL,30H ;判断输入月份是否超出12月,超 JA A2 ;出则输出错误提示 JMP A4

A2: MOV DX,OFFSET BUFF5 MOV AH,09H INT 21H JMP A5 A4: CMP AL,20H ;判断输入月份否大于等于9月 JA A1 JMP A3 A1: INC BX JMP A3

A3: MOV DX,BX ;显示(01-12月份)的结果 MOV AH,09H INT 21H

A5: MOV AH,4CH INT 21H CODE ENDS END START

在输入界面上输入02,则显示:

若输入错误月份则显示:

4、编写一程序段,把从BUFFER开始的100个字节的内存区域初始化成55H、0AAH、55H、0AAH、…、55H、0AAH。 解:STACK SEGMENT DW 64 DUP(?) STACK ENDS

DATA SEGMENT BUFF DB 100 DUP(?) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX XOR CX,CX MOV CX,32H

MOV DI,OFFSET BUFF A1:

MOV [DI],55H

MOV [DI+01H],0AAH INC DI INC DI DEC CX JNE A1

A2:XOR AX,AX MOV AH,4CH INT 21H CODE ENDS END START

运行上面程序,则可以看到存数器内地址07180—071E3共100个位置依次初始化为55H,0AAH,55H,0AAH....

5、试编写程序,从键盘中读入20个无符号十进制整数(<65535),并升序排序后输出。

解:STACK SEGMENT DW 128 DUP(?) STACK ENDS DATA SEGMENT

ARR DW 50 DUP(?) ;存放输入的数 STR DW 50 DUP(?) ;输出字符串

COUNT DW ? ;输入数的个数 DATA ENDS

CODE SEGMENT

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

MOV AX,STACK MOV SS,AX

LEA SI,ARR

MOV DI,0 ;DI用来标志是否输入了回车

L1: CALL DCB ;将输入的十进制数化为二进制存在BX INC COUNT MOV [SI],BX

CMP DI,0 ;有回车是,输入结束 JNZ L2 ADD SI,2

JMP L1

L2: CALL BBB ;回车换行

SUB COUNT,1 ;将输入个数减1 CALL SORTP ;采用冒泡排序法

ADD COUNT,1 ;输入个数加1,即为原输入个数 MOV CX,COUNT LEA DI,ARR

LEA SI,STR L3: MOV AX,[DI]

CALL BCD ;将AX中的进制数化为十进制依次存在[SI]

ADD DI,2 LOOP L3

DEC SI ;去掉最后一个\号 MOV [SI], BYTE PTR 0DH MOV [SI+1], BYTE PTR 0AH MOV [SI+2], BYTE PTR '$' LEA DX,STR MOV AH,9 INT 21H MOV AH,4CH INT 21H

BBB PROC ;子程序BBB PUSH AX PUSH DX MOV DL,0DH MOV AH,2 INT 21H

MOV DL,0AH MOV AH,2 INT 21H POP DX POP AX RET

BBB ENDP

DCB PROC ;子程序DCB PUSH AX PUSH CX MOV BX,0

NEW: MOV AH,1

INT 21H

CMP AL,',' ;如果是分号,则输入一个十进制数结束 JZ NDIG

CMP AL,0DH ;如果是回车,则置DI为1输入结束 JNZ NHC MOV DI,1 NDIG: POP CX POP AX RET

NHC: CMP AL,30H JL NDIG CMP AL,39H JG NDIG AND AL,0FH CBW

XCHG AX,BX MOV CX,10 MUL CX

XCHG AX,BX ADD BX,AX JMP NEW DCB ENDP

BCD PROC ;子程序BCD PUSH AX PUSH BX PUSH CX PUSH DX MOV BX,10 MOV CX,0 R1: MOV DX,0 DIV BX PUSH DX INC CX OR AX,AX JNZ R1 R2: POP AX CMP AL,10 JB R3

ADD AL,7H R3: ADD AL,30H MOV [SI],AL INC SI LOOP R2

MOV [SI],BYTE PTR ',' ;每个数后放一个','号 INC SI POP DX POP CX

POP BX POP AX RET BCD ENDP

SORTP PROC ;子程序SORTP PUSH AX

PUSH BX PUSH CX PUSH DI PUSH SI

MOV DI,OFFSET ARR MOV BX,-1 ;设标志-1 LOOPOUT:CMP BX,-1

JNE SORTEND ;标志不为-1,则排序完成 XOR BX,BX ;0->BX MOV CX,COUNT MOV SI,DI

LOOPIN: MOV AX,[SI]

CMP AX,[SI+2] ;两两比较

JLE NOCHANGE ;如果<=则不交换 XCHG [SI+2],AX ;否则交换 MOV [SI],AX

MOV BX,-1 ;置BX为-1,标示有交换 NOCHANGE:ADD SI,2

LOOP LOOPIN ;判断本次排序是否完成 JMP LOOPOUT SORTEND:POP SI POP DI POP CX POP BX POP AX RET

SORTP ENDP CODE ENDS END START

运行程序,输入一组数据,回车运行后显示出一组由小到大的数据:

6、设100位同学的某一门课的百分制分数存放于始于2000H:0100H的地方,请编写程序,把分数换算成5分制,存放于起始为3000H:0100H的地方 解:

STACK SEGMENT DW 64 DUP(?) STACK ENDS

CODE SEGMENT

ASSUME CS:CODE START: MOV AX,2000H MOV DS,AX XOR CX,CX

MOV CX,0AH ;设定多少个同学的成绩需要转换 MOV AX,0100H MOV DI,AX MOV BX,3000H MOV ES,BX A6:

XOR AX,AX

MOV AL,[DI] ;拿出第一个数

CMP AX,3CH ;比较60分 JAE A1

MOV ES:[DI],0EH INC DI DEC CX JNE A6 JMP A7

A1:CMP AX,46H ;比较70分 JAE A2

MOV ES:[DI],0DH INC DI DEC CX JNE A6 JMP A7

A2:CMP AX,50H ;比较80分 JAE A3

MOV ES:[DI],0CH INC DI DEC CX JNE A6 JMP A7

A3:CMP AX,5AH ;比较90分 JAE A4

MOV ES:[DI],0BH INC DI DEC CX JNE A6 JMP A7

A4:MOV ES:[DI],0AH INC DI

DEC CX JNE A6 JMP A7 A7:

MOV AH,4CH INT 21H

CODE ENDS END START

存入100位同学的成绩,成绩都是则输出五分制的成绩是:0A,0B,0C,0D,0E,

如图所示:假设存入10位同学的成绩,分别存放始于在(2000H:0100H):63H,58H,4DH,42H,37H,2CH,21H,16H,0BH,00H,即对应的十进制数是:99,88,77,66,55,44,33,22,11,00分

运行程序之后显示五分制结果,可以从(3000H:0100H)开始查看,分别是:

0A,0B,0C,0D,0E,0E,0E,0E,0E,0E

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

Top