CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------
END START
5.7 试编写一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它存放在AX
中。
答:程序段如下:
BEGIN: MOV BX, 0
MOV CX, 100
COMPARE: MOV AX, DATA[BX] ;取数组的第一个偶数
ADD BX, 2 TEST AX, 01H ;是偶数吗? LOOPNZ COMPARE ;不是,比较下一个数 JNZ STOP ;没有偶数,退出 JCXZ STOP ;最后一个数是偶数,即为最小偶数,退出
COMPARE1: MOV DX, DATA[BX] ;取数组的下一个偶数
ADD BX, 2 TEST DX, 01H ;是偶数吗? JNZ NEXT ;不是,比较下一个数 CMP AX, DX ;(AX)<(DX)吗? JLE NEXT MOV AX, DX ;(AX)<(DX),则置换(AX)为最小偶数
NEXT: LOOP COMPARE1 STOP: RET 5.8 把AX中存放的16位二进制数K看作是8个二进制的“四分之一字节”。试编写程序要求数一下值为3(即11B)的四分之一字节数,并将该数(即11B的个数)在终端上显示出来。 答:程序段如下:
BEGIN: MOV DL, 0 ;计数初始值
MOV CX, 8
COMPARE: TEST AX, 03H ;是数03吗?
JNZ NOEQUAL ;不是,转走 INC DL ;是,计数
NOEQUAL: ROR AX, 1 ;准备判断下一个数
ROR AX, 1
LOOP COMPARE ADD DL, ?0‘ ;将计数值转换为ASCII码 MOV AH, 2 ;进行显示 INT 21H
STOP: RET 5.9 试编写一个汇编语言程序,要求从键盘接收一个四位的16进制数,并在终端上显示与它等值的二进制数。
答:程序段如下:
BEGIN: MOV BX, 0 ;用于存放四位的16进制数
MOV CH, 4 MOV CL, 4
INPUT: SHL BX, CL ;将前面输入的数左移4位
MOV AH, 1 ;从键盘取数 INT 21H CMP AL, 30H ;<0吗? JB INPUT ;不是?0~F‘的数重新输入 CMP AL, 39H ;是?0~9‘吗? JA AF ;不是,转‘A~F’的处理 AND AL, 0FH ;转换为:0000B~1001B JMP BINARY
AF: AND AL, 1101 1111B ;转换为大写字母
BINARY:
DISPN: DISP:
STOP:
CMP JB CMP JA AND ADD OR DEL JNZ MOV MOV ROL RCL OR MOV INT LOOP RET
AL, 41H INPUT AL, 46H INPUT AL, 0FH AL, 9 BL, AL CH INPUT CX, 16 DL, 0 BX, 1 DL, 1 DL, 30H AH, 2 21H DISP
;又 ;不是?A~F‘的数重新输入 ;>F吗? ;不是?A~F‘的数重新输入 ;转换为:1010B~1111B ;将键盘输入的数进行组合 ;将16位二进制数一位位地转换成ASCII码显示 ;进行显示 5.10 设有一段英文,其字符变量名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中 的出现次数,并以格式“SUN:xxxx”显示出次数。 答:程序如下: DSEG SEGMENT ENG DB ?Here is sun, sun ,?,$‘ DISP DB ?SUN:‘ DAT DB ?0000‘ , 0DH, 0AH, ?$‘ KEYWORD DB ?sun‘ DSEG ENDS ;-------------------------------------------------------------------------- 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 MOV LEA COMP: MOV LEA MOV REPE JNZ INC ADD NOMATCH: INC DEC JNZ DONE: MOV MOV LEA DONE1: ROL MOV AND AX, 0 DX, DISP-ENG-2 ;计算ENG的长度(每次比较sun,因此比较次数-2) BX, ENG DI, BX SI, KEYWORD CX, 3 CMPSB ;串比较 NOMATCH AX ;是,SUN的个数加1 BX, 2 BX ;指向ENG的下一个字母 DX COMP CH, 4 ;将次数转换为16进制数的ASCII码 CL, 4 BX, DAT ;转换结果存入DAT单元中 AX, CL DX, AX 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 有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为0的项,并将后续项向前压缩,最后将数组的剩余部分补上0。 答:程序如下: 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 MOV BEGIN: AX, DSEG DS, AX ;给DS赋值 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 在STRING到STRING+99单元中存放着一个字符串,试编制一个程序测试该字符串中是否存在 数字,如有则把CL的第5位置1,否则将该位置0。 答:程序如下: 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 ;以上定义代码段 ;--------------------------------------------------------------------------