汇编语言程序设计答案(7)

2019-05-24 11:16

46392477.doc - 30 - 作者:User

MOV AX, BX MOV CX, 100H IDIV CX ;带符号数求平均值,放入(AX)中 MOV BX, 0 MOV SI, 0

COMP: CMP AX, DATA [SI] ;寻找小于平均值的数

JLE NO INC BX ;小于平均值数的个数+1

NO: ADD SI, 2

LOOP COMP RET

MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------

END START

5.17 试编制一个程序把AX中的16进制数转换为ASCII码,并将对应的ASCII码依次存放到MEM数

组中的四个字节中。例如,当(AX)=2A49H时,程序执行完后,MEM中的4个字节内容为39H,34H,41H,32H。 答:程序如下:

DSEG SEGMENT MEM DB 4 DUP (?) N DW 2A49H DSEG ENDS

;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR

ASSUME CS: CSEG, DS: DSEG

START: PUSH DS ;设置返回DOS

SUB AX, AX PUSH AX

MOV AX, DSEG MOV DS, AX ;给DS赋值

BEGIN: MOV CH, 4 ;循环计数器

MOV CL, 4 MOV AX, N LEA BX, MEM

ROTATE: MOV DL, AL ;从最低四位开始转换为ASCII码

AND DL, 0FH ADD DL, 30H CMP DL, 3AH ;是0~9吗? JL NEXT ADD DL, 07H ;是A~F

NEXT: MOV [BX], DL ;转换的ASCII码送入MEM中

INC BX ROR AX, CL ;准备转换下一位 DEC CH JNZ ROTATE RET

MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------

END START 5.18 把0~100D之间的30个数存入以GRADE为首地址的30字数组中,GRADE+i表示学号为i+1的

学生的成绩。另一个数组RANK为30个学生的名次表,其中RANK+i的内容是学号为i+1的学生的名次。编写一程序,根据GRADE中的学生成绩,将学生名次填入RANK数组中。(提示:一

46392477.doc - 31 - 作者:User

个学生的名次等于成绩高于这个学生的人数加1。) 答:程序如下:

DSEG SEGMENT GRADE DW 30 DUP (?) ;假设已预先存好30名学生的成绩 RANK DW 30 DUP (?) DSEG ENDS

;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR

ASSUME CS: CSEG, DS: DSEG

START: PUSH DS ;设置返回DOS

SUB AX, AX PUSH AX

MOV AX, DSEG MOV DS, AX ;给DS赋值

BEGIN: MOV DI, 0

MOV CX, 30 ;外循环计数器

LOOP1: PUSH CX

MOV CX, 30 ;内循环计数器 MOV SI, 0

MOV AX, GRADE [DI] MOV DX, 1 ;起始名次为第1名

LOOP2: CMP GRADE [SI], AX ;成绩比较

JBE GO_ON INC DX ;名次+1

GO_ON: ADD SI, 2

LOOP LOOP2 POP CX

MOV RNAK [DI], DX ;名次存入RANK数组 ADD DI, 2 LOOP LOOP1 RET

MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------

END START

5.19 已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编制一程序把既在

A中又在B中出现的整数存放于数组C中。 答:程序如下:

DSEG SEGMENT A DW 15 DUP (?) B DW 20 DUP (?) C DW 15 DUP (? ‘) DSEG ENDS

;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR

ASSUME CS: CSEG, DS: DSEG

START: PUSH DS ;设置返回DOS

SUB AX, AX PUSH AX

MOV AX, DSEG MOV DS, AX ;给DS赋值

BEGIN: MOV SI, 0

MOV BX, 0

46392477.doc - 32 - 作者:User

MOV CX, 15 ;外循环计数器

LOOP1: PUSH CX

MOV CX, 20 ;内循环计数器 MOV DI, 0

MOV AX, A [SI] ;取A数组中的一个数

LOOP2: CMP B [DI], AX ;和B数组中的数相等吗?

JNE NO

MOV C [BX], AX ;相等存入C数组中 ADD BX, 2

NO: ADD DI, 2

LOOP LOOP2 ADD SI, 2 POP CX LOOP LOOP1 RET

MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------

END START

5.20 设在A、B和C单元中分别存放着三个数。若三个数都不是0,则求出三数之和存放在D单元中;

若其中有一个数为0,则把其它两单元也清0。请编写此程序。 答:程序如下:

DSEG SEGMENT A DW ? B DW ? C DW ? D DW 0 DSEG ENDS

;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR

ASSUME CS: CSEG, DS: DSEG

START: PUSH DS ;设置返回DOS

SUB AX, AX PUSH AX

MOV AX, DSEG MOV DS, AX ;给DS赋值

BEGIN: CMP A, 0

JE NEXT CMP B, 0 JE NEXT CMP C, 0 JE NEXT MOV AX, A ADD AX, B ADD AX, C MOV D, AX JMP SHORT EXIT

NEXT: MOV A, 0

MOV B, 0 MOV C, 0

EXIT: RET MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------

END START

46392477.doc - 33 - 作者:User

5.21 试编写一程序,要求比较数组ARRAY中的三个16位补码数,并根据比较结果在终端上显示如下

信息:

(1) 如果三个数都不相等则显示0; (2) 如果三个数有二个数相等则显示1; (3) 如果三个数都相等则显示2。 答:程序如下:

DSEG SEGMENT ARRAY DW 3 DUP (?) DSEG ENDS

;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR

ASSUME CS: CSEG, DS: DSEG

START: PUSH DS ;设置返回DOS

SUB AX, AX PUSH AX

MOV AX, DSEG MOV DS, AX ;给DS赋值

BEGIN: LEA SI, ARRAY

MOV DX, 0 ;(DX)用于存放所求的结果 MOV AX, [SI] MOV BX, [SI+2] CMP AX, BX ;比较第一和第二两个数是否相等 JNE NEXT1 INC DX

NEXT1: CMP [SI+4], AX ;比较第一和第三两个数是否相等

JNE NEXT2 INC DX

NEXT2: CMP [SI+4], BX ;比较第二和第三两个数是否相等

JNE NUM INC DX

NUM: CMP DX, 3

JL DISP DEC DX

DISP: ADD DL, 30H ;转换为ASCII码

MOV AH, 2 ;显示一个字符 INT 21H RET

MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------

END START 5.22 从键盘输入一系列字符(以回车符结束),并按字母、数字、及其它字符分类计数,最后显示出这三

类的计数结果。 答:程序如下:

DSEG SEGMENT

ALPHABET DB ?输入的字母字符个数为:‘, ?$‘ NUMBER DB ?输入的数字字符个数为:‘, ?$‘ OTHER DB ?输入的其它字符个数为:‘, ?$‘ CRLF DB 0DH, 0AH, ?$‘ DSEG ENDS

;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR

ASSUME CS: CSEG, DS: DSEG

46392477.doc - 34 - 作者:User

START:

PUSH SUB PUSH MOV MOV DS AX, AX AX

AX, DSEG DS, AX

;设置返回DOS

;给DS赋值 ;字母字符计数器

;数字字符计数器 ;其它字符计数器 ;输入一个字符 ;是回车符吗? ;<数字0吗? ;是其它字符

;>数字9吗?

BEGIN:

INPUT:

OTHER: NEXT1:

NEXT2:

NEXT3:

NEXT4:

NEXT5:

MOV BX, 0 MOV SI, 0 MOV DI, 0 MOV AH, 1 INT 21H CMP AL, 0DH JE DISP CMP AL, 30H JAE NEXT1 INC DI JMP SHORT INPUT CMP AL, 39H JA NEXT2 INC SI JMP SHORT INPUT CMP AL, 41H JAE NEXT3 JMP SHORT OTHER CMP AL, 5AH JA NEXT4 INC BX JMP SHORT INPUT CMP AL, 61H JAE NEXT5 JMP SHORT OTHER CMP AL, 7AH JA SHORT OTHER INC BX JMP SHORT INPUT

;是数字字符

;<字母A吗?

;是其它字符

;>字母Z吗? ;是字母字符A~Z

;<字母a吗?

;是其它字符 ;>字母z吗? ;是其它字符 ;是字母字符a~z

LEA DX, ALPHABET CALL DISPLAY LEA DX, NUMBER MOV BX, SI CALL DISPLAY LEA DX, OTHER MOV BX, DI CALL DISPLAY RET

MAIN ENDP

;-------------------------------------------------------------------------- DISPLAY PROC NEAR

MOV AH, 09H ;显示字符串功能调用 INT 21H

CALL BINIHEX ;调把BX中二进制数转换为16进制显示子程序 LEA DX, CRLF MOV AH, 09H ;显示回车换行 INT 21H RET

DISPLAY ENDP

;--------------------------------------------------------------------------

DISP:


汇编语言程序设计答案(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:土木工程专业英语课后答案(一)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: