汇编作业题答案 下载本文

44 编写程序,求10元素字数组LIST中绝对值最小的数,存入MIN单元。 答: DATA SEGEMNT

LIST DW -56, +12, 88, -126, -5, 16, 32, -99, 72, -18 MIN DW ? MINABS DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS: DATA START:

MOV AX, DATA MOV DS, AX MOV AX, LIST MOV MIN, AX ;将数组第一个元素假设为绝对值最小的数

MOV MINABS, 32767 ;最小的绝对值假设为32767 LEA SI, LIST MOV CX, 10

AGAIN: MOV AX, [SI]

CMP AX, 0 JGE SKIP1 NEG AX ;求绝对值

SKIP1: CMP AX, MINABS ;绝对值与假设的最小绝对值比较 JGE SKIP2 ;假设的绝对值较小,跳过 MOV MINABS, AX ;保存新的最小绝对值

MOV AX, [SI] ;取出新的绝对值最小的数 MOV MIN, AX ;保留新的绝对值最小的数

SKIP2: ADD SI, 2 LOOP AGAIN

MOV AX, 4C00H

INT 21H CODE ENDS END START

说明:一定要预设最小的绝对值和绝对值最小的数,而且这个绝对值最小

的数必须来自LIST数组。

45 编写程序,求20元素无符号字数组ARRAY中最小的奇数,存入ODD单元,如

果不存在奇数,将ODD单元清零。 答: DATA SEGEMNT

ARRAY DW 56, 12, 88, 126, 5, 16, 32, 99, 72, 18 DW 116, 34, 92, 32, 156, 42, 816, 16, 15, 218 ODD DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS: DATA

46 一个有符号字数组以0为结束标志,求这个数组的:最大值、最小值、平均

值。

答: DATA SEGEMNT

LIST DW -56, +12, 88, -126, -5, 16, 32, -99, 72, -18, 0

MIN DW ? MAX DW ? AVG DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS: DATA START:

MOV AX, DATA MOV DS, AX MOV MIN, 32767 ;将32767假设为最小的数

MOV MAX, -32768 ;将-32768假设为最大的数 MOV AVG, 0 ;AVG用作累加器,清零 LEA SI, LIST MOV CX, 0

AGAIN: MOV AX, [SI]

START:

MOV AX, DATA MOV DS, AX MOV BX, 0 MOV ODD, 65535 ;将65535假设为最小的奇数

LEA SI, ARRAY MOV CX, 20

AGAIN: MOV AX, [SI]

TEST AX, 1 ;测试是否为奇数 JZ SKIP ;不是奇数跳过 INC BX ;记录奇数个数 CMP AX, ODD ;奇数与预设的最小奇数比较 JGE SKIP ;大于预设奇数,跳过 MOV ODD, AX ;小于预设奇数,保留

SKIP: ADD SI, 2 LOOP AGAIN CMP BX, 0 ;判有无出现过奇数 JNZ DONE MOV ODD, 0 ;未出现过,把ODD单元清零 DONE: MOV AX, 4C00H INT 21H CODE ENDS END START

47 数组SCORE中存有一个班级40名学生的英语课程成绩。按照0~59,60~74,

75~84,85~100统计各分数段人数,存入N0,N1, N2, N3变量内。 答: DATA SEGEMNT

SCORE DW 40 DUP(?) ;运行前置入具体数据 N0 DW ? N1 DW ? N2 DW ? N3 DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS: DATA START:

MOV AX, DATA MOV DS, AX MOV N0, 0 ;各计数器清零

MOV N1, 0 MOV N2, 0 MOV N3, 0

CMP AX, 0

JZ DONE INC CX ADD AVG, AX CMP AX, MIN JGE SKIP1 MOV MIN. AX

SKIP1: CMP AX, MAX

JLE SKIP2

MOV MAX, AX SKIP2: ADD SI, 2 JMP AGAIN DONE: JCXZ NULL MOV AX, AVG CWD

IDIV CX MOV AVG, AX JMP EXIT NULL: MOV MIN, 0 MOV MAX, 0 MOV AVG, 0 EXIT: MOV AX, 4C00H INT 21H CODE ENDS END START

;找到零元素,转DONE结束处理 ;纪录非零元素个数 ;累加

;比预设最小值还小,保留

;比预设最大值还大,保留

;元素个数为零,转NULL处理

;计算平均值

;元素个数为0,将“最大值”、“最小值” ;“平均值”清零

48 STRING是一个16个字符组成的字符串,RULE是一个字整数。编写程序,测

试STRING中的每一个字符,如果该字符为数字字符,把RULE中对应位置1,否则置0。

答: DATA SEGEMNT

STRING DB 16 DUP(?) ;运行前置入具体字符 RULE DW ? DATA ENDS CODE SEGMENT

ASSUME CS: CODE, DS: DATA START:

MOV AX, DATA MOV DS, AX MOV RULE, 0 ;RULE置为初始状态

LEA SI, STRING MOV CX, 16

AGAIN: SHL RULE, 1 ;右侧空出一位

MOV AL, [SI] CMP AL, ‘0’ ;测试是否数字 JB NEXT

LEA SI, SCORE MOV CX, 40

AGAIN: MOV AX, [SI]

CMP AX, 59 ;分段测试 JA L1

L0: INC N0 JMP NEXT L1: CMP AX, 74 JA L2 INC N1 JMP NEXT L2: CMP AX, 84 JA L3 INC N2 JMP NEXT L3: CMP AX, 100 JA NEXT INC N3 NEXT: ADD SI, 2 LOOP AGAIN EXIT: MOV AX, 4C00H INT 21H CODE ENDS END START

49 S_ARRAY是一个5个字符串组成的字符串数组,每个字符串由16个字符组成,

S_RULE是一个5个元素的字数组。编写程序,按照4.18题的规则,用S_RULE数组记录S_ARRAY数组的特征。 答: DATA SEGEMNT

S_ARRAY DB 5 DUP(16 DUP(?)) ;运行前置入具体字符 S_RULE DW 5 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS: CODE, DS: DATA START:

MOV AX, DATA MOV DS, AX LEA BX, S_RULE MOV CX, 5 INIT: MOV WORD PTR[BX], 0 ;S_RULE置为初始状态 ADD BX, 2 LOOP INIT

LEA SI, STRING ;设置指针 LEA DI, S_RULE MOV CX, 5 ;外层循环计数器置初值

LOOPOUT:

PUSH CX MOV CX, 16 ;内层循环计数器置初值

LOOPIN:

SHL WORD PTR[DI], 1 ;右侧空出一位 MOV AL, [SI] CMP AL, ‘0’ ;测试是否数字 JB SKIP CMP AL, ‘9’ JA SKIP OR WORD PTR[DI], 1 ;S_RULE数组元素置位

SKIP: INC SI

LOOP LOOPIN POP CX

CMP AL, ‘9’

JA NEXT OR RULE, 1

NEXT: INC SI LOOP AGAIN EXIT: MOV AX, 4C00H INT 21H CODE ENDS END START

;将RULE对应位置1