IBM-PC汇编语言程序设计答案 下载本文

49703100.doc - 24 - 作者:User

;--------------------------------------------------------------------------

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 ;转换为大写字母

CMP AL, 41H ;又

49703100.doc - 25 - 作者:User

BINARY:

DISPN: DISP:

STOP:

JB CMP JA AND ADD OR DEL JNZ MOV MOV ROL RCL OR MOV INT LOOP RET

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 ADD

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进制数 DL, 30H

49703100.doc - 26 - 作者:User

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 AX, DSEG

49703100.doc - 27 - 作者:User

MOV

BEGIN:

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 ;以上定义代码段 ;--------------------------------------------------------------------------

END START