答:DATA SEGMENT
STRING1 DB 'THIS IS THE FIRST STRING!','$' DB 100 DUP(0) ;缓冲区
NUM1 DW ? ;字符串1 的长度 STRING2 DB 'the second string!','$' NUM2 DW ? ;字符串2 的长度 POS DW 8 ;插入位置 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX
MOV ES,AX
LEA DI,STRING1 ;求字符串1 的长度存入NUM1 MOV AL,'$' MOV NUM1,0 CLD
D1: SCASB JZ D2 INC NUM1
JMP D1
D2: LEA DI,STRING2 ;求字符串2 的长度存入NUM2 MOV AL,'$' MOV NUM2,0 CLD D3: SCASB JZ D4
INC NUM2 JMP D3
D4: LEA SI,STRING1 ;将字符串1 自插入位置开始的字符向后移动, ADD SI,NUM1 ;空出位置以便插入字符串2 MOV DI,SI ADD DI,NUM2 STD
MOV CX,NUM1 SUB CX,POS INC CX
REP MOVSB
LEA SI,STRING2 ;将字符串2 插入到字符串1 指定位置 LEA DI,STRING1 ADD DI,POS CLD
MOV CX,NUM2 REP MOVSB
LEA DX,STRING1 MOV AH,9 INT 21H
MOV AH,4CH INT 21H CODE ENDS
END START
21. 将学生的班级、姓名、学号、课程名、成绩定义为一个结构,用结构预置语句,产生5 个学生的成绩登记表,编程序将成绩小于60 分的学生姓名、成绩显示出来。 答:STUDENT STRUC CLASS DB ? ;班级 NAM DB 'ABCDE$' ;姓名 NUM DB ? ;学号
COURSE DB 'ABCD' ;课程 SCORE DB ? ;成绩 STUDENT ENDS
DATA SEGMENT
STUDENT1 STUDENT <1,'XIAOA$',001,'MATH',70> STUDENT2 STUDENT <1,'XIAOB$',002,'MATH',80> STUDENT3 STUDENT <1,'XIAOC$',003,'MATH',50> STUDENT4 STUDENT <1,'XIAOD$',004,'MATH',90> STUDENT5 STUDENT <1,'XIAOE$',005,'MATH',55> DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,ds:DATA START: MOV AX,DATA MOV DS,AX
MOV CX,5 ;通过循环结构进行筛选
MOV SI,0
CONT: MOV AL,STUDENT1.SCORE[SI] ;取成绩
CMP AL,60 JAE D1
LEA DX,STUDENT1.NAM[SI] ;小于60 则显示姓名和成绩 MOV AH,9 INT 21H MOV DL,' ' MOV AH,2
INT 21H
MOV AL,STUDENT1.SCORE[SI] ;成绩转换为ASCII 码显示 MOV AH,0 MOV BL,10 DIV BL PUSH AX MOV DL,AL
ADD DL,30H MOV AH,2 INT 21H POP AX
MOV DL,AH ADD DL,30H MOV AH,2 INT 21H
MOV DL,0DH MOV AH,2 INT 21H
MOV DL,0AH INT 21H
D1: ADD SI,13 LOOP CONT MOV AH,4CH
INT 21H CODE ENDS END START
22. 编程序统计学生的数学成绩,分别归类90 分~99 分,80 分~89 分,70 分~79 分,60 分~69 分及60 分以下,并将各段的人数送入内存单元中。 答:设学生人数为字节,成绩为压缩BCD 码,且都是合法的。 DATA SEGMENT BUFF DB XXH,……. ANUM EQU $-BUFF
SNUM DB 5 DUP(0) ;存放各类成绩统计结果 BUFF1 DB ANUM DUP(0) ;存放60 分以下成绩 BUFF2 DB ANUM DUP(0) ;存放60 分~69 分成绩 BUFF3 DB ANUM DUP(0) ;存放70 分~79 分成绩 BUFF4 DB ANUM DUP(0) ;存放80 分~89 分成绩 BUFF5 DB ANUM DUP(0) ;存放90 分以上成绩 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS: DATA,ES: DATA START: MOV AX, DATA MOV DS,AX
MOV ES,AX
MOV CL,ANUM ;取学生人数 MOV CH,0 MOV BH,0
MOV SI,OFFSET BUFF MOV DI,OFFSET SNUM D1: MOV AL,[SI] CMP AL,60H
JAE NEXT1
MOV BL,[DI]
MOV BUFF1[BX],AL INC BYTE PTR [DI] JMP NEXT5
NEXT1: CMP AL,69H JA NEXT2
MOV BL,[DI+1]
MOV BUFF2[BX],AL INC BYTE PTR [DI+1] JMP NEXT5
NEXT2: CMP AL,79H JA NEXT3
MOV BL,[DI+2] MOV BUFF2[BX],AL INC BYTE PTR [DI+2] JMP NEXT5
NEXT3: CMP AL,89H JA NEXT4 MOV BL,[DI+3] MOV BUFF3[BX],AL INC BYTE PTR [DI+3] JMP NEXT5
NEXT4: MOV BL,[DI+4] MOV BUFF4[BX],AL INC BYTE PTR [DI+4] NEXT5: INC SI LOOP D1
MOV AH,4CH INT 21H
CODE ENDS END START
23. 编制宏定义,将存储器区中一个用?$?结尾的字符串传送到另一个存储器区中,要求源地 址、目的地址、串结尾符号可变。
答:SEND MACRO SCHARS, DCHARS , FLAG
LOCAL NEXT, EXIT ;LOCAL 用于解决宏定义内的标号问题 PUSH AX ;SCHARS 源串地址,DCHARS 目的串地址 PUSH SI ;FLAG 串结尾符号 MOV SI, 0
NEXT: MOV AL, SCHARS[SI] MOV DCHARS[SI], AL CMP AL, FLAG JZ EXIT INC SI
JMP NEXT
EXIT: POP SI POP AX ENDM
24. 定义宏指令名FINSUM:它完成比较两个数X 和Y,若X>Y,则执行X+2*Y 结果送到 SUM,若X≤Y,则执行2*X+Y 结果送到SUM。 答:FINSUM MACRO X, Y, SUM IF X GT Y MOV AX, Y SHL AX, 1 ADD AX, X MOV SUM, AX ELSE
MOV AX, X SHL AX, 1 ADD AX, Y
MOV SUM, AX ENDIF ENDM
25. DOS 功能调用需要在AH 寄存器中存放不同的功能码,试将这些功能调用定义成宏指令 DOS,再定义宏指令DISP,完成显示字符的功能,并展开宏调用DISP ?*?。 答: DOS MACRO NUM MOV AH, NUM INT 21H ENDM
DISP MACRO ZIFU MOV DL, ZIFU DOS 02H ENDM
宏调用:DISP ?*? 宏展开:MOV DL, ?*? MOV AH, 02H
INT 21H
26. 编一段程序产生乐曲。 答:演奏儿歌《一闪一闪亮晶晶》 1 1|5 5|6 6|5-|4 4|3 3|2 2|1-| 5 5|4 4|3 3|2-|5 5|4 4|3 3|2-|
1 1|5 5|6 6|5-|4 4|3 3|2 2|1-|| DATA SEGMENT
FREQUECY DW 65535,262,294,330,349,392,440,494 ;各音阶频率,65535 对应0, DW 523,578,659,698,784,880,988 ;表示不发声
DW 1046,1175,1318,1397,1568,1760,1976
TABLE DW 0,8,8,12,12,13,13,12,0, 11,11,10,10,9,9,8,0 ;乐谱各音符频率在 DW 12,12,11,11,10,10,9,0, 12,12,11,11,10,10,9,0 ;FREQUECY 中的相对