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