汇编
- ·c语言和汇编混编,效率如何?
- ·是汇编语言难学还是C难学?
- ·ARM的汇编指令系统是哪种汇编?
- ·现在的驱动程序一般是由哪...
- ·学习汇编用什么环境?
- ·如何构造Win32Asm开发环境?
- ·一个汇编程序的编译过程是...
(1)面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的.
(2)可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等.
(3)保持了机器语言的优点,具有直接和简捷的特点.
(4)经常与高级语言配合使用,应用十分广泛.
(5)目标代码简短,占用内存少,执行速度快,是高效的程序设计语言.
(1)70%以上的系统软件是用汇编语言编写的.
(2)某些高级绘图程序、视频游戏程序是用汇编语言编写的.
(3)某些快速处理、位处理、访问硬件设备等高效程序是用汇编语言编写的.
MASM是微软公司开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm是Windows下开发汇编的利器。它与windows平台的磨合程度非常好,但是在其他平台上就有所限制,使用MASM的开人员必须在windows下进行开发。
MASM 6.11 下载:
http://download.pchome.net/development/linetools/detail-10660.html
NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。它支持相当多的目标文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微软16位的'OBJ'和'Win32'。它还可以输出纯二进制文件。它的语法设计得相当的简洁易懂,和INTEL语法相似但更简单。它支持'Pentium','P6','MMX','3DNow!','SSE' and 'SSE2'指令集。
NASM 下载:
http://download.chinaunix.net/download/0008000/7201.shtml
RadASM是一款著名的WIN32汇编编辑器,支持MASM、TASM等多种汇编编译器,Windows界面,支持语法高亮,自带一个资源编辑器和一个调试器。拥有较强的工程管理功能,加之众多插件的支持,使得它用汇编语言编写Windows软件变得得心应手。
此汉化增强版根据RadASM作者网站070417正式发布的 2.2.1.1版汉化,可对中文完美支持,可编译DOS下的程序并可看到运行结果。这个版本增强了对 C 编译器的支持,增加了从已有具体的更新内容请大家参考安装目录下的 WhatsNew.txt。增强版中附带的 MASM32 更新为 9.0,我在其中放了开发驱动的相关文件,安装后即可使用,可以直接开发驱动程序。我还写了一篇《如何配置RasASM来支持你的编译器》的文章放在安装包中,希望能给大家在为 RadASM 配置新的编译器时提供一点参考。汉化增强版适合于未安装Masm32及Viusual C++的用户,添加了RadASM的帮助文件及Win32 Api等帮助文件。RadASM可通过添加ini文件来支持别的语言,可以自己配置ini文件来支持你所使用的编程语言。此汉化增强版根据网友aboil的建议,添加了我最新修正的 OllyDBG 汉化第二版,选择安装后路径会自动设置好,直接可在RadASM中调试你编译后的程序。
RadASM下载:
TASM是Borland公司推出的汇编编译器,也是一种使用很广泛的编译器,与MASM相比,TASM的升级没有这么频繁,TASM早在1.0版本就有了对80386处理器指令的完全支持(MASM要到5.0版本才支持80386指令),1989年推出的1.01版本修正了1.0版的一些错误;早期的版本还有TASM 3.0和TASM 4.0,其中 4.0版是TASM系列编译器编写DOS程序使用最广泛的版本。到目前为止,TASM的最后一个版本是5.0版,这个版本支持WIN32编程,并单独为WIN32编程附带有一整套32位程序:32位的编译器TASM32.EXE、连接器TLINK32.EXE和资源编译器BRC32.EXE。与这些32位程序对应的16位工具在软件包中依然存在,文件名为TASM.EXE,TLINK.EXE和BRC.EXE等。
TASM(TURBO ASSEMBLER)5.0 下载:
http://download.pchome.net/development/linetools/download-9027.html
VisualASM60 是一款便捷的汇编语言交叉平台IDE. 支持8088、8086、80386以及更高(奔腾、塞扬就更不用说了) C51、ARM等,以后会越来越多。
1,支持可视化的编译连接;
2,支持调用Debug TD进行调试,省去了开发人员命令输入的过程。
3,关键字变色:寄存器、CPU指令集、FPU指令集、MMX, SSE, SSE2指令集、扩展指令集、
4,工程模板;5, 支持设置代码标记,病支持代码标记的各种相关操作;
6, 支持代码片段快速插入7, 支持指令集查询。
8, 各种常用小工具.
9,完全绿色,无需安装,不写注册表。
VISUALASM 下载:
http://www.ONlinedown.net/soft/2002.htm)
c语言和汇编混编的效率是除纯汇编外效率最高的。混编优点在于汇编可以弥补C语言的一些瓶颈,从而提高效率,如C中的循环就是反复赋值的过程,这是一个瓶颈无法解决,但是这地方若要用汇编代码弥补,就大大提高了效率。
缺点在于不宜编写,本来编写C就需要很小心,还要在准确的加入汇编,对各个寄存器的现场保护与恢复很费脑筋。
汇编可以直接对硬件操作,但没有好的逻辑性,C的移植性和逻辑性都比较好,对于程序,小的部分,直接对硬件操作部分可以用汇编写,总体结构用C构造,C和汇编的混编很常用。
汇编指令有大概两种类型 RISC,CISC,像51,8086等一部分是cisc指令。相对来说简单易懂一点。像arm ,avr,PIC等是risc,指令要复杂些,学起来也就要麻烦点了。处理器不一样,其汇编指令也就不一样。
大多数学校的汇编语言实验是用masm5.0和debug来做的,本来学习编程的的重点在于实践,现在最简
单的事竟然成了最少做的实验。这两个工具都是基于DOS的,使用也较简单。当学完16位的汇编后
就可以学习32位的汇编了,这时如果想用汇编语言开发windows应用程序的话可以学习使用RadAsm,它是汇编语言的集成开发环境,可以和其它集成开发环境一样开发Windows程序。
1:到http://www.masm32.com下载最新的masm32开发包,或在网上搜索下载。
2:到http://www.radasm.com下载最新的RadAsm集成开发环境,或在网上搜索下载。
3:配置一下RadAsm的环境,详细介绍可以看《Win32汇编开发环境介绍和RadAsm简明教程第二版》网页教程。
4:可以进行你的创作了。
假设将masm.exe 和 link.exe 程序放在“D:/Masm”目录下。
1)首先你需要找一个编辑器,编辑器用任何“纯文本”编辑器都可以。比如记事本。编好以后保存到汇编目录中。扩展名为asm,比如myfirst.asm。但这里建议你找一个能显示出当前行的编译器。这样出错后排错很容易。
2)然后在DOS下进入D:/Masm目录中,输入“masm myfirst.asm",如果有错系统会提示出错的行位置和出错原因。
3)然后再输入“link myfirst.obj”,即可看到当前目录下有一个myfirst.exe程序。
4)最后输入“myfirst”来运行程序。
这是一个判断某一年是否为润年的程序,运行可执行程序Ifleap.exe后,输入具体的年份,
可输出是本年是否为闰年的提示信息。
data segment ;定义数据段
infON db 0dh,0ah,'Please input a year: $'
Y db 0dh,0ah,'This is a leap year! $'
N db 0dh,0ah,'This is not a leap year! $'
w dw 0
buf db 8
db ?
db 8 dup(?)
data ends
stack segment stack
db 200 dup(0)
stack ends
code segment
assume ds:data,ss:stack,cs:code
start:mov ax,data
mov ds,ax
lea dx,infon ;在屏幕上显示提示信息
mov ah,9
int 21h
lea dx,buf ;从键盘输入年份字符串
mov ah,10
int 21h
mov cl, [buf+1]
lea di,buf+2
call datacate
call ifyears
jc a1
lea dx,n
mov ah,9
int 21h
jmp exit
a1: lea dx,y
mov ah,9
int 21h
exit: mov ah,4ch
int 21h
datacate proc near;
push cx;
dec cx
lea si,buf+2
tt1: inc si
loop tt1
;lea si,cx[di]
pop cx
mov dh,30h
mov bl,10
mov ax,1
l1: push ax
sub byte ptr [si],dh
mul byte ptr [si]
add w,ax
pop ax
mul bl
dec si
loop l1
ret
datacate endp
ifyears proc near
push bx
push cx
push dx
mov ax,w
mov cx,ax
mov dx,0
mov bx,4
div bx
cmp dx,0
jnz lab1
mov ax,cx
mov bx,100
div bx
cmp dx,0
jnz lab2
mov ax,cx
mov bx,400
div bx
cmp dx,0
jz lab2
lab1: clc
jmp lab3
lab2: stc
lab3: pop dx
pop cx
pop bx
ret
ifyears endp
code ends
end start
本程序需在DOS下运行。每运行一次可执行程序random.exe,即可显示任意两个
16进制数的加法或减法表达式及其运算结果。在减法运算中,如果被减数小于减数,显示
“Divide Overflow”的提示信息。
DATA SEGMENT
CC DB '+'
ww db '-'
GG DB '='
II DB 0DH,0AH,'$'
AA DB 5 DUP(?)
www dw 0
ghh db '0',0dh,0ah,'$'
bnm dw 0
DATA ENDS
STACK SEGMENT
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV CX,20
CALL RAND ;产生一随机数
CALL MCAT ;将随机数转换为16进制表示的ASCII码字符
MOV AX,BX
PUSH AX
CMP www,0 ;WWW=0?
JE A1 ;执行'+'
CMP www,1 ;www=1?
JE A2 ;执行'-'
A1: MOV DL,CC ;显示'+'
MOV AH,2
INT 21H
CALL RAND ;产生另一随机数
add bx,0fh
CALL MCAT ;将随机数转换为16进制表示的ASCII码字符
MOV DL,GG ;显示'='
MOV AH,2
INT 21H
POP AX
ADD AX,BX
cmp ax,0
jne yjw1
lea dx,ghh
mov ah,9
int 21h
jmp qq1
yjw1: JMP B1
A2: MOV DL,WW ;显示'-'
MOV AH,2
INT 21H
mov cx,65535
mai1: loop mai1
CALL RAND1
CALL MCAT
MOV DL,GG
MOV AH,2
INT 21H
POP AX
Sbb AX,BX
cmp ax,0
jne yjw2
lea dx,ghh
mov ah,9
int 21h
jmp qq1
yjw2: JMP B1
B1: MOV BX,AX
CALL MCAT
lea DX,II
MOV AH,9
INT 21H
QQ1: MOV AH,4CH
INT 21H
MCAT PROC ;将随机数转换为16进制表示的ASCII码字符子程序
PUSH AX
push bx
PUSH CX
PUSH DX
CMP BX,9
JA S1
PUSH AX
PUSH BX
PUSH CX
PUSH DX
mov ax,bx
mov bl,5
div bl
cmp ah,3
jae vb1
mov www,1
jmp vn1
vb1:mov www,0
vn1:pop dx
pop cx
pop bx
pop ax
ADD BL,30H
MOV AA,BL
MOV AA+1,'$'
LEA DX,AA
MOV AH,9
INT 21H
JMP s3
s1:MOV CL,4
MOV AL,0
PUSH BX
SHL BX,CL
CMP BH,9
JBE V1
SUB BH,9
ADD BH,40H
JMP MM1
V1:ADD BH,30H
MM1:MOV AA,BH
POP BX
AND BL,0FH
PUSH AX
PUSH BX
PUSH CX
PUSH DX
mov ax,bx
mov bl,5
div bl
cmp ah,3
jae vb2
mov www,1
jmp vn2
vb2:mov www,0
vn2:pop dx
pop cx
pop bx
pop ax
CMP BL,9
JBE TT1
SUB BL,9
ADD BL,40H
JMP RR1
TT1: ADD BL,30H
RR1: MOV AA+1,BL
MOV AA+2,'$'
LEA DX,AA
MOV AH,9
INT 21H
s3:POP DX
POP CX
POP BX
POP AX
RET
MCAT ENDP
RAND PROC
PUSH CX
PUSH DX
PUSH AX
STI
MOV AH,0 ;读时钟计数器值
INT 1AH
MOV AX,DX ;清高6位
AND AH,3
MOV DL,101 ;除101,产生0~100余数
DIV DL
MOV BL,AH ;余数存BX,作随机数
POP AX
POP DX
POP CX
RET
RAND ENDP
RAND1 PROC
PUSH CX
PUSH DX
PUSH AX
STI
MOV AH,0
INT 1AH
MOV ax,cx
AND AH,3
MOV DL,101
DIV DL
MOV BL,AH
POP AX
POP DX
POP CX
RET
RAND1 ENDP
CODE ENDS
END START
这是一个计算数字平台长度的程序,如:
运行时输入:
111122333,结果为:
4
1111
注:本程序在dos中或windows98中运行。
data segment
obf db '***** welcome you !*****',0dh,0ah
db ' input data:','$'
a0 db ?
a1 db ?
b0 db ?
b1 db ?
a db ?
b db ?
data ends
stack segment stack
db 200 dup(0)
stack ends
code segment
assume cs:code, ds:data,ss:stack
main:mov ax, data
mov ds, ax
mov ah, 9
lea dx, [obf]
int 21h
inc dx
mov dl, 13
mov ah, 2
int 21h
mov dl,10
int 21h
mov ah,1
int 21h
cmp al, 13
jz lab1
mov [a0], al
mov [a], al
mov [a1], 1
x1: mov ah, 1
int 21h
cmp al, 13
jz lab1
mov [b], al
mov bl, [b]
cmp bl, [a]
jnz x2
add [a1], 1
jmp x1
x2: mov [b0], bl
mov [b1], 1
x3: mov ah, 1
int 21h
mov [a], al
cmp bl,[a]
jnz x4
add [b1],1
jmp x3
x4: mov cl, [b1]
cmp cl, [a1]
jb y1
mov cl, [b0]
mov [a0], cl
mov cl, [b1]
mov [a1],cl
y1: cmp al, 13
jz lab1
mov [b0], al
mov [b1], 1
mov [b], al
mov bl, [b]
jmp x3
lab1: mov ah, 2
mov dl,13
int 21h
mov dl,10
int 21h
cmp [a1],10
jb z1
mov ah,0
mov al, [a1]
mov bl, 10
div bl
add ax, 3030h
mov bx, ax
mov ah, 2
mov dl, bl
int 21h
mov dl, bh
int 21h
jmp z2
z1: add [a1], 30h
mov dl, [a1]
int 21h
sub [a1],30h
z2: mov ah,2
mov dl, 13
int 21h
mov dl, 10
int 21h
mov cx, 0
mov cl, [a1]
mov ah, 2
m: mov dl,[a0]
int 21h
loop m
mov ah, 4ch
int 21h
code ends
end main
这是从网上下载下来的一个计算程序,能实现加、减、乘、除的计算。该程序接受
的是16进制数。
执行时,需在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下:
c:/masm>js 3+2
5
c:/masm>js 6*7
2A
c:/masm>js 10-4
c
c:/masm>js 12/3
6
B_P EQU BYTE PTR
W_P EQU WORD PTR
D_P EQU DWORD PTR
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
;主程序开始
NEWSTAR:
JMP STAR
EVEN
NUM1 DW 0,0
NUM2 DW 0,0
NUM3 DW 0,0
JGV4 DW 0,0
YSF LABEL WORD
YSF1 DB 0
YSF2 DB 0
JUV DB 0
UV DB 0
;使DS:SI指向第一有效字符
OVERS LABEL NEAR
CLD
PUSH AX
OVERS1:
LODSB
CMP AL,' '
JZ OVERS1
CMP AL,9
JZ OVERS1
DEC SI
CMP AL,13
POP AX
RET
;输出一个制表符
TAB LABEL NEAR
MOV AL,9
JMP SHORT DISP
;输出一个回车换行符
CRLF LABEL NEAR
MOV AL,13
CALL DISP
MOV AL,10
;显示一个字符
DISP LABEL NEAR
PUSH AX
PUSH DX
MOV AH,2
MOV DL,AL
INT 21H
POP DX
POP AX
RET
;检查是否为运算符
ISYSF LABEL NEAR
CLD
LODSB
CALL ISJJ
JZ ISYSF1
CALL ISII
JZ ISYSF1
DEC SI
ISYSF1:
RET
;检查是否是加减运算
ISJJ LABEL NEAR
CMP AL,'+'
JZ ISYSF1
CMP AL,'-'
RET
;检查是否为乘除运算
ISII LABEL NEAR
CMP AL,'*'
JZ ISYSF1
CMP AL,'/'
JZ ISYSF1
CMP AL,'/'
RET
;数据输出
;CX=10 十进制
;CX=16 十六进制
DOUT LABEL NEAR
PUSH AX
PUSH BX
PUSH DX
PUSH BP
XOR BP,BP
DOUT1:
INC BP
PUSH AX
MOV AX,DX
XOR DX,DX
DIV CX
MOV BX,AX
POP AX
DIV CX
PUSH DX
MOV DX,BX
OR BX,AX
JNZ DOUT1
DOUT2:
POP AX
ADD AL,'0'
CMP AL,'9'
JBE DOUT3
ADD AL,'A'-'9'-1
DOUT3:
CALL DISP
DEC BP
JNZ DOUT2
POP BP
POP DX
POP BX
POP AX
RET
;输入数据在DX:AX中返回
;CX=0 数据为10进制
;CX#0 数据为16进制
DATE LABEL NEAR
PUSH BX
PUSH BP
PUSH DI
XOR AX,AX
XOR DX,DX
DATE1:
MOV DI,AX
LODSB
CMP AL,'0'
JB DATE7
CMP AL,'9'
JA DATE6
DATE2:
AND AX,0FH
SHL DI,1
RCL DX,1
MOV BX,DI
MOV BP,DX
SHL DI,1
RCL DX,1
SHL DI,1
RCL DX,1
JCXZ DATE3
SHL DI,1
RCL DX,1
Jmp short DATE4
DATE3:
ADD DI,BX
ADC DX,BP
DATE4:
ADD AX,DI
ADC DX,0
JMP DATE1
DATE5:
ADD AL,9
JMP DATE2
DATE6:
JCXZ DATE7
CMP AL,'A'
JB DATE7
CMP AL,'F'
JBE DATE5
CMP AL,'a'
JB DATE7
CMP AL,'f'
JBE DATE5
DATE7:
MOV AX,DI
DEC SI
OR DI,DX
POP DI
POP BP
POP BX
RET
;数据1与数据2根据YSF1进行加减运算
JSJJ LABEL NEAR
MOV AX,NUM2
MOV DX,NUM2+2
CMP YSF1,'+'
JZ JSJJ1
SUB NUM1,AX
SBB NUM1+2,DX
JMP SHORT JSJJ2
JSJJ1:
ADD NUM1,AX
ADC NUM1+2,DX
JSJJ2:
RET
;数据1与数据2根据YSF1进行乘除运算
JSII1 LABEL NEAR
MOV BX,OFFSET NUM1
JMP SHORT JSII2_1
;数据2与数据3根据YSF2进行乘除运算
JSII2 LABEL NEAR
MOV BX,OFFSET NUM2
JSII2_1:
DB 66H
MOV AX,[BX]
DB 66H
MOV CX,[BX+4]
CMP YSF2,'*'
JNZ JSII2_2
DB 66H
IMUL CX
JMP SHORT JSII2_3
JSII2_2:
DB 66H
CWD
DB 66H
IDIV CX
CMP YSF2,'/'
JZ JSII2_3
DB 66H
XCHG DX,AX
JSII2_3:
DB 66H
MOV [BX],AX
RET
;显示结果
XUJG LABEL NEAR
MOV AX,JGV4
MOV DX,JGV4+2
MOV CX,10
CMP UV,10
JZ XUJG0
MOV CX,16
XUJG0:
TEST DX,8000H
JZ XUJG1
CMP UV,10
JZ XUJG2
CALL DOUT
XUJG2:
NOT AX
NOT DX
ADD AX,1
ADC DX,0
PUSH AX
CMP UV,10
JZ XUJG3
MOV AL,' '
CALL DISP
MOV AL,'('
CALL DISP
XUJG3:
MOV AL,'-'
CALL DISP
POP AX
CMP UV,10
JZ XUJG1
CALL DOUT
MOV AL,')'
CALL DISP
RET
XUJG1:
CALL DOUT
RET
;计算结果放入DX:AX中
JSJG LABEL NEAR
CALL JSJJ
MOV AX,NUM1
MOV DX,NUM1+2
RET
;从DS:SI处取一个数据
LOADATE LABEL NEAR
LODSB
CMP AL,'('
JZ LOADATE1
DEC SI
PUSH CX
XOR CX,CX
CMP UV,10
JZ LOADATE0
INC CX ;取16进制数
LOADATE0:
CALL DATE ;取数据放入DX:AX中
POP CX
RET
LOADATE1:
PUSH NUM1 ;保存数据1数据2及运算符
PUSH NUM1+2
PUSH NUM2
PUSH NUM2+2
PUSH YSF
INC JUV
MOV JGV4,0 ;结果值清零
MOV JGV4+2,0
;进行四则运算
SZYS LABEL NEAR
CALL ISYSF ;首字符是运算符?
JZ SZYS2
CALL LOADATE ;不是,取数并保存
MOV NUM1,AX
MOV NUM1+2,DX
SZYS1:
XOR AX,AX ;数据2清零
MOV NUM2,AX
MOV NUM2+2,AX
CALL ISYSF ;下个是运算符?
JZ SZYS3
JNZ SZYS6
SZYS2:
PUSH AX
MOV AX,JGV4 ;将结果作为数据1
MOV NUM1,AX
MOV AX,JGV4+2
MOV NUM1+2,AX
POP AX
SZYS3:
MOV YSF1,AL
MOV YSF2,AL
CALL ISJJ ;是加减运算转
JZ SZYS4
CALL LOADATE ;取数据2
MOV NUM2,AX
MOV NUM2+2,DX
CALL JSII1 ;数据1与数据2根据YSF1进行乘除运算
JMP SZYS1 ; 结果保存在数据1中
SZYS4:
CALL LOADATE ;取数据2并保存
MOV NUM2,AX
MOV NUM2+2,DX
SZYS4_1:
CALL ISYSF
JNZ SZYS6
CALL ISJJ ;运算符2是加减运算?
JNZ SZYS5 ;不是转
PUSH AX
CALL JSJJ ;数据1与数据2根据YSF1进行加减运算
POP AX ; 结果保存在数据1中
MOV YSF1,AL ;保存新的运算符
JMP SZYS4
SZYS5:
MOV YSF2,AL ;保存运算符2
CALL LOADATE ;取数据3
MOV NUM3,AX
MOV NUM3+2,DX
CALL JSII2 ;数据2与数据3根据YSF2进行乘除运算
JMP SZYS4_1 ; 结果保存在数据2中
SZYS6:
MOV CL,AL
CMP AL,13
JNZ SZYS9
SZYS7:
CALL JSJG
CMP JUV,0
JZ SZYS8
DEC JUV
POP YSF
POP NUM2+2
POP NUM2
POP NUM1+2
POP NUM1
RET
SZYS8:
CMP CL,')'
JZ SZYS10
MOV JGV4,AX
MOV JGV4+2,DX
JNZ SZYS12
SZYS9:
CMP AL,')'
JNZ SZYS11
INC SI
JMP SZYS7
SZYS10:
MOV NUM1,AX
MOV NUM1+2,DX
JMP SZYS1
SZYS11:
STC
RET
SZYS12:
CLC
RET
;数制处理
UVIL LABEL NEAR
PUSH SI
UVIL1:
LODSB
CMP AL,' '
JZ UVIL2
CMP AL,9
JZ UVIL2
CMP AL,13
JZ UVIL4
JNZ UVIL1
UVIL2:
MOV BX,SI
CALL OVERS
JZ UVIL3
LODSW
CALL OVERS
POP SI
JNZ SZYS11
CMP AX,'01'
JNZ SZYS11
PUSH SI
MOV UV,10
UVIL3:
MOV AL,13
MOV [BX-1],AL
UVIL4:
POP SI
CLC
RET
;预置结果
YVJG LABEL NEAR
MOV AH,52H
INT 21H
MOV AX,ES:[BX-2]
MOV DS,AX
MOV AX,DS:[0CH]
MOV CS:JGV4,AX
MOV AX,DS:[0EH]
MOV CS:JGV4+2,AX
PUSH CS
POP DS
PUSH CS
POP ES
RET
;保存结果
BCJG LABEL NEAR
MOV AH,52H
INT 21H
MOV AX,ES:[BX-2]
MOV DS,AX
MOV AX,CS:JGV4
MOV DS:[0CH],AX
MOV AX,CS:JGV4+2
MOV DS:[0EH],AX
PUSH CS
POP DS
PUSH CS
POP ES
RET
STAR:
MOV SI,81H
CLD
CALL OVERS
JNZ STAR1
STAR0:
MOV DX,OFFSET MESS1
JMP STAR4
STAR1:
CALL YVJG
CALL UVIL
JB STAR0
MOV SAVESP,SP
CALL SZYS
MOV SP,SAVESP
MOV DX,OFFSET MESS2
JB STAR4
CALL CRLF
CALL XUJG
CALL BCJG
MOV DX,OFFSET MESS3
STAR4:
MOV AH,9
INT 21H
INT 20H
SAVESP DW 0
MESS1 DB 13,10,' Syntax:',13,10
DB ' JS <ExpressiON> [10]',13,10,'$'
MESS2 DB 'Error in expression !$'
MESS3 DB 13,10,'$'
CODE ENDS
END NEWSTAR
该程序实现显示一个数字的方阵,程序中的清屏功能可将上次运行的结果清除,重新显示下次运行结果。本程序在dos中或windows98中运行。
data segment
buf1 db '1 2 38 9 47 6 5'
buf2 db '1 2 3 412 13 14 511 16 15 610 9 8 7'
buf3 db '1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9'
dbuf db 14 dup(?)
i1 db 0dh,0ah,'this is a fangzhen programme'
db 0dh,0ah,'input q to exit'
db 0dh,0ah,'Please input a number(3--5):','$'
i2 db 0dh,0ah,'input error,please reinput!','$'
n db ?
b db 1
data ends
stack segment
db 100 dup(?)
stack ends
code segment
assume ds:data,cs:code,ss:stack
main:
mov ax,data
mov ds,ax
call clear
lop: lea dx,i1
mov ah,9
int 21h
mov ah,1
int 21h
cmp al,'q'
jz quit
lea si,buf1
mov n,7
mov cl,3
call clear
cmp al,'3'
jz s
lea si,buf2
mov n,10
mov cl,4
cmp al,'4'
jz s
lea si,buf3
mov cl,5
mov n,13
cmp al,'5'
jz s
lea dx,i2
mov ah,9
int 21h
call clear
jmp lop
s:
mov bl,n
lea di,dbuf
l: mov al,[si]
mov [di],al
inc si
inc di
dec bl
jne l
mov [di],byte ptr '$'
mov ah,2
mov dh,b
mov dl,0
int 10h
lea dx,dbuf
mov ah,9
int 21h
inc b
loop s
jmp lop
quit: mov ah,4ch
int 21h
;***清屏***
clear proc near
push ax
push bx
push cx
push dx
mov ah,6
mov al,0
mov ch,0
mov cl,0
mov dh,24
mov dl,79
mov bh,7
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear endp
code ends
end main
这是一个对数据进行加密的程序。
p macro buf
lea dx,buf
mov ah,9
int 21h
endm
data segment
pp db 0dh,0ah,' welcome you to run this programme!$'
qq db 0dh,0ah,' when you input number,press enter.$'
qw db 0dh,0ah,'6eh,52h,94h,52h,$'
qa db 0dh,0ah,' $'
info1 db 0dh,0ah,0dh,' input number:$'
info2 db 0dh,0ah,' output number:$'
bufa db 20
db ?
db 20 dup(0)
bufb db 20 dup(0)
buf1 db 20
db ?
db 20 dup(0)
buf2 db 20 dup(0)
buf3 db 20
db ?
db 20 dup(0)
buf4 db 20 dup(0)
data ends
stack segment
db 100 dup(0)
stack ends
code segment
assume ds:data,cs:code
s: mov ax,data
mov ds,ax
mov ah,0
mov al,3
int 10h
mov ah,0bh
mov bh,0
mov bl,3
int 10h
p pp
p qq
lea si,qw
mov di,5
mov dx,0405h
mov ah,15
int 10h
lp: mov ah,2
inc dl
int 10h
mov bl,[si]
mov cx,1
mov ah,9
int 10h
inc si
jnz lp
p qa
p qa
p qa
p info1
lea dx,bufa
mov ah,10
int 21h
lea si,bufa+1
mov ch,0
mov cl,[si]
lea di,bufb
n: mov bx,offset bufa
mov al,0
xlat bufa
mov [di],al
inc di
loop n
mov byte ptr [di],'$'
p info2
p bufb
p info1
lea dx,buf1
mov ah,10
int 21h
lea si,buf1+1
mov ch,0
mov cl,[si]
lea di,buf2
n1: mov bx,offset buf1
mov al,2
xlat buf1
mov [di],al
inc di
loop n1
mov byte ptr [di],'$'
p info2
p buf2
p info1
lea dx,buf3
mov ah,10
int 21h
lea si,buf3+1
mov ch,0
mov cl,[si]
lea di,buf4
n2: mov bx,offset buf3
mov al,3
xlat buf3
mov [di],al
inc di
loop n2
mov byte ptr [di],'$'
p info2
p buf4
mov ah,4ch
int 21h
code ends
end s
这是一个字母或数制之间的转化程序,5为主模块,调用模块1和模块7
模块1又调用模块2、3、4和6四个模块,其中:
模块2实现小写字母向大写字母的转换
模块3实现大写字母向小写字母的转换
模块4实现二进制数向十六进制数的转换
模块6实现十六进制数向二进制数的转换
模块7实现十六进制数向十进制数的转换
按“q”键退出。
使用时,需将7个文件分别汇编,连接的方法为:
5+1+2+3+4+6+7
生成可执行文件“5” 即可运行。
模块1:
public info1,info2,bufa,bufb,buf,main,info0,info3
extrn change1:far,change2:far,change3:far,change4:far
data segment
info0 db 0ah,0dh,'this is the change of letter to leter:$'
info1 db 0ah,0dh,'please input string:$'
info2 db 0ah,0dh,'OUTPUT string:$'
bufa db 81
db ?
db 80 dup (?)
bufb db 80 dup (?)
info3 db 0ah,0dh,'this is the change of digital to digital:',0ah,0dh,'$'
buf db 0dh,0ah,'the number is:0100101010001111b',0ah,0dh,'the result is:$'
data ends
stack segment stack
db 200 dup (?)
stack ends
code segment
main proc far
assume ds:data,cs:code,ss:stack
mov ax,data
mov ds,ax
disp macro m
lea dx,m
mov ah,9
int 21h
endm
call change1
call change2
disp info3
disp buf
call change3
call change4
ret
main endp
code ends
end
模块2:
extrn info1:byte,info2:byte,bufa:byte,bufb:byte,info0:byte
public change1
code segment
assume cs:code
lowtohigh proc near
cmp al,'a'
jb stop
cmp al,'z'
ja stop
sub al,20h
stop :ret
lowtohigh endp
change1 proc far
lea dx,info0
mov ah,9
int 21h
lea dx,info1
mov ah,9
int 21h
lea dx,bufa
mov ah,10
int 21h
lea si,bufa+1
lea di,bufb
mov ch,0
mov cl,[si]
add si,1
next:mov al,[si]
call lowtohigh
mov [di],al
inc si
inc di
loop next
mov byte ptr [di],'$'
lea dx,info2
mov ah,9
int 21h
lea dx,bufb
mov ah,9
int 21h
ret
change1 endp
code ends
end
模块3:
extrn info1:byte,info2:byte,bufa:byte,bufb:byte
public change2
code segment
assume cs:code
hightolow proc near
cmp al,'A'
jb stop
cmp al,'Z'
ja stop
add al,20h
stop:ret
hightolow endp
change2 proc far
lea dx,info1
mov ah,9
int 21h
lea dx,bufa
mov ah,10
int 21h
lea si,bufa+1
lea di,bufb
mov ch,0
mov cl,[si]
inc si
next:mov al,[si]
call hightolow
mov [di],al
inc si
inc di
loop next
mov byte ptr [di] ,'$'
lea dx,info2
mov ah,9
int 21h
lea dx,bufb
mov ah,9
int 21h
ret
change2 endp
code ends
end
模块4:
extrn buf:byte,info3:byte
public change3
code segment
change3 proc far
assume cs:code
sub ax,ax
mov ch,4
mov cl,4
mov bx,4a8fh
rotate: rol bx,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl printit
add al,7h
printit: mov dl,al
mov ah,2
int 21h
dec ch
jnz rotate
mov dl,'H'
mov ah,2
int 21h
ret
change3 endp
code ends
end
模块6:
public change4
data segment
buf db 0ah,0dh,'please input the four hexnumber:$'
data ends
code segment
assume cs:code,ds:data
change4 proc far
mov ax,data
mov ds,ax
lea dx,buf
mov ah,9
int 21h
mov bx,0
mov ch,4
input: mov cl,4
sal bx,cl
mov ah,1
int 21h
cmp al,39h
ja af
and al,0fh
jmp binary
af: and al,0fh
add al,9
binary: or bl,al
dec ch
cmp ch,0
jne input
mov dl,'H'
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
mov dl,0dh
mov ah,02
int 21h
mov cx,16
disp: mov dl,0
rol bx,1
rcl dl,1
or dl,30h
mov ah,02h
int 21h
loop disp
mov dl,'B'
mov ah,2
int 21h
ret
change4 endp
code ends
end
模块7:
public change5
data segment
binary dw 7fffh,50h
n=($-binary)/2
buf db 7 dup(0)
info1 db 0ah,0dh,'this is the change from hexnumber to decimal:$'
info2 db 0ah,0dh,'the number is:7fffh,50h$',0ah,0dh
info3 db 0ah,0dh,'the result is:$'
data ends
stack segment stack
db 200 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
f2to10 proc near
push bx
push dx
push si
push cx
disp macro m
lea dx,m
mov ah,9
int 21h
endm
lea si,buf
or ax,ax
jns plus
neg ax
mov [si],byte ptr '-'
inc si
plus: mov bx,10
mov cx,0
lop1: mov dx,0
div bx
push dx
inc cx
or ax,ax
jne lop1
lop2: pop ax
cmp al,10
jb l1
add al,7
l1: add al,30h
mov [si],al
inc si
dec cx
jne lop2
mov [si],byte ptr 'D'
inc si
mov [si],byte ptr '$'
disp info3
disp buf
pop cx
pop si
pop dx
pop bx
ret
f2to10 endp
change5 proc far
start: mov ax,data
mov ds,ax
disp info1
disp info2
mov cx,n
lea di,binary
lopa: mov ax,[di]
call f2to10
add di,2
loop lopa
ret
change5 endp
code ends
end
extrn main:far,change5:far
stack segment para public 'stack'
db 200 dup (0)
stack ends
data segment
;*****主程序中的提示信息*****
str1 DB 0AH,0DH, '********************************************$'
str2 DB 0AH,0DH, '** **$'
str3 DB 0AH,0DH, '** welcome you ! **$'
str4 DB 0AH,0DH, '** **$'
str5 DB 0AH,0DH, '** this is programme of shuzhizhuanghuan **$'
str6 db 0AH,0DH, '** **$'
str7 db 0AH,0DH, '** press b to begin exchange! **$'
str8 DB 0AH,0DH, '** press q to exit ! **$'
str9 DB 0AH,0DH, '** **$'
str10 DB 0AH,0DH, '********************************************$'
str11 db 0ah,0dh,'input error,please repess!','$'
data ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax
disp macro m
lea dx,m
mov ah,9
int 21h
endm
disp str1
disp str3
disp str4
disp str5
disp str6
disp str7
disp str8
disp str9
disp str10
lop: mov ah,8
int 21h
cmp al,'b'
jz ltol
cmp al,'q'
jz exit
disp str11
jmp lop
ltol: call main
call change5
jmp lop
exit: mov ah,4ch
int 21h
code ends
end start
本程序能从键盘读入二个五位十进制数(1位符号位+4位数值位),并将这二个十进制数
分别转换为二进制数,然后求其和,再将和以十进制形式进行显示。
;模块B:
PUBLIC ASC_TO_BIN , BIN_TO_ASCII
DATA SEGMENT COMMON
INPUT_MESSAGE DB 0AH , 'PLEASE INPUT A NUMBER(LESS THAN 5 FIGURES):$'
IN_ASC_BUF DB 6 ;十进制数的输入缓冲区,共可接收6个字符
DB ? ;保留,用于10号调用时DOS填入实际输入字符个数
DB 6 DUP(?) ;一个符号位,四位数字ASCII码,加上一个回车符,
;共计6字符
BIN_BUF1 DW ? ;将第一个数转换为二进制后,放于此处
OUTPUT_MESSAGE DB 0AH , 'THE SUM IS:' , '$'
OUT_ASC_SUM DB 6 DUP(?) , '$' ;将二个数的和转换为ASCII码后,放于此处,
;以供9号调用显示
DATA ENDS
CSEG SEGMENT
ASSUME CS:CSEG , DS:DATA
ASC_TO_BIN PROC FAR
;ASCII码转换为二进制数
;入口:十进制数的ASCII码在IN_ASC_BUF内
;出口:转换后的二进制数在AX内
;算法:先将其转换成十进制数字,再用累加和乘10加X的方法变成二进制数,如将
;358转换为二进制数,可先将累加和赋0,再计算(((0*10+3)*10+5)*10+8),结果为二
;进制数,再由符号位决定是否需要求补。
MOV CL , IN_ASC_BUF+1 ;取字符个数
MOV CH , 0
DEC CL ;扣除符号位
MOV BX , OFFSET IN_ASC_BUF+3 ;调整BX指向十进制数的最高位
PUSH BX
PUSH CX
L1:
MOV AL , [BX]
AND AL , 0FH
MOV [BX] , AL
INC BX
LOOP L1 ;将所有数字字符的高四位清0,使之变为数字值
POP CX
POP BX
MOV AX , 0 ;累加和赋初值
MOV SI , 10
L2:
MUL SI
ADD AL , [BX]
ADC AH , 0
INC BX
LOOP L2 ;累加乘10
CMP IN_ASC_BUF+2 , '+'
JZ L3 ;符号是正号,转移
NEG AX ;符号是负号,求补
L3:
RET
ASC_TO_BIN ENDP
BIN_TO_ASCII PROC FAR
;将二进制数转换为对应十进制数数字的ASCII码
;入口:二进制数在AX内
;出口:转换后的ASCII码在OUT_ASC_SUM变量内
;算法:AX中的数范围在+32767到-32768之间,先检查AX中的符号位,以决定输出“+”
;还是“-”,若是负数,应先求补,得到原码后即可与正数作统一处理。转换方法为将被转换的
;二进制数先除以10000,商;即为万位数,再将余数除以1000,商为千位数,以此类推,求出
;百、十位数,剩下的为个位数。最后,将各个数加上30H,即成为对应字符。
MOV OUT_ASC_SUM , '+'
CMP AX , 0
JGE L4 ;不是负数,转移
NEG AX
MOV OUT_ASC_SUM , '-'
L4:
CWD
MOV BX , 10000
DIV BX
ADD AL , 30H ; 将万位转换为数字(商应在AX内,但因为商不大于3,
;所以有效部分在AL内)
MOV OUT_ASC_SUM+1 , AL ;保存万位数字
MOV AX , DX ;将余数置入AX内,以便当作被除数
CWD
MOV BX , 1000
DIV BX
ADD AL , 30H
MOV OUT_ASC_SUM+2 , AL ;保存千位数字
MOV AX , DX ;将余数置入AX内,以便当作被除数
MOV BL , 100
DIV BL
ADD AL , 30H
MOV OUT_ASC_SUM+3 , AL ;保存百位数字
MOV AL , AH
CBW
MOV BL , 10
DIV BL
ADD AL , 30H
MOV OUT_ASC_SUM+4 , AL ;保存十位数字
ADD AH , 30H
MOV OUT_ASC_SUM+5 , AH ;保存个位数字
RET
BIN_TO_ASCII ENDP
CSEG ENDS
END
EXTRN ASC_TO_BIN:FAR , BIN_TO_ASCII:FAR
DATA SEGMENT COMMON
INPUT_MESSAGE DB 0AH , 'PLEASE INPUT A NUMBER(LESS THAN 5 FIGURES):$'
IN_ASC_BUF DB 6 ;十进制数的输入缓冲区,共可接收6个字符
DB ? ;保留,用于10号调用时DOS填入实际输入字符个数
DB 6 DUP(?) ;一个符号位,四位数字ASCII码,加上一个回车符,
;共计6字符
BIN_BUF1 DW ? ;将第一个数转换为二进制后,放于此处
OUTPUT_MESSAGE DB 0AH , 'THE SUM IS:' , '$'
OUT_ASC_SUM DB 6 DUP(?) , '$' ;将二个数的和转换为ASCII码后,放于此处,
;以供9号调用显示
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE , DS:DATA
START:
MOV AX , DATA
MOV DS , AX
MOV DX , OFFSET INPUT_MESSAGE
MOV AH , 9
INT 21H ;提示输入一个数
MOV DX , OFFSET IN_ASC_BUF
MOV AH , 10
INT 21H ;读取第一个数
CALL ASC_TO_BIN ;转换第一个数为二进制
MOV BIN_BUF1 , AX ;保存第一个数
MOV DX , OFFSET INPUT_MESSAGE
MOV AH , 9
INT 21H ;提示输入一个数
MOV DX , OFFSET IN_ASC_BUF
MOV AH , 10
INT 21H ;读取第二个数
CALL ASC_TO_BIN ; 转换第二个数为二进制
ADD AX , BIN_BUF1 ;计算这二个数之和
CALL BIN_TO_ASCII ;将和转换为ASCII码,以供显示用
MOV DX , OFFSET OUTPUT_MESSAGE
MOV AH , 9
INT 21H
MOV DX , OFFSET OUT_ASC_SUM
MOV AH , 9
INT 21H
MOV AH , 4CH
INT 21H
CODE ENDS
END START
这是一个音乐程序,按大写字母“A”,唱乐曲“玛丽有只小羔羊”;
按大写字母“B”,唱乐曲“太湖船”
按大写字母“C”,唱乐曲“祝福歌”
按"X"鍵,退出
DATA SEGMENT PARA 'DATA'
INFO1 DB 0DH,0AH,'WELCOME YOU TO COME HERE!$'
INFO2 DB 0DH,0AH,'this is a music program!$'
INFO3 DB 0DH,0AH,'please SELECT!$'
INFO4 DB 0DH,0AH,'INPUT ERROR!$'
INFO5 DB 0DH,0AH,'PLEASE INPUT AGAIN!$'
MUSLIST DB 0DH,0AH,'A MUSIC1'
DB 0DH,0AH,'B MUSIC2'
DB 0DH,0AH,'C MUSIC3'
DB 0DH,0AH,'Q EXIT'
db 0dh,0ah,'$'
MUS_FREG1 DW 330,294,262,294,3 DUP (330)
DW 3 DUP (294),330,392,392
DW 330,294,262,294,4 DUP (330)
DW 294,294,330,294,262,-1
MUS_TIME1 DW 6 DUP (25*8),50*8
DW 2 DUP (25*8,25*8,50*8)
DW 12 DUP (25*8),100*8
MUS_FREG2 DW 330,392,330,294,330,392,330,294,330
DW 330,392,330,294,262,294,330,392,294
DW 262,262,220,196,196,220,262,294,332,262,-1
MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100
DW 2 DUP(50,50,25,25),100
DW 3 DUP(50,25,25),100
MUS_FREG3 DW 262,262,294,262,349
DW 330,262,262,294,262
DW 392,349,262,262,523
DW 440,349,262,262,466
DW 466,440,262,392,349,-1
MUS_TIME3 DW 50,50,100,100,100
DW 100,100,50,50,100,100
DW 100,100,100,50,50,100
DW 100,100,100,100,100,50
DW 50,100,100,100,100,100
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 200 DUP ('STACK')
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
MOV aH, 0
MOV AL,4
INT 10H
MOV AH,0BH
MOV BH,0
MOV BL,4
INT 10H
MOV AH,0BH
MOV BH,01H
MOV BL,00
INT 10H
;*****定义一个宏*****
SHOW MACRO b
LEA DX,b
MOV AH,9
INT 21H
ENDM
;**********************
show INFO1
show INFO2
show INFO3
show MUSLIST
INPUT: MOV AH,01H
INT 21H
CMP AL,'Q'
JZ retu
CMP AL,'A'
JNZ B0
CALL MUSIC1
JMP EXIT1
B0: CMP AL,'B'
JNZ C0
CALL MUSIC2
JMP EXIT1
C0: CMP AL,'C'
JNZ exit
CALL MUSIC3
EXIT1: show INFO5
JMP INPUT
EXIT:
call clear
show INFO4
show INFO5
show INFO1
show INFO2
show INFO3
show MUSLIST
jmp input
RETU: MOV AH,4CH
INT 21H
MAIN ENDP
MUSIC1 PROC NEAR
PUSH DS
SUB AX,AX
PUSH AX
LEA SI,MUS_FREG1
LEA BP,DS:MUS_TIME1
FREG1: MOV DI,[SI]
CMP DI,-1
JE END_MUS1
MOV DX,DS:[BP]
MOV BX,1400
CALL GENSOUND
ADD SI,2
ADD BP,2
JMP FREG1
END_MUS1:
RET
MUSIC1 ENDP
GENSOUND PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL,0B6H
OUT 43H,AL
MOV DX,12H
MOV AX,533H*896
DIV DI
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
MOV AH,AL
OR AL,3
OUT 61H,AL
WAIT1: MOV CX,8FF0H
DELAY1: LOOP DELAY1
DEC BX
JNZ WAIT1
MOV AL,AH
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
GENSOUND ENDP
MUSIC2 PROC NEAR
PUSH DS
SUB AX,AX
PUSH AX
LEA SI,MUS_FREG2
LEA BP,DS:MUS_TIME2
FREG2: MOV DI,[SI]
CMP DI,-1
JE END_MUS2
MOV DX,DS:[BP]
MOV BX,1400
CALL GENSOUND
ADD SI,2
ADD BP,2
JMP FREG1
END_MUS2:
RET
MUSIC2 ENDP
MUSIC3 PROC NEAR
PUSH DS
SUB AX,AX
PUSH AX
LEA SI,MUS_FREG3
LEA BP,DS:MUS_TIME3
FREG3: MOV DI,[SI]
CMP DI,-1
JE END_MUS3
MOV DX,DS:[BP]
MOV BX,1400
CALL GENSOUND
ADD SI,2
ADD BP,2
JMP FREG1
END_MUS3:
RET
MUSIC3 ENDP
clear proc near
push ax
push bx
push cx
push dx
mov ah,6
mov al,0
mov ch,0
mov cl,0
mov dh,24
mov dl,79
mov bh,7
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear endp
CODE ENDS
END MAIN
这是一个用四种颜色各显示一个矩形块的程序
DATA SEGMENT
LINE DW 0 ;矩形块左上角的行
ROW DW 0 ;矩形块左上角的列
PIX DB 0 ;矩形块的颜色
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: ;主程序
MOV AX , DATA
MOV DS , AX
MOV AH , 0
MOV AL , 4
INT 10H ;设置320×200彩色图形方式
mov ah,0bh
mov bh,01
mov bl,0
int 10h
MOV CX, 4
L1:
CALL DISP_RECT
call delay
inc PIX ;每循环一次,点的颜色加1
ADD ROW , 30 ;改变下一个方块的显示位置
LOOP L1
MOV AH , 4CH
INT 21H ;返回DOS
;显示矩形块的子程序,矩形块的显示位置由DATA段中的LINE、ROW变量指定,
;颜色由PIX变量指定,矩形块的大小是固定的,为10个点宽,100个点高。
DISP_RECT PROC near
PUSH AX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
MOV AH , 0CH ;指明写点调用
MOV AL , PIX ;取点的颜色
MOV DI , 100 ;用于控制行显示循环
MOV DX , LINE ;取点的行坐标
DISP_2:
MOV SI , 10 ;控制列显示循环
MOV CX , ROW ;取显示点的列坐标
DISP_1:
INT 10H ;完成点的显示
INC CX ;列坐标加1(行不变)
DEC SI
JNZ DISP_1 ;循环显示完一行的10个点
INC DX ;行坐标加1
DEC DI
JNZ DISP_2 ;循环显示完100行
POP DI
POP SI
POP DX
POP CX
POP AX
RET
DISP_RECT ENDP
delay proc near
push cx
push dx
mov dx,5000
d11: mov cx,25000
d12: loop d12
dec dx
jnz d11
pop dx
pop cx
ret
delay endp
CODE ENDS
END START
这是一个显示“中国北京”字样的程序,按“q”键退出。
data segment
car db 133 ;定义字符图形表
db 05h,122,0,0
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,0,3
db 05h,122,1,0
db 05h,122,2,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,-8,0
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,0,7
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,2,2
db 05h,122,0,1
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,0,-1
db 05h,122,-2,0
db 05h,122,2,2
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,-2,0
db 05h,122,0,6
db 05h,122,3,0
db 05h,122,0,1
db 05h,122,-3,0
db 05h,122,-3,1
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,0,2
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,-1,-2
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,-1,-2
db 05h,122,-1,0
db 05h,122,-1,0
db 05h,122,0,9
db 05h,122,1,-3
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,0,1
db 05h,122,2,-1
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,1,0
db 05h,122,0,4
db 05h,122,1,0
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,0,-1
db 05h,122,1,2
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,1,0
db 05h,122,-3,-1
db 05h,122,0,2
db 05h,122,1,1
db 05h,122,0,-4
db 05h,122,1,-1
db 05h,122,0,6
char_cnt dw ?
pointer dw ?
line_ON db ?
col_on db ?
data ends
stack segment
db 2000 dup (0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov ah,0
mov al,4
int 10h
mov ah,0bh
mov bh,0
mov bl,2
int 10h
mov ah,0bh
mov bh,01
mov bl,00
int 10h
call clear_screen ;调用清屏子程序
lea di,car
mov dh,10
mov dl,2
call move_shape
mov ah,8
int 21h
cmp al,'q'
jz exit
main endp
clear_screen proc near
push ax
push bx
push cx
push dx
mov ah,6
mov al,0
mov ch,0
mov cl,0
mov dh,120
mov dl,200
mov bh,7
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear_screen endp
move_shape proc near
push ax
push bx
push cx
push dx
push di
mov ah,0fh
int 10h
sub ch,ch
mov cl,[di]
inc di
mov char_cnt,cx
mov pointer,di
mov line_on,dh
mov col_on,dl
mov_crsr:
add dh,[di+2]
add dl,[di+3]
mov ah ,2
int 10h
mov al,[di]
mov bl,[di+1]
push cx
mov cx,1
mov ah,09
int 10h
pop cx
add di,4
loop mov_crsr
call dly_qrtr ;调用延时子程序
pop di
pop dx
pop cx
pop bx
pop ax
ret
move_shape endp
dly_qrtr proc near
push cx
push dx
mov dx,5000
d11:mov cx,25000
d12:loop d12
dec dx
jnz d11
pop dx
pop cx
ret
dly_qrtr endp
exit:mov ah,4ch
int 21h
code ends
end main
本程序在文本显示方式下实现了显示字符图形“阳泉学院”。
按回车键即可返回操作系统。
data segment
car db 238 ;阳泉学院字符图形表
DB 2ah,238,0,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
db 2ah,238,1,0
DB 2ah,238,-13,1
DB 2ah,238,0,1
DB 2ah,238,0,1
DB 2ah,238,0,1
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
db 2ah,238,1,0
DB 2ah,238,-4,-3
DB 2ah,238,0,1
DB 2ah,238,0,1
DB 2ah,238,4,-2
DB 2ah,238,0,1
DB 2ah,238,0,1
DB 2ah,238,0,3
DB 2ah,238,-1,0
DB 2ah,238,-1,0
DB 2ah,238,-1,0
DB 2ah,238,-1,0
DB 2ah,238,-1,0
DB 2ah,238,-1,0
DB 2ah,238,-1,0
DB 2ah,238,0,1
DB 2ah,238,0,1
DB 2ah,238,0,1
DB 2ah,238,0,1
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
DB 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,-4,-3
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,4,-2
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,-10,7
db 2ah,238,0,1
db 2ah,238,1,-3
db 2ah,238,0,1
db 2ah,238,1,-3
db 2ah,238,0,1
db 2ah,238,1,-1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,1,-8
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,-1,0
db 2ah,238,-1,0
db 2ah,238,-1,0
db 2ah,238,1,-7
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,3,-1
db 2ah,238,1,-4
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,1,-4
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,0,-2
db 2ah,238,1,1
db 2ah,238,-4,0
db 2ah,238,1,-1
db 2ah,238,1,-1
db 2ah,238,1,-1
db 2ah,238,1,-1
db 2ah,238,-4,6
db 2ah,238,1,1
db 2ah,238,1,1
db 2ah,238,1,1
db 2ah,238,1,1
db 2ah,238,-12,1
db 2ah,238,-2,1
db 2ah,238,1,0
db 2ah,238,0,1
db 2ah,238,-1,2
db 2ah,238,0,1
db 2ah,238,1,0
db 2ah,238,0,1
db 2ah,238,0,2
db 2ah,238,0,1
db 2ah,238,-1,0
db 2ah,238,0,1
db 2ah,238,3,-10
db 2ah,238,-1,0
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,1,0
db 2ah,238,1,-8
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,1,-1
db 2ah,238,1,-1
db 2ah,238,1,-1
db 2ah,238,1,-4
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,1,-5
db 2ah,238,1,1
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,-1
db 2ah,238,-1,-1
db 2ah,238,-13,8
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,-14,1
db 2ah,238,0,1
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,-4,-1
db 2ah,238,4,0
db 2ah,238,-8,5
db 2ah,238,0,1
db 2ah,238,1,0
db 2ah,238,0,1
db 2ah,238,2,-4
db 2ah,238,-1,0
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,1,0
db 2ah,238,1,-2
db 2ah,238,0,-1
db 2ah,238,0,-1
db 2ah,238,0,-1
db 2ah,238,2,-1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,0,1
db 2ah,238,1,-4
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,-1
db 2ah,238,1,-1
db 2ah,238,1,-1
db 2ah,238,-7,6
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,0
db 2ah,238,1,1
db 2ah,238,1,1
db 2ah,238,1,1
char_cnt dw ?
pointer dw ?
line_ON db ?
col_on db ?
data ends
stack segment
db 2000 dup (0)
stack ends
code segment
assume cs:code,ds:data
main proc far
push ds
sub ax,ax
push ax
mov ax,data ;初始化DS
mov ds,ax
mov ah,0 ;设置300*200彩色图形方式
mov al,3
int 10h
mov ah,0bh ;设置背景颜色
mov bh,0
mov bl,2
int 10h
mov ah,0bh ;设置彩色调板
mov bh,01
mov bl,00
int 10h
call clear_screen ;清屏
lea di,car ;di指向字符图形表
mov dh,5 ;从第5行第5列位置开始
mov dl,5 ;显示汽车
call move_shape
mov ah,01h ;从键盘输入字符
int 21h
cmp al,0dh
je exit
exit:mov ah,4ch
int 21h
ret
main endp
clear_screen proc near ;清屏子程序
push ax ;保护寄存器
push bx
push cx
push dx
mov ah,6 ;屏幕上卷功能
mov al,6
mov ch,0 ;左上角行号
mov cl,0 ;左上角列号
mov dh,250 ;右下角行号
mov dl,200 ;右下角列号
mov bh,7 ;卷入行属性
int 10h ;调用显示功能
pop dx ;恢复寄存器
pop cx
pop bx
pop ax
ret ;返回主程序
clear_screen endp
move_shape proc near
push ax
push bx
push cx
push dx
push di
mov ah,0fh ;取当前显示方式
int 10h
sub ch,ch ;清除寄存器CX的高字节
mov cl,[di] ;CL放循环次数
inc di ;di指向字符表的第一个字符
mov char_cnt,cx ;保存循环次数
mov pointer,di
mov line_on,dh
mov col_on,dl
plot_next:
add dh,[di+2] ;改变行列指针
add dl,[di+3]
cmp dl,150 ;出屏否?
jb mov_crsr
call erase
pop di
pop dx
pop cx
pop bx
pop ax
ret
mov_crsr:
mov ah,2 ;移动光标位置
int 10h
mov al,[di]
mov bl,[di+1] ;取字符值及属性
push cx
mov cx,1
mov ah,09 ;显示字符
int 10h
pop cx
add di,4 ;di指向下一个字符
loop plot_next
call dly_qrtr ;调用延时子程序
call erase ;调用擦除子程序
jmp short plot_next
move_shape endp
erase proc near ;擦除子程序
mov cx,char_cnt
mov di,pointer
mov dh,line_on
mov dl,col_on
erase_next:
add dh,[di+2]
add dl,[di+3]
mov ah,2
int 10h
mov al,[di]
mov bl,0
push cx
mov cx,1
mov ah,9
int 10h
pop cx
add di,4
loop erase_next
mov cx,char_cnt
mov di,pointer
mov dh,line_on
inc col_on
mov dl,col_on
ret
erase endp
dly_qrtr proc near ;延时子程序
push cx
push dx
mov dx,50000
d11:mov cx,8000
d12:loop d12
dec dx
jnz d11
pop dx
pop cx
ret
dly_qrtr endp
code ends
end main
这是一个图形变换的程序,按字母“Y”画一个用点组成的圆;按字母“S”画一
个用不同颜色填充的三角形;按字母“Z”画一个用不同颜色填充且带有边框图案
的矩形;按“q”键退出。
data segment
info1 db 0dh,0ah,'please choose the letter y,s,z:'
db 0dh,0ah,'input q to quit','$'
info2 db 0dh,0ah,'choose error!','$'
d3 dw 0
total db 12
dotyx db 50,160
db 60,135
db 60,185
db 75,115
db 75,205
db 95,110
db 95,210
db 110,114
db 110,210
db 130,135
db 130,195
db 145,165
data ends
stack segment stack
db 200 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
mov ax,data
mov ds,ax
mov ah,0
mov al,4
int 10h
input: lea dx,info1
mov ah,9
int 21h
mov ah,08
int 21h
cmp al,'s'
jz sa
cmp al,'z'
jz zhen
cmp al,'y'
jz yua
cmp al,'q'
jz exit
mov dx,offset info2
mov ah,09
int 21h
sa:
call san
jmp input
zhen:
call zheng
jmp input
yua:
call yuan
jmp input
exit:
mov ah,4ch
int 21h
ret
main endp
san proc near
push ax
push bx
push cx
push dx
mov ah,0
mov al,12h
int 10h
mov al,1
a0: mov dx,1
mov d3,1
mov cx,320
a1: push cx
push d3
a2: mov ah,12
push ax
int 10h
pop ax
inc cx
sub d3,1
jnz a2
pop d3
add d3,2
pop cx
inc dx
dec cx
jne a1
inc al
cmp al,5
jne a0
pop dx
pop cx
pop bx
pop ax
ret
san endp
zheng proc near
push ax
push bx
push cx
push dx
mov ah,0fh
int 10h
mov ah,0
mov al,3
int 10h
mov cx,1 ;字符数量
mov ah,2
mov dh,5 ;5行开始
mov dl,25 ;25列开始
int 10h
;*****光标向下动********
line: mov ah,2
int 10h
mov al,2
mov ah,9
mov bl,0e0h ;字符黄色
int 10h
inc dh ;行增加
cmp dh,20 ;20行
jne line
jmp line1
;****光标向右动*****
line1: mov ah,2
int 10h
mov al,2
mov ah,9
mov bl,0e0h ;字符为黄色
int 10h
inc dl ;列增加
cmp dl,55 ;55列
jne line1
jmp line2
;*****光标向上动*********
line2: mov ah,2
int 10h
mov al,2
mov ah,9
mov bl,0e0h ;字符为黄色
int 10h
dec dh
cmp dh,5
jne line2
jmp line3
;***光标向左动***
line3: mov ah,2
int 10h
mov al,2
mov ah,9
mov bl,0e0h ;字符为黄色
int 10h
dec dl
cmp dl,25
jne line3
l00: mov ah,7
mov al,14
mov bh,20h ;绿色
mov ch,6
mov cl,26
mov dh,19
mov dl,54
int 10h
;*****时间控制*****
l01: mov ah,0
int 1ah
cmp dl,10
jnz l01
l1: mov ah,6
mov al,14
mov bh,0f0h ;白色
mov ch,6
mov cl,26
mov dh,19
mov dl,54
int 10h
l2: mov ah,0
int 1ah
cmp dl,15
jnz l2
l3: mov ah,7
mov al,14
mov bh,40h ;红色
mov ch,6
mov cl,26
mov dh,19
mov dl,54
int 10h
l4: mov ah,0
int 1ah
cmp dl,30
jnz l4
l5: mov ah,6
mov al,14
mov bh,0d0h ;品红
mov ch,6
mov cl,26
mov dh,19
mov dl,54
int 10h
l004: mov ah,0
int 1ah
cmp dl,10
jnz l004
l005: mov ah,7
mov al,14
mov bh,30h ;青
mov ch,6
mov cl,26
mov dh,19
mov dl,54
int 10h
l006: mov ah,0
int 1ah
cmp dl,10
jnz l006
l02: mov ah,7
mov al,14
mov bh,20h ;绿色
mov ch,6
mov cl,26
mov dh,19
mov dl,54
int 10h
;****时间控制****
mov ah,2
mov dh,23
mov dl,0
int 10h
pop dx
pop cx
pop bx
pop ax
ret
zheng endp
yuan proc near
push ax
push bx
push cx
push dx
mov ax,0004h
int 10h
mov bx,00
push bx
mov ah,0bh
int 10h
mov bx,0003h
mov ah,0bh
int 10h
mov bl,total
mov si,offset dotyx
mov ch,0
mov dh,ch
plo: mov dl,[si]
mov cl,[si+1]
mov al,02h
mov ah,0ch
int 10h
inc si
inc si
dec bl
jnz plo
mov bx,50
pop bx
pop dx
pop cx
pop bx
pop ax
ret
yuan endp
code ends
end main
运行可执行程序CAR.exe,选择1,小鸟飞过;选择2,汽车开过;选择3,退出。
DATA SEGMENT
INFO1 DB 0DH,0AH,'INPUT 1,2,OR 3:(1:bIRd,2:car,3:exit) $'
BUFA DB 200
DB ?
DB 200 DUP(0)
BUFB DB 200 DUP(?)
BIRD DB 76H,10,0,0 ;小鸟的字符图形表
DB 0C4H,07,0,1
DB 76H,10,-2,2
DB 0C4H,07,0,1
DB 76H,10,-2,2
DB 0C4H,07,0,1
DB 76H,10,-2,2
DB 0C4H,07,0,1
DB 76H,10,2,-2
DB 0C4H,07,0,1
DB 76H,10,2,-2
DB 0C4H,07,0,1
DB 76H,10,2,-2
DB 0C4H,07,0,1
CAR DB 7 ;小汽车的字符图形表
DB 52H,7,0,0
DB 0B1H,7,0,1
DB 0DBH,7,0,1
DB 0DBH,7,0,1
DB 4FH,7,1,0
DB 4FH,7,0,-3
DB 2,7,-2,1
CHAR_CNT DW ?
POINTER DW ?
LINE_ON DB ?
COL_ON DB ?
DATA ENDS
STACK SEGMENT stack
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
start:mov ax,data
mov ds,ax
mov ah,0 ;设置显示方式为320*200彩色图形方式
mov al,4
int 10h
lea dx,info1 ;在显示器上显示字符串提示信息
mov ah,9
int 21h
mov ah,0 ;从键盘读取字符到AL寄存器
int 16h
CMP AL,31H ;比较AL是否等于1
JNE A
CALL XIAO
A: CMP AL,32H ;比较AL是否等于2
JNE B
CALL QICHE
B: CMP AL,33H ;比较AL是否等于3
JNE START
MOV AH,4CH ;终止当前程序并返回调用程序
INT 21H
CLEAR MACRO pch,pcl,pdh,pdl,pbh ;清屏宏定义
MOV AH,0
MOV AL,4
INT 10H
MOV AH,6 ;调用6号功能
MOV AL,0 ;设置整个屏幕为空白
MOV CH,pch
MOV CL,pcl ;窗口左上角(0行,0列)
MOV DH,pdh
MOV DL,pdl ;窗口右下角(24行,79列)
MOV BH,pbh ;正常属性显示
INT 10H
ENDM
xiao proc ;小鸟子程序
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AH,0
MOV AL,4
INT 10H
MOV AH,0BH ;设置背景色
MOV BH,0
MOV BL,1
INT 10H
MOV AH,0BH ;设置彩色组
MOV BH,1
MOV BL,1
INT 10H
CLEAR 0,0,24,79,7
MOV AH,0FH ;读当前显示状态
INT 10H
MOV DH,10
MOV DL,0
BEGIN: MOV SI,2
MOV CX,1
LEA DI,BIRD ;DI指向小鸟字符表的首字母
DISP: CMP DL,80
JAE exit1
MOV AH,2 ;设置光标位置
INT 10H
MOV AH,9 ;显示小鸟字符图形
MOV AL,[DI]
MOV BL,[DI+1]
INT 10H
CALL DLY ;延时
MOV AH,9
MOV AL,' '
MOV BL,04
INT 10H
INC DL
ADD DI,2
DEC SI
JNZ DISP
JMP BEGIN
exit1: RET
xiao endp
DLY PROC NEAR ;延时子程序
PUSH CX
PUSH DX
MOV DX,10000
DL1: MOV CX,6801
DL2: LOOP DL2
DEC DX
JNZ DL1
POP DX
POP CX
RET
DLY ENDP
QICHE PROC near ;汽车子程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,0
MOV AL,4
INT 10H
MOV AH,0BH ;设置彩色组颜色为绿、红、黄
MOV BH,01
MOV BL,00
INT 10H
CLEAR 0,0,24,79,7 ;清屏宏调用
LEA DI,CAR ;DI指向字符图形表
MOV DH,5 ;从第5行5列位置开始显示汽车
MOV DL,0
CALL MOVE_SHAPE
RET
QICHE ENDP
MOVE_SHAPE PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AH,0FH ;取当前显示方式
INT 10H
SUB CH,CH
MOV CL,[DI] ;CL放字符个数
INC DI ;DI指向字符图形表中的第一个字符
MOV CHAR_CNT,CX
MOV POINTER,DI
MOV LINE_ON,DH
MOV COL_ON,DL
PLOT_NEXT:
ADD DH,[DI+2] ;改变行列坐标
ADD DL,[DI+3]
CMP DL,80 ;出屏否?
JB MOV_CRSR
Pop DI
Pop DX
Pop CX
Pop BX
Pop AX
jmp exit2
MOV_CRSR:
MOV AH,2
INT 10H
MOV AL,[DI] ;取字符值
MOV BL,[DI+1] ;取字符属性
PUSH CX
MOV CX,1
MOV AH,09 ;显示字符
INT 10H
POP CX
ADD DI,4 ;DI指向下一个字符
LOOP PLOT_NEXT
CALL DLY
CALL ERASE
JMP SHORT PLOT_NEXT
exit2: ret
MOVE_SHAPE ENDP
ERASE PROC NEAR
MOV CX,CHAR_CNT
MOV DI,POINTER
MOV DH,LINE_ON
MOV DL,COL_ON
ERASE_NEXT:
ADD DH,[DI+2]
ADD DL,[DI+3]
MOV AH,2
INT 10H
MOV AL,[DI]
MOV BL,0
PUSH CX
MOV CX,1
MOV AH,9
INT 10H
POP CX
ADD DI,4
LOOP ERASE_NEXT
MOV CX,CHAR_CNT
MOV DI,POINTER
MOV DH,LINE_ON
INC COL_ON
MOV DL,COL_ON
RET
ERASE ENDP
CODE ENDS
END start
可爱小动画
本动画先显示一些提示信息,然后按任意键进入,只见一个方框向中
间由大变小,并留下痕迹,然后出现一个心,按空格重复出现心,按其他
键将重复,按Q键退出程序,。
data segment
full db 0
buff1 db ' Welcome you to run this programme!'
db ' '
db ' *****Please press any key*****$'
buff2 db ' My heart beats with yours!'
db ' ***** Please q to quit *****$'
data ends
code segment
main proc far
assume cs:code,ds:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov ah,00
mov al,04
int 10h
mov ah,0bh
mov bh,00
mov bl,1
int 10h
mov ah,0bh
mov bh,1
mov bl,2
int 10h
mov dx,offset buff1 ;显示提示信息
mov ah,09
int 21h
mov ah,08
int 21h
call clear ;cls
sss:
call text ;display the text
mov di,2
mov al,1 ;draw the big box
mov cx,70
mov dx,20
mov bx,160
call box
mov cx,71
mov dx,21
mov bx,158
again:
mov al,1
mov di,0
call box
call delay
mov al,0
mov di,0
call box
inc cx
inc dx
sub bx,2
cmp cx,94
jnz again
mov di,0 ;draw the 2nd box
mov cx,95
mov dx,45
mov al,1
mov bx,110
call box
mov cx,96
mov dx,46
mov bx,108
again_00:
mov al,1
mov di,0
call box
call delay
call delay
mov al,0
mov di,0
call box
inc cx
inc dx
sub bx,2
cmp cx,114
jnz again_00
mov cx,115 ;draw the 3rd box
mov dx,65
mov al,1
mov bx,70
call box
mov cx,116
mov dx,66
mov bx,68
again_01:
mov al,1
mov di,0
call box
call delay
call delay
mov al,0
mov di,0
call box
inc cx
inc dx
sub bx,2
cmp cx,129
jnz again_01
mov di,2
mov al,1 ;draw the small box
mov cx,130
mov dx,80
mov bx,40
call box
mov di,2
mov al,3 ;对角线
mov si,0
mov cx,71
mov dx,21
mov bx,59
call xie_line
mov cx,171
mov dx,121
mov bx,59
call xie_line
mov si,1
mov cx,71
mov dx,179
mov bx,59
call xie_line
mov cx,171
mov dx,79
mov bx,59
call xie_line
mov cx,150 ;十字线
mov dx,20
mov si,0
mov bx,60
call draw_line
mov cx,150
mov dx,120
mov bx,60
call draw_line
mov cx,70
mov dx,100
mov si,1
mov bx,60
call draw_line
mov cx,170
mov dx,100
mov bx,60
call draw_line
mov si,1
mov cx,70
mov dx,60
mov bx,60
call mid_line
mov cx,170
mov dx,110
mov bx,60
call mid_line
mov si,2
mov cx,110
mov dx,20
mov bx,30
call mid_line
mov cx,160
mov dx,120
mov bx,30
call mid_line
mov si,3
mov cx,70
mov dx,140
mov bx,60
call mid_line
mov cx,170
mov dx,90
mov bx,60
call mid_line
mov si,4
mov cx,110
mov dx,180
mov bx,30
call mid_line
mov cx,160
mov dx,80
mov bx,30
call mid_line
mov di,0
mov al,1 ;draw the big box again
mov cx,70
mov dx,20
mov bx,160
call box
mov di,0
mov al,1 ;draw the small box again
mov cx,130
mov dx,80
mov bx,40
call box
mov di,0
mov cx,95
mov dx,45
mov al,1
mov bx,110
call box
mov cx,115
mov dx,65
mov al,1
mov bx,70
call box
mov di,1 ;fill
call fill
call fill_2
call fill_3
mov cx,149 ;bold
mov dx,120
mov al,2
mov bx,60
mov si,0
call draw_line
mov cx,151
mov dx,120
mov al,2
mov bx,60
mov si,0
call draw_line
heart_: ;draw the heart
call cls_box
call heart
mov ah,08
int 21h
cmp al,'q'
jz ok
cmp al,20h
jz heart_
call clear
jmp sss
ok:
ret
main endp
fill proc near ;the procedure of fill
mov full,0
mov al,5
mov cx,160
mov dx,121
mov si,0
mov bx,60
fill_Y:
push cx
push dx
push bx
call draw_line
pop bx
pop dx
pop cx
sub bx,2
inc cx
add dx,2
inc full
cmp full,30
jne fill_y
ret
fill endp
fill_2 proc near
mov full,0
mov al,5
mov cx,140
mov dx,121
mov si,0
mov bx,60
fill_Y1:
push cx
push dx
push bx
call draw_line
pop bx
pop dx
pop cx
sub bx,2
dec cx
add dx,2
inc full
cmp full,30
jne fill_y1
ret
fill_2 endp
fill_3 proc near
mov al,1
mov full,0
mov si,0
mov cx,140
mov dx,121
mov bx,60
re_fill:
push bx
push cx
push dx
call draw_line
pop dx
pop cx
pop bx
inc cx
inc full
cmp full,9
jne re_fill
mov full,0
mov cx,159
mov dx,121
mov bx,60
re_fill2:
push bx
push cx
push dx
call draw_line
pop dx
pop cx
pop bx
dec cx
inc full
cmp full,9
jne re_fill2
ret
fill_3 endp
draw_Line proc near ;the procedure of draw a line
push bx
cmp si,0
jz V_line1
add bx,cx
H_line:
mov ah,0ch
int 10h
cmp di,0
jz aa0
cmp di,1
jz aa1
call delay
aa1:
call delay
aa0:
inc cx
cmp cx,bx
jne H_line
jmp exit_line
V_line1:
add bx,dx
V_line:
mov ah,0ch
cmp di,0
jz bb0
cmp di,1
jz bb1
call delay
bb1:
call delay
bb0:
int 10h
inc dx
cmp dx,bx
jne V_line
exit_line:
pop bx
ret
draw_Line endp
xie_line proc near ;the procedure of draw a xie_line
add bx,cx
cmp si,1
jz xieline_1
xieline_0:
mov ah,0ch
int 10h
inc dx
inc cx
cmp cx,bx
jne xieline_0
jmp exit_xie
xieline_1:
mov ah,0ch
int 10h
dec dx
inc cx
cmp cx,bx
jne xieline_1
exit_xie:
ret
xie_line endp
Mid_line proc near ;draw a xie_line
add bx,cx
cmp si,2
jz midline_2
cmp si,3
jz midline_3
cmp si,4
jz midline_4
midline_1:
mov ah,0ch
int 10h
inc dx
add cx,2
cmp cx,bx
jne midline_1
jmp exit_lines
midline_2:
mov ah,0ch
int 10h
add dx,2
inc cx
cmp cx,bx
jne midline_2
jmp exit_lines
midline_3:
mov ah,0ch
int 10h
dec dx
add cx,2
cmp cx,bx
jne midline_3
jmp exit_lines
midline_4:
mov ah,0ch
int 10h
sub dx,2
inc cx
cmp cx,bx
jne midline_4
exit_lines:
ret
mid_line endp
box proc near ;draw a box
push cx
push dx
push cx
push dx
push cx
push dx
push cx
push dx
mov si,1
call draw_line ;top
pop dx
pop cx
add cx,bx
mov si,0
call draw_line ;right
pop dx
pop cx
mov si,0
call draw_line ;left
pop dx
pop cx
mov si,1
add dx,bx
call draw_line ;bottom
pop dx
pop cx
ret
box endp
space proc near ;display a space
mov ah,02
mov dl,' '
int 21h
ret
space endp
return proc near ;回车
mov ah,2
mov dl,0ah
int 21h
mov dl,0dh
int 21h
ret
return endp
text proc near ;显示文本信息
mov bh,0
mov dh,0
mov dl,0
mov ah,2
int 10h
mov dx,offset buff2
mov ah,09
int 21h
text endp
heart proc near
mov cx,136 ;draw_heart
mov dx,93
mov si,0
mov bx,5
mov al,2
call draw_line
mov cx,137 ;draw_heart
mov dx,91
mov si,0
mov bx,9
call draw_line
mov cx,138 ;draw_heart
mov dx,90
mov si,0
mov bx,12
call draw_line
mov cx,139 ;draw_heart
mov dx,89
mov si,0
mov bx,14
call draw_line
mov cx,140 ;draw_heart
mov dx,88
mov si,0
mov bx,16
call draw_line
mov cx,141 ;draw_heart
mov dx,88
mov si,0
mov bx,17
call draw_line
mov cx,142 ;draw_heart
mov dx,87
mov si,0
mov bx,19
call draw_line
mov cx,143 ;draw_heart
mov dx,87
mov si,0
mov bx,20
call draw_line
mov cx,144 ;draw_heart
mov dx,87
mov si,0
mov bx,21
call draw_line
mov cx,145 ;draw_heart
mov dx,88
mov si,0
mov bx,21
call draw_line
mov cx,146 ;draw_heart
mov dx,88
mov si,0
mov bx,22
call draw_line
mov cx,147 ;draw_heart
mov dx,89
mov si,0
mov bx,22
call draw_line
mov cx,148 ;draw_heart
mov dx,90
mov si,0
mov bx,22
call draw_line
mov cx,149 ;draw_heart
mov dx,91
mov si,0
mov bx,22
call draw_line
mov cx,150 ;1draw_heart
mov dx,91
mov si,0
mov bx,22
call draw_line
mov cx,151 ;draw_heart
mov dx,90
mov si,0
mov bx,22
call draw_line
mov cx,152 ;draw_heart
mov dx,89
mov si,0
mov bx,22
call draw_line
mov cx,153 ;draw_heart
mov dx,88
mov si,0
mov bx,22
call draw_line
mov cx,154 ;draw_heart
mov dx,88
mov si,0
mov bx,21
call draw_line
mov cx,155 ;draw_heart
mov dx,87
mov si,0
mov bx,21
call draw_line
mov cx,156 ;draw_heart
mov dx,87
mov si,0
mov bx,20
call draw_line
mov cx,157 ;draw_heart
mov dx,87
mov si,0
mov bx,19
call draw_line
mov cx,158 ;draw_heart
mov dx,88
mov si,0
mov bx,17
call draw_line
mov cx,159 ;draw_heart
mov dx,88
mov si,0
mov bx,16
call draw_line
mov cx,160 ;draw_heart
mov dx,89
mov si,0
mov bx,14
call draw_line
mov cx,161 ;draw_heart
mov dx,90
mov si,0
mov bx,12
call draw_line
mov cx,162 ;draw_heart
mov dx,91
mov si,0
mov bx,9
call draw_line
mov cx,163 ;draw_heart
mov dx,93
mov si,0
mov bx,5
call draw_line
ret
heart endp
delay proc near ;the procedure of delay
push cx
push dx
mov dx,25
dl2:
mov cx,2801
dl3:
loop dl3
dec dx
jnz dl2
pop dx
pop cx
ret
delay endp
clear proc near ;clear
mov al,0
mov bx,0
mov cx,0
mov dx,0
line:
mov ah,0ch
int 10h
inc cx
cmp cx,320
jne line
mov cx,0
inc dx
cmp dx,200
jne line
ret
clear endp
cls_box proc near
mov al,0
mov bx,0
mov cx,131
mov dx,81
s_line:
mov ah,0ch
int 10h
inc cx
cmp cx,170
jne s_line
mov cx,131
inc dx
cmp dx,120
jne s_line
ret
cls_box endp
code ends
end start
这是一个网上电子表
data segment
;*****定义please等提示信息*****
str db 20
db 50h,7,0,0
db 6ch,7,0,1
db 65h,7,0,1
db 61h,7,0,1
db 73h,7,0,1
db 65h, 7,0,1
db 70h,7,1,-10
db 72h,7,0,1
db 65h,7,0,1
db 73h,7,0,1
db 73h,7,0,1
db 53h,7,0,2
db 6bh,7,0,2
db 65h,7,0,1
db 79h,7,0,1
db 65h,7,0,2
db 78h,7,0,1
db 69h,7,0,1
db 74h,7,0,1
db 21h,7,0,1
;*****定义0-9十个图形数字*****
s0 db 6
db 5fh,7,0,0
db 7ch,7,1,-1
db 7ch,7,1,0
db 5fh,7,0,1
db 7ch,7,0,1
db 7ch,7,-1,0
sy db 2
db 7ch,7,1,0
db 7ch,7,1,0
s2 db 5
db 5fh,7,0,0
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,1,-1
db 5fh,7,0,1
s3 db 5
db 5fh,7,0,0
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,1,1
db 5fh,7,0,-1
s4 db 4
db 7ch,7,1,0
db 5fh,7,0,1
db 7ch,7,1,1
db 7ch,7,-1,0
s5 db 5
db 5fh,7,0,0
db 7ch,7,1,-1
db 5fh,7,0,1
db 7ch,7,1,1
db 5fh,7,0,-1
s6 db 6
db 5fh,7,0,0
db 7ch,7,1,-1
db 5fh,7,0,1
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,0,-1
s7 db 3
db 5fh,7,0,0
db 7ch,7,1,1
db 7ch,7,1,0
s8 db 7
db 7ch,7,1,0
db 5fh,7,-1,1
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,0,-1
s9 db 6
db 7ch,7,1,0
db 5fh,7,-1,1
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,1,1
db 5fh,7,0,-1
s11 db 2
db 03h,7,1,0
db 03h,7,1,0
data ends
stack segment
db 200 dup (0)
stack ends
code segment
assume cs:code,ss:stack,ds:data
start:
mov ax,data
mov ds,ax
mov ah,0 ;设置显示方式
mov al,4
int 10h
mov ah,0bh ;置彩色调板
mov bh,0
mov bl,1
int 10h
mov ah,0bh ;置彩色调板
mov bh,1
mov bl,4
int 10h
mov ah,2 ;取系统时间
int 1ah
mov ax,0
mov bx,0
mov ah,ch ;取系统时间
mov al,cl ;保存分钟
mov bh,dh ;保存秒
mov bl,dl ;保存百分之一秒
tt:
push ax
push bx
mov ah,0
mov al,4
int 10h
mov ah,0bh
mov bh,0
mov bl,1
int 10h
mov ah,0bh
mov bh,1
mov bl,4
int 10h
MOV AH,1 ;读键盘缓冲区字符
INT 16h
JZ ww
MOV AH,8 ;从键盘输入字符
INT 21h
CMP AL,'s' ;输入s,结束程序
JE tu
ww: pop bx
pop ax
call xian ;调用显示子程序
push ax
qu: mov ah,2 ;取系统时间
int 1ah
cmp bh,dh
je qu
pop ax
inc bh ;对时间进行加1
cmp bh,100
jl tt
mov bh,0
inc al
call beep
cmp al,100
jl tt
mov al,0
inc ah
cmp ah,24
jl tt
mov ah,0
jmp tt
tu: mov ah,4ch
int 21h
ret
xian proc ;对时间值进行处理并显示的子程序
push si
push di
push dx
push cx
push bx
push ax
pop ax
push ax
mov bx,ax
mov ax,0
mov al,bh
mov cl,4
shr al,cl
mov bl,al
mov dh,10
mov dl,2
call ff
pop ax
push ax
mov bx,ax
mov ax,0
mov al, bh
and al,0fh
mov bl,al
mov dh,10
mov dl,6
call ff
mov dh,10
mov dl,10
mov bl,10
call ff
pop ax
push ax
mov cl,4
shr al,cl
mov bl,al
mov dh,10
mov dl,14
call ff
pop ax
push ax
and al ,0fh
mov bl,al
mov dh,10
mov dl,18
call ff
mov dh,10
mov dl,22
mov bl,10
call ff
pop ax
pop bx
push bx
push ax
mov ax,0
mov al,bh
mov cl,4
shr al,cl
mov bl,al
mov dh,10
mov dl,26
call ff
pop ax
pop bx
push bx
push ax
mov al,bh
and al,0fh
mov bl,al
mov dh,10
mov dl,30
call ff
mov dh,0
mov dl,15
mov bl,22
call ff
pop ax
pop bx
pop cx
pop dx
pop di
pop si
ret
xian endp
ff proc ;显示具体数值
push ax
push bx
push cx
push dx
cmp bl,0
je l0
cmp bl,1
je l1
cmp bl,2
je l2
cmp bl,3
je l3
cmp bl,4
je l4
cmp bl,5
je l5
cmp bl,6
je l6
cmp bl,7
je l7
cmp bl,8
je l8
cmp bl,9
je l9
cmp bl,10
je l10
cmp bl,22
je ld
l0: lea di,s0
jmp ty
l1 : lea di,sy
jmp ty
l2: lea di,s2
jmp ty
l3: lea di,s3
jmp ty
l4: lea di,s4
jmp ty
l5: lea di,s5
jmp ty
l6: lea di,s6
jmp ty
l7: lea di,s7
jmp ty
l8: lea di,s8
jmp ty
l9: lea di,s9
jmp ty
l10: lea di,s11
jmp ty
ld : lea di,str
ty: mov ah,0fh ;示方式
int 10h
sub cx,cx
mov cl,[di]
inc di
plot_next: add dh,[di+2]
add dl,[di+3]
mov ah,2
int 10h
mov al,[di]
mov bl,[di+1]
push cx
mov cx,1
mov ah,09
int 10h
pop cx
add di,4
loop plot_next
pop dx
pop cx
pop bx
pop ax
mov cx,100
gg: dec cx
loop gg
ret
ff endp
clear proc
push ax
push bx
push cx
push dx
mov ah,6
mov al,0
mov bh,1
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear endp
beep proc
push ax
push bx
push cx
push dx
mov al ,10110110b
out 43h,al
mov ax,533h
out 42h,al
mov al,ah
out 42h,al
in al,61h
mov ah,al
or al,03
out 61h,al
sub cx,cx
mov bl,28h
g7: loop g7
dec bl
jnz g7
mov al,ah
out 61h,al
pop dx
pop cx
pop bx
pop ax
ret
beep endp
code ends
end start
报时小闹钟
本程序是一个用汇编编的精致的图形时钟,运行时双击clock图标即可,
钟表显示的时间为本机系统的时间。
按b键可扩大画面 ;按s键可缩小画面;按c键可改变颜色;按e键可听音乐;
按q键退出本程序.
extrn music:far,geNSound:far
;******************************************************
;* 堆栈段
.286;******************************************************
STACK_SEG SEGMENT STACK
STACK_BUF DW 120 DUP(?)
TOP EQU $-STACK_BUF
STACK_SEG ENDS
;******************************************************
;* 数据段
;******************************************************
DATA_SEG SEGMENT PARA
;------------------------------------------------------
; TODO: 数据的定义及存储器的分配
ts1 DB 0
quitbuf DB 'welcome you to run this programme. '
quitbuf2 DB 'C: change color; B:extend the colck; S:reduce the clock '
quitbuf3 DB 'press e to sound; Press q to quit ! '
sigle DB 80h
absx DW 0
absy DW 0
sut DW 0
erroybz DB 0
r0 DW 90
x0 DW 320
y0 DW 245
count0 db 0
count_hour DB 11
count_minute DB 11
yuanxinx DW 0
yuanxiny DW 0
s DB 0
s2 DB 0
s3 DB 0
hour DW 0
hour2 DW 0
minute DW 0
minute2 DW 0
secONd DB 0
second2 DB 0
sin_x DW 0
sin_xx DW 0
x DW 0
y DW 0
x1 DW 0
xminy DW 0
yminx DW 0
xmax DW 0
ymax DW 0
ymin DW 0
xmin DW 0
sjx_xminy DW 0
sjx_yminx DW 0
sjx_xmax DW 0
sjx_ymax DW 0
sjx_ymin DW 0
sjx_xmin DW 0
yuanx DW 0
yuany DW 0
y1 DW 0
x2 DW 0
y2 DW 0
x3 DW 0
y3 DW 0
DIancolor DB 0
color DB 2
color_hour DB 2
color_min DB 6
color_second DB 9
color4 DB 10
color5 DB 11
color6 DB 12
backgroundcolor DB 1
page1 DB 0
y2y1 DW 0
x2x1 DW 0
sjx_y2y1 DW 0
sjx_x2x1 DW 0
;------------------------------------------------------
DATA_SEG ENDS
;******************************************************
;* 代码段
;******************************************************
CODE_SEG SEGMENT PARA
;------------------------------------------------------
MAIN PROC FAR
ASSUME CS:CODE_SEG,DS:DATA_SEG
ASSUME SS:STACK_SEG
START:
MOV AX,STACK_SEG
MOV SS,AX
MOV SP,TOP
MOV AX,DATA_SEG
MOV DS,AX
;------------------------------------------------------
; TODO: 从这里开始您的代码
;------------------------------------------------------
beg: MOV AX,0012h
INT 10h
MOV DX,0010h
CALL b1002
LEA BP,quitbuf
CALL msg
MOV DX,010ah
LEA BP,quitbuf2
CALL msg
MOV DX,020ah
LEA BP,quitbuf3
CALL msg
beg2: CALL skin
CALL skin2
CALL skin3
CALL CLk
MOV second,DH
MOV second2,DH
MOV count_minute,11
CALL minute_lin
XOR DX,DX
MOV AX,minute2
MOV CX,12
DIV CX
MOV CX,AX ;minurte2/12
POP AX
ADD AX,CX
MOV hour2,AX
MOV count_hour,11
CALL hour_lin
CALL CLk
MOV DL,DH
CALL bcd2
XOR AH,AH
MOV CL,12
DIV CL
MOV count_minute,AH ;second%12初始值
DEC count_minute
XOR DX,DX
MOV AX,minute2
MOV CX,12
DIV CX ;minurte2%12
MOV count_hour,DL
DEC count_hour
INC second2
kk3: CLI
CALL second_lin
STI
JMP ks
ks: MOV AH,1
INT 16h
JZ kk3
MOV AH,8
INT 21h
CMP AL,'q'
JE quit
CMP AL,'b'
JE CHange_rb
CMP AL,'s'
JE CHange_rs
CMP AL,'c'
JE CHange_color
cmp al,'e'
je a0
JMP kk3
CHange_rs: CMP r0,190
JA ks
ADD r0,5
JMP tobeg2
CHange_rb: CMP r0,60
JB ks
SUB r0,5
JMP tobeg2
CHange_color: LEA SI,color_hour
MOV CX,6
CHange_kk1: MOV AL, [SI]
INC AL
CMP AL,15
JC CHange_color_kk2
MOV AL,1
CHange_color_kk2:
MOV [SI],AL
INC SI
LOOP CHange_kk1
JMP tobeg2
a0: call music
call music
call music
tobeg2: CALL CLear
JMP beg2
quit: MOV AX,4C00H
INT 21H
;*************************************
hour_lin PROC NEAR
PUSHa
CMP count_hour,11
JB tohour_yl
JMP hour_lin_next
tohour_yl: MOV SIgle,3
JMP hour_yl
hour_lin_next:
MOV count_hour,0
MOV SIgle,5
CALL CLk
MOV DL,CH
CALL bcd2
CMP AL,12
JB hour_kk1
SUB AL,12
hour_kk1: MOV CL,30
MUL CL
PUSH AX
XOR DX,DX
MOV AX,minute2
MOV CX,12
DIV CX
MOV CX,AX ;minurte2/12
POP AX
ADD AX,CX
MOV hour2,AX
;擦掉
MOV Color,0
MOV AX,hour
MOV BX,r0
ADD BX,20
CALL renovate
MOV DX,yuanx
MOV x3,DX
MOV DX,yuany
MOV y3,DX
ADD AX,270
ADD BX,400 ;90
CALL renovate
MOV DX,yuanx ;擦掉
MOV x2,DX
MOV DX,yuany
MOV y2,DX
MOV DX,x0
MOV x1,DX
MOV DX,y0 ;擦掉
MOV y1,DX
CALL sjx
ADD AX,180
CALL renovate
MOV DX,yuanx ;擦掉
MOV x2,DX
MOV DX,yuany
MOV y2,DX
SUB BX,100
CALL renovate
MOV DX,yuanx
MOV x3,DX
MOV DX,yuany
MOV y3,DX ;擦掉
CALL sjx
MOV SIgle,4
;***************************;; ;重写
hour_yl: MOV AL,color_hour
MOV color,AL
MOV AX,hour2
MOV BX,r0
ADD BX,70
CALL renovate
MOV DX,yuanx
MOV x3,DX
MOV DX,yuany
MOV y3,DX
ADD AX,90
ADD BX,600 ;90
CALL renovate
MOV DX,yuanx
MOV x2,DX
MOV DX,yuany
MOV y2,DX ;重写
ADD AX,180
CALL renovate
MOV DX,yuanx
MOV x1,DX
MOV DX,yuany
MOV y1,DX
CALL sjxx
CALL sjxy
ADD AX,270
SUB BX,100
CALL renovate
MOV DX,yuanx
MOV x3,DX ;重写
MOV DX,yuany
MOV y3,DX
CALL sjx
CALL sjxx
CALL sjxy
MOV CX,hour2
MOV hour,CX
hour_quit: POPa
RET
hour_lin ENDP
;********************************
minute_lin PROC NEAR
PUSHa
CMP count_minute,11
JB tominute_yl ;仍是原来的一个
JMP minute_lin_next
tominute_yl: MOV SIgle,0
JMP minute_yl
minute_lin_next:
INC count_hour
CALL CLk
MOV DL,CL
CALL bcd2 ;bcd->16
MOV CL,6
MUL CL ;al*cl
PUSH AX
MOV DL,second2
CALL bcd2
XOR AH,AH
MOV CL,12
DIV CL
MOV CL,AL ;second2/12
POP AX
MOV CH,0
ADD AX,CX
MOV minute2,AX
AAAa1:
MOV SIgle,2
MOV Color,0
MOV AX,minute
MOV BX,r0
ADD BX,10
CALL renovate
MOV DX,yuanx
MOV x3,DX
MOV DX,yuany
MOV y3,DX
ADD AX,268
ADD BX,800 ;90
CALL renovate
MOV DX,yuanx
MOV x2,DX
MOV DX,yuany
MOV y2,DX
MOV DX,x0
MOV x1,DX
MOV DX,y0
MOV y1,DX
CALL sjx
ADD AX,180
CALL renovate
MOV DX,yuanx
MOV x2,DX
MOV DX,yuany
MOV y2,DX
ADD AX,90
SUB BX,200
CALL renovate
MOV DX,yuanx
MOV x3,DX
MOV DX,yuany
MOV y3,DX
CALL sjx
inc count0
cmp count0,5
jnz minute_yl
mov count0,0
call music
call music
call music
;**********************************重写
minute_yl: MOV sigle,1
MOV AL,color_min
MOV color,AL
MOV AX,minute2
MOV BX,r0
ADD BX,30
CALL renovate
MOV DX,yuanx
MOV x3,DX
MOV DX,yuany
MOV y3,DX
ADD AX,90
ADD BX,900 ;90
CALL renovate
MOV DX,yuanx
MOV x2,DX
MOV DX,yuany
MOV y2,DX
ADD AX,180
CALL renovate
MOV DX,yuanx
MOV x1,DX
MOV DX,yuany
MOV y1,DX
CALL sjxx
CALL sjxy
ADD AX,270
SUB BX,200
CALL renovate
MOV DX,yuanx
MOV x3,DX
MOV DX,yuany
MOV y3,DX
CALL sjxx
CALL sjxy
MOV CX,minute2
MOV minute,CX
CALL hour_lin
minute_kk1:
minute_quit: POPa
RET
minute_lin ENDP
;******************in dh秒数*********************
second_lin PROC NEAR
PUSHa
CALL CLk
CMP second2,DH
JE to_second_quit
JMP second_lin_next
to_second_quit:JMP second_quit
second_lin_next:
MOV SIgle,80h
MOV second2,DH
MOV Color,0
MOV DL,second ;erase
CALL bcd2
MOV AH,0
MOV CL,6
MUL CL
MOV BX,r0
ADD BX,10
CALL renovate
MOV DX,yuanx
MOV x1,DX
MOV DX,yuany
MOV y1,DX
ADD AX,180
ADD BX,300
CALL renovate
MOV DX,yuanx
MOV x2,DX
MOV DX,yuany
MOV y2,DX
CALL linex
CALL liney
;重写
MOV SIgle,80h
MOV AL,color_second
MOV color,AL
MOV DL,second2
CALL bcd2
MOV AH,0
MOV CL,6
MUL CL
MOV BX,r0
ADD BX,10
CALL renovate
MOV DX,yuanx
MOV x1,DX
MOV DX,yuany
MOV y1,DX
ADD AX,180
ADD BX, 300
CALL renovate
MOV DX,yuanx
MOV x2,DX
MOV DX,yuany
MOV y2,DX
CALL linex
CALL liney
CALL yuanxin
MOV DL,second2
MOV second,DL
CALL minute_lin
CALL skin2
MOV CL,second2
MOV second,CL
CMP count_minute,11
JE second_kk1
INC count_minute
JMP second_quit
second_kk1: MOV count_minute,0
second_quit: POPa
RET
second_lin ENDP
;******bxbbx*********in ax度数***bx长度,*********
;OUT x2->ax,y2->dx ;**
renovate PROC NEAR
PUSHa
ADD AX,270
PUSH AX
CALL SIn
MOV DX,0
MOV CX,BX
DIV CX
CMP SI,1
JE hjian
ADD AX,y0
JMP renovate_kk1
hjian: MOV CX,y0
SUB CX,AX
MOV AX,CX
renovate_kk1: MOV yuany,AX
POP AX
CALL cos
MOV DX,0
MOV CX,BX
DIV CX
CMP SI,1
JE hjian2
ADD AX,x0
JMP renovate_kk2
hjian2: MOV CX,x0
SUB CX,AX
MOV AX,CX
renovate_kk2: MOV yuanx,AX
POPa
RET
renovate ENDP
;**************************
Clk PROC
MOV AH,2
INT 1ah
RET
CLk ENDP
;*****************cosx in ax out ax ,si符号******************
cos PROC NEAR
ADD AX,90
cos_kk1: CALL SIn
RET
cos ENDP
;*********Sinx in ax out ax ,si符号*******************************
SIn PROC NEAR ;out ax
PUSH CX
PUSH DX
PUSH BX
sin360: CMP AX,90
JA dy90
sto0_90: MOV SI,0
JMP pp1
dy90: CMP AX,180
JBE z91to180
JMP dy180
z91to180: MOV CX,180
SUB CX,AX
MOV AX,CX
MOV SI,0
JMP pp1
z181to270: SUB AX,180
MOV SI,1
JMP pp1
z271to360: CMP AX,359
JA zdy359
MOV CX,360
SUB CX,AX
MOV AX,CX
MOV SI,1
JMP pp1
zdy359: SUB AX,360
JMP SIn360
dy180: CMP AX,270
JBE z181to270
JMP z271to360
pp1: MOV CX,175
XOR DX,DX
MUL CX
MOV sin_x,AX
XOR DX,DX
MOV CX,AX
MUL CX
MOV CX,10000
DIV CX
MOV sin_xx,AX
XOR DX,DX
MOV CX,120
DIV CX
MOV BX,1677;1667
CALL SUBab
MOV CX,sin_xx
XOR DX,DX
MUL CX
MOV CX,10000
DIV CX ;xx(xx/120-10000/6)
MOV CX,10000
MOV DL,0
CMP DL,s
JE jia
SUB CX,AX
MOV AX,CX
JMP kk1
jia: ADD AX,CX
kk1: MOV CX,sin_x
XOR DX,DX
MUL CX
MOV CX,10000
DIV CX
POP BX
POP DX
POP CX
MOV s,0
RET
SIn ENDP
;**************;绝对值在ax中符号在S中ax-bx*****s要定义db*************
subab PROC
CMP AX,BX
JAE goab
XOR s,1
XCHG AX,BX
goab:
SUB AX,BX
RET
subab ENDP
;***************************linex***y=(y2-y1)*(x-x1)/(x2-x1)+y1
;****in (x1,y1),(x2,y2)******************x++
linex PROC NEAR
PUSH x1
PUSH x2
PUSH y1
PUSH y2
pusha
CALL xymaxmin
MOV AX,y2
MOV BX,y1
CALL subab
MOV y2y1,AX
MOV AX,x2
MOV BX,x1
CALL subab
MOV SI,0
CMP SI,AX
JE zhixian
JMP lopx
zhixian: JMP zhixianxs
lopx: MOV x2x1,AX
MOV AX,xmin
MOV x,AX
line0x: SUB AX,xmin
MOV DX,0
MOV CX,y2y1
MUL CX
MOV CX,x2x1
DIV CX
MOV DX,0
CMP DL,s
JE zhengx
MOV CX,AX
MOV AX,xminy
SUB AX,CX
JMP kk2x
zhengx: ADD AX,xminy
kk2x: MOV y,AX
CALL DIan
INC x
MOV AX,x
CMP AX,xmax
JBE line0x
JMP quit12
zhixianxs: MOV AX,xmin
MOV x,AX
MOV AX,ymin
MOV y,AX
lopxx: CALL DIan
INC y
MOV AX,ymax
CMP AX,y
JAE lopxx
quit12: MOV s,0
POPa
POP y2
POP y1
POP x2
POP x1
RET
linex ENDP
;**************************liney x=(x2-x1)(y-y1)/(y2-y1)+x1
;*****************y++
sjx PROC NEAR
PUSH x1
PUSH x2
PUSH y1
PUSH y2
pusha
CALL xymaxmin
MOV AX,y2
MOV BX,y1
CALL subab
MOV y2y1,AX
MOV SI,0
CMP SI,AX
JE to_sjxx
sjx_lop1: MOV AX,x2
MOV BX,x1
CALL subab
MOV x2x1,AX
MOV SI,0
CMP SI,AX
JE to_sjxy
MOV DX,0
MOV AX,y2y1
MOV CX,x2x1
DIV CX
CMP AX,1
JE to_sjxx
CMP AX,0
JE to_sjxx
JMP to_sjxy
to_sjxx: MOV s,0
CALL sjxx
JMP sjx_quit
to_sjxy: MOV s,0
CALL sjxy
sjx_quit: POPa
POP y2
POP y1
POP x2
POP x1
MOV s,0
RET
sjx ENDP
liney PROC NEAR
PUSH x1
PUSH x2
PUSH y1
PUSH y2
pusha
CALL xymaxmin
MOV AX,y2
MOV BX,y1
CALL subab
MOV y2y1,AX
MOV SI,0
CMP SI,AX
JE heng
JMP lop1
heng: JMP hengxian
lop1: MOV AX,x2
MOV BX,x1
CALL subab
MOV x2x1,AX
MOV AX,ymin
MOV y,AX
line0y: SUB AX,ymin
MOV DX,0
MOV CX,x2x1
MUL CX
MOV CX,y2y1
DIV CX
MOV DX,0
CMP DL,s
JE zhengy
MOV CX,AX
MOV AX,yminx
SUB AX,CX
JMP kky
zhengy: ADD AX,yminx
kky: MOV x,AX
CALL DIan
INC y
MOV AX,y
CMP AX,ymax
JBE line0y
JMP quity
hengxian: MOV AX,ymin
MOV y,AX
MOV AX,xmin
MOV x,AX
lopy: CALL DIan
INC x
MOV AX,xmax
CMP AX,x
JAE lopy
quity: MOV s,0
POPa
POP y2
POP y1
POP x2
POP x1
RET
liney ENDP
;***************************linex***y=(y2-y1)*(x-x1)/(x2-x1)+y1
;****in (x1,y1),(x2,y2)******************x++
sjxx PROC NEAR
pusha
PUSH x1
PUSH x2
PUSH x3
PUSH y1
PUSH y2
PUSH y3
CALL xymaxmin
MOV AX,xmin
MOV sjx_xmin,AX
MOV AX,ymin
MOV sjx_ymin,AX
MOV AX,xmax
MOV sjx_xmax,AX
MOV AX,ymax
MOV sjx_ymax,AX
MOV AX,xminy
MOV sjx_xminy,AX
MOV AX,y2
MOV BX,y1
CALL subab
MOV sjx_y2y1,AX
MOV AX,x2
MOV BX,x1
CALL subab
MOV DL,s
MOV s2,DL
MOV s,0
MOV SI,0
CMP SI,AX
JE sjx_zhixian
JMP sjx_lopx
sjx_zhixian:
MOV x1,AX
MOV AX,x3
MOV x2,AX
MOV AX,y3
MOV y2,AX
JMP sjx_zhixianxs
sjx_lopx: MOV sjx_x2x1,AX
MOV AX,x3
MOV x2,AX
MOV AX,y3
MOV y2,AX
MOV AX,sjx_xmin
MOV x1,AX
sjx_line0x: SUB AX,sjx_xmin
MOV DX,0 ;***y=(y2-y1)*(x-x1)/(x2-x1)+y1
MOV CX,sjx_y2y1
MUL CX
MOV CX,sjx_x2x1
DIV CX
MOV DX,0
CMP DL,s2
JE sjx_zhengx
MOV CX,AX
MOV AX,sjx_xminy
SUB AX,CX
JMP sjx_kk2
sjx_zhengx:
ADD AX,sjx_xminy
sjx_kk2:
MOV y1,AX
CALL linex
CALL liney
INC x1
MOV AX,x1
CMP AX,sjx_xmax
JBE sjx_line0x
JMP sjx_quit12
sjx_zhixianxs: MOV AX,sjx_xmin
MOV x1,AX
MOV AX,sjx_ymin
MOV y1,AX
sjx_lopxx:
CALL linex
CALL liney
INC y1
MOV AX,sjx_ymax
CMP AX,y1
JAE sjx_lopxx
sjx_quit12: MOV s,0
POP y3
POP y2
POP y1
POP x3
POP x2
POP x1
POPa
RET
sjxx ENDP
;**************************liney x=(x2-x1)(y-y1)/(y2-y1)+x1
;*****************y++
sjxy PROC NEAR
PUSH x1
PUSH x2
PUSH x3
PUSH y1
PUSH y2
PUSH y3
pusha
CALL xymaxmin
MOV AX,xmin
MOV sjx_xmin,AX
MOV AX,ymin
MOV sjx_ymin,AX
MOV AX,xmax
MOV sjx_xmax,AX
MOV AX,ymax
MOV sjx_ymax,AX
MOV AX,yminx
MOV sjx_yminx,AX
MOV AX,y2
MOV BX,y1
CALL subab
MOV sjx_y2y1,AX
MOV SI,0
CMP SI,AX
JE sjxy_heng
JMP sjxy_lop1
sjxy_heng:
MOV DL,s
MOV s2,DL
MOV s,0
MOV AX,x3
MOV x2,AX
MOV AX,y3
MOV y2,AX
JMP sjxy_hengxian
sjxy_lop1: MOV AX,x2
MOV BX,x1 ;x=(x2-x1)(y-y1)/(y2-y1)+x1
CALL subab
MOV DL,s
MOV s2,DL
MOV s,0
MOV sjx_x2x1,AX
MOV AX,x3
MOV x2,AX
MOV AX,y3
MOV y2,AX
MOV AX,sjx_ymin
MOV y1,AX
sjxy_line0y: SUB AX,sjx_ymin
MOV DX,0
MOV CX,sjx_x2x1
MUL CX
MOV CX,sjx_y2y1
DIV CX
MOV DX,0
CMP DL,s2
JE sjxy_zhengy
MOV CX,AX
MOV AX,sjx_yminx
SUB AX,CX
JMP sjxy_kky3
sjxy_zhengy:
ADD AX,sjx_yminx
sjxy_kky3:
MOV x1,AX
CALL linex
CALL liney
INC y1
MOV AX,y1
CMP AX,sjx_ymax
JBE sjxy_line0y
JMP sjxy_quity
sjxy_hengxian: MOV AX,sjx_ymin
MOV y1,AX
MOV AX,sjx_xmin
MOV x1,AX
sjxy_lopy: CALL liney
CALL linex
INC x1
MOV AX,sjx_xmax
CMP AX,x1
JAE sjxy_lopy
sjxy_quity: MOV s,0
POPa
POP y3
POP y2
POP y1
POP x3
POP x2
POP x1
RET
sjxy ENDP
;
xymaxmin PROC NEAR
PUSHa
PUSH x1
PUSH x2
PUSH y1
PUSH y2
MOV AX,x1
CMP AX,x2
JAE x1dyx2
MOV xmin,AX ;x1<x2
MOV AX,y1
MOV xminy,AX
MOV AX,x2
MOV xmax,AX
JMP ymaxmin
x1dyx2: MOV xmax,AX
MOV AX,x2
MOV xmin,AX
MOV AX,y2
MOV xminy,AX ;xminx 所对应的y
ymaxmin: MOV AX,y1
CMP AX,y2
JAE y1dyy2
MOV ymin,AX
MOV AX,x1
MOV yminx,AX ;所对应的x
MOV AX,y2
MOV ymax,AX
JMP xymax_quit
y1dyy2: MOV ymax,AX
MOV AX,y2
MOV ymin,AX
MOV AX,x2
MOV yminx,AX
xymax_quit:
POP y2
POP y1
POP x2
POP x1
POPa
RET
xymaxmin ENDP
DIan PROC NEAR ;画一点x,y
PUSHa
MOV AH,s
MOV s3,AH
MOV AH,SIgle
AND AH,80h
CMP AH,0
JE puanduan
paint:
MOV AL,color
MOV BH,page1
MOV DX,y
MOV CX,x ;列号
MOV AH,0ch
INT 10h
JMP DIanquit
puanduan:
CALL readerdian
MOV DIancolor,AL
MOV AH,SIgle
AND AH,7fh
CMP AH,0
JE NEw0
CMP AH,1
JE NEw1
CMP AH,2
JE NEw2
CMP AH,3
JE NEw3
CMP AH,4
JE NEw4
CMP AH,5
JE NEw5
CMP AH,6
JE NEw6
JMP DIanquit
NEw0: CMP DIancolor,0
JE topaint
JMP DIanquit
NEw1: CMP DIancolor,0
JE topaint
MOV AH,color_hour
CMP DIancolor,AH
JE topaint
JMP DIanquit
topaint: JMP paint
NEw2: MOV AH,color_min
CMP DIancolor, AH
JE topaint
JMP DIanquit
NEw3: JMP NEw0
NEw4: JMP NEw0
NEw5: MOV AH,color_hour
CMP DIancolor,AH
JE topaint
JMP DIanquit
NEw6: CMP DIancolor,0
JE topaint
JMP DIanquit
MOV AX,x
MOV BX,x0
CALL SUBab
CMP AX,5
JA topaint
MOV AX,y
MOV BX,y0
CALL SUBab
CMP AX,5
JA topaint
DIanquit: MOV AH,s3
MOV s,AH
POPa
RET
DIan ENDP
yuanxin PROC
MOV AL,color_second
ADD AL,1
MOV BH,PAGE1
MOV DX,y0
MOV CX,x0
MOV AH,0ch
INT 10h
DEC DX
MOV AH,0ch
INT 10h
DEC CX
MOV AH,0ch
INT 10h
INC DX
MOV AH,0ch
INT 10h
INC DX
MOV AH,0ch
INT 10h
INC CX
MOV AH,0ch
INT 10h
INC CX
MOV AH,0ch
INT 10h
SUB DX,1
MOV AH,0ch
INT 10h
DEC DX
MOV AH,0ch
INT 10h
RET
yuanxin ENDP
readerdian PROC
MOV BH,page1
MOV DX,y
MOV CX,x ;列号
MOV AH,0dh
INT 10h
RET
readerdian ENDP
b1002 PROC NEAR ;入口DX-光标定位
MOV BH,0
MOV AH,02h
INT 10h
RET
b1002 ENDP
CLear PROC
MOV DX,0410h
CALL b1002
MOV CX,6000
MOV BH,PAGE1
MOV AL,' '
MOV AH,0ah
INT 10h
RET
CLear ENDP
; 12根******************************
skin2 PROC
PUSHa
MOV AL,color6
MOV color,AL
MOV CX,12
MOV AX,0
skin2_kk1: PUSH CX
PUSH AX
MOV BX,r0
MOV CX,y0
MOV DX,x0
CALL enovate
MOV AX,x
MOV x1,AX
MOV AX,y
MOV y1,AX
POP AX
PUSH AX
MOV BX,r0
ADD BX,10
MOV CX,y0
MOV DX,x0
CALL enovate
MOV AX,x
MOV x2,AX
MOV AX,y
MOV y2,AX
CALL linex
CALL liney
POP AX
ADD AX,30
POP CX
LOOP skin2_kk1
MOV CX,4
MOV AX,0
skin2_kk2: PUSH CX
PUSH AX
MOV BX,r0
MOV CX,y0
MOV DX,x0
CALL enovate
MOV AX,x
MOV x1,AX
MOV AX,y
MOV y1,AX
POP AX
PUSH AX
MOV BX,r0
ADD BX,20
MOV CX,y0
MOV DX,x0
CALL enovate
MOV AX,x
MOV x2,AX
MOV AX,y
MOV y2,AX
CALL linex
CALL liney
POP AX
ADD AX,90
POP CX
LOOP skin2_kk2
POPa
RET
skin2 ENDP
;60根**********************************88
skin3 PROC
PUSHa
MOV AL,color5
MOV color,AL
MOV CX,60
MOV AX,0
skin2_kk3: PUSH CX
PUSH AX
MOV BX,r0
MOV CX,y0
MOV DX,x0
CALL enovate
MOV AX,x
MOV x1,AX
MOV AX,y
MOV y1,AX
POP AX
PUSH AX
MOV BX,r0
ADD BX,3
MOV CX,y0
MOV DX,x0
CALL enovate
MOV AX,x
MOV x2,AX
MOV AX,y
MOV y2,AX
CALL linex
CALL liney
POP AX
ADD AX,6
POP CX
LOOP skin2_kk3
POPa
RET
skin3 ENDP
;数字加圆**************************************88
skin PROC NEAR
MOV AL,color4
MOV color,AL
MOV BX,r0
CALL yuan
MOV BX,r0
MOV DH,7
MOV DL,39
CALL b1002
MOV DL,'1'
MOV AH,2
INT 21h
MOV DH,7
MOV DL,40
CALL b1002
MOV DL,'2'
MOV AH,2
INT 21h
MOV DH,8
MOV DL,47
CALL b1002
MOV DL,'1'
MOV AH,2
INT 21h
MOV DH,11
MOV DL,53
CALL b1002
MOV DL,'2'
MOV AH,2
INT 21h
MOV DH,19
MOV DL,53
CALL b1002
MOV DL,'4'
MOV AH,2
INT 21h
MOV DH,22
MOV DL,47
CALL b1002
MOV DL,'5'
MOV AH,2
INT 21h
MOV DH,22
MOV DL,32
CALL b1002
MOV DL,'7'
MOV AH,2
INT 21h
MOV DH,19
MOV DL,26
CALL b1002
MOV DL,'8'
MOV AH,2
INT 21h
MOV DH,11
MOV DL,25
CALL b1002
MOV DL,'1'
MOV AH,2
INT 21h
MOV DH,11
MOV DL,26
CALL b1002
MOV DL,'0'
MOV AH,2
INT 21h
MOV DH,8
MOV DL,30
CALL b1002
MOV DL,'1'
MOV AH,2
INT 21h
MOV DH,8
MOV DL,31
CALL b1002
MOV DL,'1'
MOV AH,2
INT 21h
MOV DH,15
MOV DL,55
CALL b1002
MOV DL,'3'
MOV AH,2
INT 21h
MOV DH,23
MOV DL,40
CALL b1002
MOV DL,'6'
MOV AH,2
INT 21h
MOV DH,15
MOV DL,24
CALL b1002
MOV DL,'9'
MOV AH,2
INT 21h
RET
skin ENDP
msg PROC NEAR ;in bp为输出字符串地址
PUSH ES
PUSH DS
POP ES
MOV CX,40h
MOV AL,0
MOV BX,2
MOV AH,13h
INT 10h
POP ES
RET
msg ENDP
;*****************in dl out al
bcd2 PROC NEAR
MOV AH,0
MOV AL,DL
SHR AL,4
AND AL,0fh
MOV CL,10
MUL CL
MOV CL,AL
MOV AL,DL
AND AL,0fh
ADD AL,CL;;;;; bcd转16进制
RET
bcd2 ENDP
;r0=bx 圆心cx 行 dx列********************
yuan PROC
PUSHa
MOV CX,360
MOV AX,0
yuan_kk1: PUSH CX
PUSH AX
MOV CX,y0
MOV DX,x0
CALL enovate
CALL dian
POP AX
ADD AX,1
POP CX
LOOP yuan_kk1
POPa
RET
yuan ENDP
;*****************in ax度数 bx=半径r长度,cx 列 dx行 圆心 out x,y************
enovate PROC NEAR
PUSHa
PUSH DX
PUSH AX
PUSH CX
CALL SIn
MOV DX,0
MOV CX,BX
DIV CX
POP CX
CMP SI,1
JE ian
ADD AX,CX
JMP enovate_kk1
ian: SUB CX,AX
MOV AX,CX
enovate_kk1: MOV y,AX
POP AX
CALL cos
MOV DX,0
MOV CX,BX
DIV CX
POP DX
CMP SI,1
JE ian2
ADD AX,DX
JMP enovate_kk2
ian2: MOV CX,DX
SUB CX,AX
MOV AX,CX
enovate_kk2: MOV x,AX
POPa
RET
enovate ENDP
MAIN ENDP
;------------------------------------------------------
CODE_SEG ENDS
;******************************************************
END START ;程序结束
PUBLIC GENSOUND
CODE SEGMENT PARA 'CODE'
ASSUME CS: CODE
GENSOUND PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL, 0B6H
OUT 43H, AL
MOV DX, 12H
MOV AX, 533H*896
DIV DI
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
IN AL, 61H
OR AL, 3
OUT 61H, AL
WAIT1: MOV CX, 8FF0H
DELAY: LOOP DELAY
DEC BX
JNZ WAIT1
MOV AL, AH
OUT 61H, AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
GENSOUND ENDP
CODE ENDS
END
EXTRN GENSOUND:FAR
PUBLIC MUSIC
STACK SEGMENT PARA STACK 'STACK'
DB 64 DUP ('STACK')
STACK ENDS
DATA SEGMENT PARA 'DATA'
MUS_FREQ DW 330, 294, 262, 294, 3 DUP (330)
DW 3 DUP (294), 330,392,392
DW 330, 294, 262, 294, 4 DUP (330)
DW 293, 294, 330, 294, 262,-1
MUS_TIME DW 6 DUP (25*8), 50*8
DW 2 DUP (25*8, 25*8, 50*8)
DW 12 DUP (25*8), 100*8
DATA ENDS
CODE SEGMENT PARA 'CODE'
ASSUME CS: CODE, SS: STACK
ASSUME DS: DATA
MUSIC PROC FAR
PUSH DS
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV AX, DATA
MOV DS, AX
LEA SI, MUS_FREQ
LEA BP, DS: MUS_TIME
FREQ: MOV DI, [SI]
CMP DI, -1
JE END_MUS
MOV BX, DS: [BP]
CALL GENSOUND
ADD SI, 2
ADD BP, 2
JMP FREQ
END_MUS:
POP AX
POP BX
POP CX
POP DX
POP DS
RET
MUSIC ENDP
CODE ENDS
END
这是PC机间相互通信的例子,程序“requIRe”为用查询方式实现,程序“interrupt”为
用中断方式实现
CODE SEGMENT
ASSUME CS: CODE
NEW_INT: ;接收字符的中断处理程序
STI ;CPU开中断
MOV DX , 3F8H ;接收字符
IN AL , DX
MOV DL , AL ;显示接收字符
MOV AH , 2
INT 21H
CMP DL , 0DH ;判断是否为回车
JNZ L2 ;不是,转L2处
MOV DL , 0AH ;若是,加显示一个换行符
MOV AH , 2
INT 21H
L2:
MOV AL , 20H ;发中断结束命令(EOI)
OUT 20H , AL
IRET
START: ;主程序部分
MOV AH , 35H
MOV AL , 0CH
INT 21H ;读取原0CH号中断服务程序的地址
PUSH BX
PUSH ES ;以上地址入栈保存(以便在程序退出时再恢复中断矢量表中的内容)
MOV AX , CS
MOV DS , AX
MOV DX , OFFSET NEW_INT
MOV AH , 25H
MOV AL , 0CH
INT 21H ;修改中断矢量表,将NET_INT位置登记为0CH号中断服务程序的地址
;以下初始化8250
MOV DX , 3FBH ;指向线路控制寄存器
MOV AL , 80H ;位7置1
OUT DX , AL ;发送此字节
MOV DX , 3F9H ;指向波特率除数的高字节
MOV AL , 0 ; 1200 BPS对应的高字节
OUT DX , AL ;发送此字节
DEC DX ;指向波特率除数的低字节
MOV AL , 60H ; 1200 BPS对应的低字节
OUT DX , AL ;发送此字节
MOV AL , 1BH ;数据长度为8位 , 1个奇偶校验位 , 偶校验 , 1个停止位
MOV DX , 3FBH ;指向线路控制寄存器
OUT DX , AL ;发送此字节
MOV DX , 3FCH ;设置MODEM控制寄存器
MOV AL , 0BH ;允许8250发中断
OUT DX , AL
MOV DX , 3F9H ;指向中断允许寄存器
MOV AL , 1 ;允许数据接收准备好中断
OUT DX , AL ;发送此字节
CLI ;关中断,以便对中断控制器8259A进行操作
IN AL , 21H ;读取中断屏蔽寄存器的内容
AND AL , 0EFH ;将COM1中断(即IRQ4引脚)的对应位置0,允许中断。
OUT 21H , AL ;写入中断控制器8259A中
STI ;开中断
L1: ; 主程序循环,等待收到字符的中断发生。
MOV AH , 0
INT 16H ;读取键盘字符
CMP AL , 03 ;比较是否为CTRL-C键
JNZ L1 ;若不是,继续循环
EXIT: ;退出处理
MOV AH , 25H
MOV AL , 0CH
POP DS
POP DX
INT 21H ;恢复中断矢量表中0CH号中断服务程序的原地址。
MOV AH , 4CH
INT 21H ;返回DOS
CODE ENDS
END START
CODE SEGMENT
ASSUME CS: CODE
START:
;初始化波特率除数寄存器
MOV DX , 3FBH ;指向线路控制寄存器
MOV AL , 80H ;位7置1
OUT DX , AL ;发送此字节
MOV DX , 3F9H ;指向波特率除数的最高有效位
MOV AL , 0 ; 1200 BPS对应的最高有效位
OUT DX , AL ;发送此字节
DEC DX ;指向波特率除数的最低有效位
MOV AL , 60H ; 1200 BPS对应的最低有效位
OUT DX , AL ;发送此字节
;初始化线路控制寄存器:
MOV AL , 1BH ;数据长度为8位 , 1个奇偶校验位 , 偶校验 , 1个停止位
MOV DX , 3FBH ;指向线路控制寄存器
OUT DX , AL ;发送此字节
;初始化中断允许寄存器
MOV DX , 3F9H ;指向中断允许寄存器
MOV AL , 0 ;禁止所有中断
OUT DX , AL ;发送字节
READ: ;线路状态检测循环
MOV DX , 3FDH ;指向线路状态寄存器
IN AL , DX ;取状态字节
TEST AL , 1EH ;检查错误
JNZ ERROR ;若出错则转错误处理例程
TEST AL , 01H ;测试是否已收到数据
JNZ RECEIVE ;转接收例程
TEST AL , 20H ;测试是否可以发送字符
JNZ SEND ;若是转发送例程
JMP READ ;循环检测
SEND: ;发送字符(来自键盘):
MOV AH , 1 ;BIOS功能用以检测是否有字符可读
INT 16H ;BIOS键盘中断
JZ READ ;若无击键则返回循环
MOV AH , 0 ;BIOS功能用于取击键码
INT 16H ;击键码现在AL中
CMP AL , 03H ;检测CTRL+C
JZ EXIT ;若是 , 转EXIT处结束程序
MOV DX , 3F8H ;指向发送保持寄存器
OUT DX , AL ;发送字符
JMP READ ;返回循环
RECEIVE: ;接收数据(在屏幕上显示):
MOV DX , 3F8H ;接收数据寄存器
IN AL , DX ;取新收到的字符
CMP AL , 03H ;检测CTRL+C
JZ EXIT ;若是 , 转EXIT处结束程序
MOV DL , AL ;准备显示字符
MOV AH , 2 ;用于显示字符的DOS中断
INT 21H ;显示字符
CMP AL , 0DH ;判断刚才收到的字符是否为回车
JNZ READ ;不是,转线路检测循环
MOV DL , 0AH ;若是,则加显示一个换行符
MOV AH , 2
INT 21H
JMP READ ;返回线路检测循环
ERROR: ;出错处理,显示一个提示
PUSH CS
POP DS
MOV DX , OFFSET ERROR_MESSAGE
MOV AH , 9
INT 21H
EXIT: ;程序退出
MOV AH , 4CH
INT 21H
ERROR_MESSAGE DB 0AH , 'ERROR!$' ;定义出错时显示的提示
CODE ENDS
END START