80x86汇编习题
题目描述:在首地址为 DATA 的字数组中存放着 100H 个16位补码数, 试编写一个程序求出它们的平均值放在AX寄存器中;并求出数组中有多少个数小于此平均值,将结果放在BX寄存器中。
思路:
1,计数器初始化100H,指针指向数组头
2,因为AX,DX要用来加法,所以AX的值暂存BX;DX的值暂存DI
3,每次做加法之后,把结果加到DI,BX中,注意ADC DI,DX用的是ADC
4,做“有符号除法”,商就是AX,就是平均值
5,再次遍历数组,找到比AX小的数,用BX作计数器。
DATAS SEGMENT
DATA DW 100H DUP(?)
DATAS ENDS
STACKS SEGMENT
DW 100H DUP(?)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
LEA SP,TOP ;初始化
MOV CX,100H ;计数器
MOV SI,0 ;指针
MOV BX,0 ;暂存AX
MOV DI,0 ;暂存DX
NEXT:
MOV AX,DATA[SI] ;指针的数放到AX
CWD ;32位加法
ADD BX,AX ;AX暂存到BX
ADC DI,DX ;DX暂存到DI
ADD SI,2 ;指针往后
LOOP NEXT ;循环
MOV DX,DI ;放回DX,AX准备除法
MOV AX,BX
MOV CX,100H ;除数100H
IDIV CX ;有符号数除法
;商就是AX,就是平均值
MOV BX,0 ;小于平均值的计数器
MOV SI,0 ;指针
COMP:
CMP AX,DATA[SI]
JLE NOTLESS ;比AX大的跳过
INC BX
NOTLESS:
ADD SI,2
LOOP COMP
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START