;;;;;;;;;;;;;;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
;关闭扬声器
;发声子程序结束
;整个程序结束