王爽《汇编语言》实验13时间:2022-02-20 01:18:37这边因为是试验中的第二小题,课程中已经是给出,并且也有详细的讲解,这边我们就只给出第1和3小题的参考解答: (1)、这边我们给出7CH中断例程的代码和安装代码如下: DATAS SEGMENT ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: ;这段程序的功能是安装一个中断程序,中断程序的功能是显示一个用0结束的字符串 ;首先先安装程序 MOV AX,CS MOV DS,AX MOV SI,SHOWSTR0 MOV AX,0H MOV ES,AX MOV DI,200H MOV CX,OFFSET ENDSS0-OFFSET SHOWSTR0 CLD REP MOVSB ;安装中断例程到7CH中 MOV AX,0 MOV ES,AX MOV WORD PTR ES:[7CH*4],200H MOV WORD PTR ES:[7CH*4+2],0 MOV AX,4C00H INT 21H ;中断程序名为SHOWSTR0,参数: ;DH=行号 DL=列号 CL=颜色 DS:SI指向字符串的首地址 SHOWSTR0: PUSH AX PUSH BX PUSH CX PUSH DI MOV AX,0B800H MOV ES,AX MOV AL,160 MUL DH MOV DI,AX MOV AL,2 MUL DL ADD DI,AX ;MOV DI,DH*160+DL*2 S0: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;判断当前的字符是否是0,这边是第一种方法: MOV AL,[SI] MOV AH,CL ;保存颜色值 MOV CL,AL MOV CH,0 JCXZ OK MOV CL,AH ;恢复颜色值 MOV ES:[DI],AL MOV ES:[DI+1],CL INC SI ADD DI,2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;下面的这种解决办法(第二种)还是比我的好的 ;CMP BYTE PTR [SI],0 ;JE OK ;MOV AL,[SI] ;MOV ES:[DI],AL ;MOV ES:[DI+1],CL ;INC SI ;ADD DI,2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; JMP SHORT S0 OK: POP DI POP CX POP BX POP AX IRET ENDSS0: NOP CODES ENDS END START (3)、这边我们写入全部的程序代码,里边有标注填空的位置: ;《汇编语言》王爽 实验13(3) DATAS SEGMENT S1: DB 'Good,better,best,','$' S2: DB 'Never let it rest,','$' S3: DB 'Till good is better,','$' S4: DB 'And better,best.','$' S: DW OFFSET S1,OFFSET S2,OFFSET S3,OFFSET S4 ROW: DB 2,4,6,8 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV BX,OFFSET S MOV SI,OFFSET ROW MOV CX,4 OK: ;首先调用BIOS中断例程设置光标的位置 MOV BH,0 ;在第0页显示 MOV DH,[SI] ;;;;;;;;;;;;;;;;;;;;;;;;;;;设定显示的行 MOV DL,0 ;显示在第0列 MOV AH,2 ;设置光标的位置 INT 10H ;再次调用DOS的中断例程显示每一行诗句 MOV DX,[BX] ;;;;;;;;;;;;;;;;;;;;;;;;;;;DS:[BX]中存放的是每一行诗的首地址的偏移地址 MOV AH,9 INT 21H INC SI ;;;;;;;;;;;;;;;;;;;;;;;;;;;确定下一句诗句的显示在哪一行 ADD BX,2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;移到下一行诗句的首地址的偏移地址 LOOP OK MOV AH,4CH INT 21H CODES ENDS END START ;注释中由;;;;;;;;;;;;;;;;;;;;;;;;;;;注释的表示为要填空的位置 ;这边,由BIOS和DOS中断例程配合使用,这边,我认为重点还是要记住 ;BIOS和DOS中的中断例程的参数的作用,这样应该就可以熟练的应用了