STOSW
MOV AX,ES:[DI]
MOV CSBAK,AX MOV AX,SEG MYINT STOSW
MOV DX,OFFSET MES MOV AH,09H INT 21H
MOV SI,OFFSET BUF1
MOV CX,10H INT 47H
MOV AX,0 MOV ES,AX
MOV DI,4*47H MOV AX,IPBAK CLD STOSW
MOV AX,CSBAK STOSW
START0: MOV AH,06H MOV DL,0FFH INT 21H
JE START0 MOV AX,4C00H INT 21H
RET ENDP
MYINT PROC FAR PUSH AX
PUSH DX
C1: MOV AL,[SI] AND AL,0F0H SHR AL,4 CMP AL,0AH
JB C2 ADD AL,07H
C2: ADD AL,30H
;保存原有CS
;显示提示信息
;显示BUF1中的内容
;恢复系统中断矢量 ;判断是否有键按下
;若没有转START0 ;有键返回DOS ;自定义显示中断,入口参数为BL ;取高4位 ;是否是A以上的数
- 46 -
MOV DL,AL MOV AH,02H IN 21H MOV AL,[SI] AND AL,0FH
CMP AL,0AH JB C3 ADD AL,07H
C3: ADD AL,30H MOV DL,AL MOV AH,02H INT 21H INC SI LOOP C1 POP DX POP AX
IRET
ENDP CODE ENDS
END START
;显示字符
;取低4位
;显示字符
;中断返回
- 47 -
实验八 综合程序设计实验
一、实验目的
(1) 掌握分支、循环、子程序调用的基本程序结构。 (2) 掌握32 位寄存器、指令使用的基本方法。 (3) 学习综合程序的设计、编制及调试。
二、实验内容 1.排序实验
本实验要求编写一个程序,对存贮器中的一组双字进行排序,并将排序结果显示在屏幕上。在编写过程中,应使用32 位寄存器,并且采用基址+变址+偏移的寻址方式。在程序中使用80x86指令系统中有关32 位的指令、寻址方式及32 位寄存器时需要在文件头使用“.386”或“.386p”。
2.用32 位寄存器、指令、扩展寻址方式实现数码转换及显示
本实验要求将一组ASCII 字符转换成十六进制数码,并在屏幕上显示出来。要求使用32 位寄存器、32 位的指令和寻址方式。如将字符串“This is DVCCIN speaking!”进行转换,应转换成:
54H、68H、69H、73H、20H、69H、73H、20H、64H、76H、63H、63H、69H、6EH、20H、 73H、70H、65H、61H、6BH 、69H、6EH、67H、21H。
三、实验步骤
(1) 运行DVCC32JHP 软件,选择编辑Edit 菜单编写实验程序。
(2) 使用“ASM编译”菜单中“编译+连接+运行”选项,对实验程序进行汇编、连接。汇编、连接无误的话,就直接运行程序。观察运行结果。 (3) 更改数据区中的数据,考察程序的正确性。
四、参考程序
1. 排序实验
源文件名DVA8_1.ASM(在文件夹“ASM_汇编例程”中) 实验程序清单如下: .386p
STACK1 SEGMENT STACK USE16 DB 64 DUP(?) STACK1 ENDS
DATA SEGMENT USE16
MES1 DB 'The array is:$'
- 48 -
MES2 DB 'After sort:$'
DATA1 DD
110015H,111101D8H,22110002H,111a0004H,1d110009H,111f044H,11d10203H,32H COUNT =8 DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV DX,OFFSET MES1 MOV AH,09H INT 21H CALL KENTER
CALL SAHEX CALL KENTER
CALL BUBBLE MOV DX,OFFSET MES2 MOV AH,09H INT 21H CALL KENTER CALL SAHEX CALL KENTER
START0: MOV AH,06H MOV DL,0FFH INT 21H
JE START0 MOV AX,4C00H INT 21H BUBBLE PROC XOR ESI,ESI XOR ECX,ECX
MOV SI,OFFSET DATA1 MOV CX,COUNT L1: XOR EBX,EBX L2: CMP EBX,ECX JAE LB
MOV EAX,[ESI+EBX*4+4]
;显示未排序的数组
;显示排序后的数组
;判断是否有键按下
;若没有转START0 ;有键返回DOS
- 49 -
CMP [ESI+EBX*4],EAX
JGE LNS
XCHG [ESI+EBX*4],EAX MOV [ESI+EBX*4+4],EAX LNS: INC EBX JMP L2 LB: LOOP L1 RET
BUBBLE ENDP
SAHEX PROC NEAR XOR ESI,ESI XOR ECX,ECX
MOV SI,OFFSET DATA1 MOV CX,COUNT*4 C1: MOV EBX,ECX DEC EBX
MOV AL,DS:[ESI+EBX] AND AL,0F0H SHR AL,4
CMP AL,0AH JB C2 ADD AL,07H C2: ADD AL,30H MOV DL,AL MOV AH,02H
INT 21H MOV AL,DS:[ESI+EBX] AND AL,0FH CMP AL,0AH JB C3 ADD AL,07H C3: ADD AL,30H MOV DL,AL
MOV AH,02H INT 21H
TEST EBX,03H JNZ C4
MOV DL,20H
4位 A以上的数
4位
- 50 - ;取高;是否是;显示字符;取低;显示字符