logo资料库

四川大学 微机原理与接口技术 上机实验报告.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
;;;;;;;;;;;;;;BCD TO BINARY;;;;;;;;;;;;;;;;;;;; DATA BUFFER1 BUFFER2 DATA SEGMENT DW 1657H DW ? ENDS ;为 BUFFER2 分配存储空间 STACK STACK CODE START: SEGMENT PARA STACK'STACK' DB 200 DUP(?) ENDS ;堆栈段定义并分配存储空间 SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX ;设置段寄存器初值 ;DS 中包含的是程序段前缀的起始地址 ;设置返回至 DOS 的段值和 IP 值 MOV AX,[BUFFER1] AND AX,0F000H MOV CL,12 SHR AX,CL MOV DX,AX CALL CHANGE MOV AX,DX MOV BX,[BUFFER1] AND BX,0F00H MOV CL,8 SHR BX,CL ADD BX,AX MOV DX,BX CALL CHANGE MOV AX,DX MOV BX,[BUFFER1] AND BX,00F0H MOV CL,4 SHR BX,CL ADD BX,AX MOV DX,BX CALL CHANGE MOV AX,DX MOV BX,[BUFFER1] AND BX,000FH ADD BX,AX MOV DX,BX MOV BUFFER2,DX MOV CX,16 AGAIN: SHL BUFFER2,1 MOV DL,0 ;传送 BUFFER1 中的数至 AX ;AX 中除了首位全部置 0 ;向右移 12 位使最高的四位到最低的位置 ;将 AX 中的数据暂时保存在 DX 中 ;千位数乘以 10 ;将运算后的数据重新传回 AX 中 ;传送 BUFFER 中的数据至 BX 中 ;除第二位外全部置 0 ;右移 8 位 ;千位数*10+百位数 ;(千位数*10+百位数)*10 ;除第三位外全部置 0 ;(千位数*10+百位数)*10+十位数 ;((千位数*10+百位数)*10+十位数)*10 ;除第四位外全部置 0 ;((千位数*10+百位数)*10+十位数)*10+个位数
ADC DL,'0' MOV AH,02H INT 21H LOOP AGAIN MOV AH,4CH INT 21H CHANGE PROC MOV AX,DX MOV BL,10 MUL BL MOV DX,AX RET CHANGE ENDP ENDS CODE END START ;显示 BUFFER2 的结果 ;将 DX 中 ;的数 ;乘以 10 后 ;再传送回 DX 中 ;整个程序结束 ;;;;;;;;;;;;;;均值滤波;;;;;;;;;;;;;;;;;;;; DATAS SEGMENT NUM1 DW 300,260,250,240,280 NUM2 DB 3 DUP(0) NUM3 DW ? STRING DB 'The avg number:','$' DATAS ENDS STACK SEGMENT PARA STACK'STACK' DB 200 DUP(?) STACK ENDS CODES SEGMENT ;数据段定义并赋值 ;堆栈段定义并分配存储空间 ASSUME CS:CODES,DS:DATAS,SS:STACK ;段简写与全称关联 START: MOV AX,DATAS MOV DS,AX MOV DX,4 FIRST: MOV CX,4 MOV SI,OFFSET NUM1 FIRST1: MOV AX,[SI] INC SI ;DS 指向数据段 ; ;开始冒泡排序 ;设置冒泡比较次数 ;SI 指向 NUM1 首地址 ;SI 连续自加
INC SI CMP AX,[SI] JA FIRST2 JMP LAST FIRST2: XCHG AX,[SI] MOV [SI-2],AX LAST: LOOP FIRST1 DEC DX JNZ FIRST SECOND: MOV AX,0 MOV SI,OFFSET NUM1 ADD AX,[SI+2] ADD AX,[SI+4] ADD AX,[SI+6] MOV BX,3 DIV BX MOV [NUM3],AX MOV CX,3 LEA DI,NUM2 SECOND1: MOV BL,10 DIV BL MOV [DI],AH INC DI MOV AH,0 LOOP SECOND1 MOV CX,3 MOV AH,9 MOV DX,OFFSET STRING INT 21H SECOND2: DEC DI MOV DL,[DI] ADD DL,30H MOV AH,2 INT 21H LOOP SECOND2 MOV AH,4CH INT 21H CODES ENDS END START ;两次,指向下一个数 ;比较两数大小 ;若 AX 中数较大则跳转至 FIRST2 ;若不大于则跳转至 LAST ;交换两数顺序 ;DX 自减 1,若不为 0,则 ;跳转冒泡排序开始部分 ;求中间 ;三 ;数 ;的 ;平均值 ;输 ;出 ;提 ;示 ;性 ;语 ;句 ;STRING ;输出均值 263 ;整个程序结束
SEGMENT ;;;;;;;;;;;;;;TWO TIGER;;;;;;;;;;;;;;;;;;;; DATA BG DB 0AH,0DH,"TWO TIGER:$" FREQ DW 2 DUP(262,294,330,262) DW 2 DUP(330,349,392) DW 2 DUP(392,440,392,349,330,262) DW 2 DUP(294,196,262),0 ; 频率表 TIME DW 10 DUP(250*50),500*50,250*50,250*50,500*50 DW 2 DUP(120*50,120*50,120*50,120*50,250*50,250*50) DW 2 DUP(250*50,250*50,500*50) NUM DATA DB ENDS 3 STACK SEGMENT PARA STACK'STACK' DB 200 DUP(?) STACK CODE ENDS SEGMENT ;节拍时间表 ;设置歌曲循环演奏次数 ;堆栈段定义并分配存储空间 ASSUME CS:CODE,DS:DATA,SS:STACK ;简写与全称关联 STAT PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV DX,OFFSET BG MOV AH,09 INT 21H LP0: MOV SI,OFFSET FREQ MOV BP,OFFSET TIME CALL SING DEC CMP JNZ NUM NUM,0 LP0 RET STAT SING ENDP PROC NEAR PUSH DI ;DS 中包含的是程序段前缀的起始地址 ;设置返回至 DOS 的段值和 IP 值 ;DS 指向数据段 ;传送 BG 地址到 DX,为输出字符串做准备 ;输出字符串“TWO TIGER” ;频率表首地址 ;节时间表首地址 ;调用子程序 SING,开始演奏 ;由 NUM 控制循环演奏次数 ;演奏子程序
PUSH SI PUSH BP PUSH BX REPTO: MOV DI,[SI] CMP DI,0 JE END_SING MOV BX,DS:[BP] CALL SOUND ADD SI,2 ADD BP,2 JMP REPTO END_SING:POP BX POP BP POP SI POP DI RET ENDP SING SOUND PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AL,0B6H OUT 43H,AL MOV DX,12H MOV AX,34DCH DIV DI OUT 42H,AL MOV AL,AH OUT 42H,AL IN AL,61H MOV AH,AL OR AL,3 OUT 61H,AL ;DI 指向频率表首地址 ;比较 DI 和 0 ;若 DI=0,则演奏结束转至 END_SING ;调用 SOUND 子程序 ;跳转至 REPTO 段首 ;扬声器发声子程序 ;开始计算计数值 ;计算计数值结束 ;分两次把 AX 里 ;面的内容传送 ;到端口端口 42H ;打开扬声器发声 ;保存端口 61H 的初始内容 DELAY: MOV CX,20000 DL10MS: LOOP DL10MS ;延时 10ms DEC BX JNZ DELAY MOV AL,AH OUT 61H,AL POP DI POP DX POP CX POP BX POP AX RET SOUND ENDP CODE ENDS END STAT ;关闭扬声器 ;发声子程序结束 ;整个程序结束
分享到:
收藏