49703100.doc - 28 - 作者:User
5.14 在首地址为TABLE的数组中按递增次序存放着100H个16位补码数,试编写一个程序把出现次
数最多的数及其出现次数分别存放于AX和CX中。 答:程序如下:
DSEG SEGMENT TABLE DW 100H DUP (?) ;数组中的数据是按增序排列的 DATA DW ? COUNT 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: MOV CX, 100H ;循环计数器
MOV SI, 0
NEXT: MOV DX, 0
MOV AX, TABLE [SI]
COMP: CMP TABLE [SI], AX ;计算一个数的出现次数
JNE ADDR INC DX ADD SI, 2 LOOP COMP
ADDR: CMP DX, COUNT ;此数出现的次数最多吗?
JLE DONE
MOV COUNT, DX ;目前此数出现的次数最多,记下次数 MOV DATA, AX ;记下此数
DONE: LOOP NEXT ;准备取下一个数
MOV CX, COUNT ;出现最多的次数存入(CX) MOV AX, DATA ;出现最多的数存入(AX) RET
MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------
END START 5.15 数据段中已定义了一个有n个字数据的数组M,试编写一程序求出M中绝对值最大的数,把它放
在数据段的M+2n单元中,并将该数的偏移地址存放在M+2(n+1)单元中。 答:程序如下:
DSEG SEGMENT n EQU 100H ;假设n=100H M DW n DUP (?) DATA DW ? ;M+2n单元 ADDR DW ? ;M+2(n+1)单元 DSEG ENDS
;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG
START: PUSH DS ;设置返回DOS
SUB AX, AX PUSH AX
MOV AX, DSEG
49703100.doc - 29 - 作者:User
MOV
BEGIN:
DS, AX ;给DS赋值
MOV CX, n ;循环计数器 LEA DI, M MOV AX, [DI] ;取第一个数 MOV ADDR, DI ;记下绝对值最大的数的地址 CMP AX, 0 ;此数是正数吗? JNS ZHEN ;是正数,即为绝