CSEG SEGMENT MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG, ES: DSEG START: PUSH DS ;设置返回DOS SUB AX, AX PUSH AX
MOV AX, DSEG
MOV DS, AX ;给DS赋值 MOV ES, AX ;给ES赋值 BEGIN: MOV AX, 0
MOV DX, DISP-ENG-2 ;计算ENG的长度(每次比较sun,因此比较次数-2) LEA BX, ENG
COMP: MOV DI, BX LEA SI, KEYWORD MOV CX, 3
REPE CMPSB ;串比较 JNZ NOMATCH
INC AX ;是,SUN的个数加1 ADD BX, 2
NOMATCH: INC BX ;指向ENG的下一个字母 DEC DX JNZ COMP
DONE: MOV CH, 4 ;将次数转换为16进制数的ASCII码 MOV CL, 4
LEA BX, DAT ;转换结果存入DAT单元中 DONE1: ROL AX, CL MOV DX, AX
AND DL, 0FH ;取一位16进制数 ADD DL, 30H CMP DL, 39H JLE STORE
ADD DL, 07H ;是―A~F‖所以要加7
STORE: MOV [BX], DL ;转换结果存入DAT单元中 INC BX DEC CH JNZ DONE1
DISPLAY: LEA DX, DISP ;显示字符串程序(将DISP和DAT一起显示) MOV AH, 09H INT 21H RET
MAIN ENDP
CSEG ENDS ;以上定义代码段
;-------------------------------------------------------------------------- END START
5.11答:程序段如下: DSEG SEGMENT BUFF DB 50 DUP (? ‘) COUNT DW 0 DSEG ENDS ┇
BEGIN: LEA BX, BUFF MOV COUNT, 0
INPUT: MOV AH, 01 ;从键盘输入一个字符的功能调用 INT 21H
MOV [BX], AL INC BX
CMP AL, ?$‘ ;是$结束符吗? JNZ INPUT ;不是,继续输入
LEA BX, BUFF ;对非数字字符进行计数 NEXT: MOV CL, [BX] INC BX
CMP CL, ?$‘ ;是$结束符,则转去显示 JZ DISP
CMP CL, 30H ;小于0是非数字字符 JB NEXT
CMP CL, 39H ;大于9是非数字字符 JA NEXT
INC COUNT ;个数+1 JMP NEXT DISP: ┇ ;16进制数显示程序段(省略) 5.12答:程序如下: DSEG SEGMENT
MEM DW 100 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, (100-1)*2 ;(SI)指向MEM的末元素的首地址 MOV BX, -2 ;地址指针的初值 MOV CX, 100
COMP: ADD BX, 2 CMP MEM [BX], 0
JZ CONS LOOP COMP
JMP FINISH ;比较完了,已无0则结束 CONS: MOV DI, BX
CONS1: CMP DI, SI ;到了最后单元码? JAE NOMOV
MOV AX, MEM [DI+2] ;后面的元素向前移位 MOV MEM [DI], AX ADD DI, 2 JMP CONS1
NOMOV: MOV WORD PTR [SI], 0 ;最后单元补0 LOOP COMP FINISH: RET MAIN ENDP
CSEG ENDS ;以上定义代码段
;-------------------------------------------------------------------------- END START
5.13答:程序如下: DSEG SEGMENT
STRING DB 100 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 ;(SI)作为地址指针的变化值 MOV CX, 100
REPEAT: MOV AL, STRING [SI] CMP AL, 30H JB GO_ON CMP AL, 39H JA GO_ON
OR CL, 20H ;存在数字把CL的第5位置1 JMP EXIT
GO_ON: INC SI LOOP REPEAT
AND CL, 0DFH ;不存在数字把CL的第5位置0 EXIT: RET MAIN ENDP
CSEG ENDS ;以上定义代码段
;-------------------------------------------------------------------------- END START
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答:程序如下: 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
MOV DS, AX ;给DS赋值
BEGIN: MOV CX, n ;循环计数器 LEA DI, M
MOV AX, [DI] ;取第一个数
MOV ADDR, DI ;记下绝对值最大的数的地址 CMP AX, 0 ;此数是正数吗?
JNS ZHEN ;是正数,即为绝对值,转去判断下一个数 NEG AX ;不是正数,变为其绝对值 ZHEN: MOV BX, [DI]
CMP BX, 0 ;此数是正数吗?
JNS COMP ;是正数,即为绝对值,转去比较绝对值大小 NEG BX ;不是正数,变为其绝对值 COMP: CMP AX, BX ;判断绝对值大小 JAE ADDRESS
MOV AX, BX ;(AX)<(BX),使(AX)中为绝对值最大的数 MOV ADDR, DI ;记下绝对值最大的数的地址 ADDRESS: ADD DI, 2 LOOP ZHEN
MOV DATA, AX ;记下此数 RET
MAIN ENDP
CSEG ENDS ;以上定义代码段
;-------------------------------------------------------------------------- END START
5.16答:程序如下: DSEG SEGMENT
DATA DW 100H DUP (?) DSEG ENDS
;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG