汇编

汇编

汇编简介
  • ·汇编简介
  • ·汇编特点
  • ·汇编应用
汇编工具
  • ·汇编工具-----MASM
  • ·汇编工具----NASM
  • ·汇编工具----RadASM
  • ·汇编工具----TASM
  • ·汇编工具----VISUALASM
  • ·汇编工具----EMU8086
汇编常见问题
  • ·c语言和汇编混编,效率如何?
  • ·是汇编语言难学还是C难学?
  • ·ARM的汇编指令系统是哪种汇编?
  • ·现在的驱动程序一般是由哪...
  • ·学习汇编用什么环境?
  • ·如何构造Win32Asm开发环境?
  • ·一个汇编程序的编译过程是...
汇编程序实例
  • ·判断闰年汇编程序
  • ·产生随机数并运算的汇编程序
  • ·计算平台长度汇编程序
  • ·加减乘除四则汇编运算
  • ·数字方阵汇编程序
  • ·数据加密汇编程序
  • ·代码转换汇编程序
  • ·键盘录入数据的转换与显示...
  • ·音乐演奏汇编程序
  • ·显示彩色矩形块汇编程序
  • ·字符图形程序中国北京汇编程序
  • ·字符图形程序阳泉学院汇编程序
  • ·图形变换汇编程序
  • ·汽车小鸟动画汇编程序
  • ·动画心汇编程序
  • ·七段电子表显示汇编程序
  • ·钟表显示汇编程序
  • ·和25pc机间的通信汇编程序

汇编简介

    汇编语言(Assembly Language)是面向机器的程序设计语言.汇编用符号代替机器语言的二进制码,就把机器语言变成了汇编语言.于是汇编语言亦称为符号语言.汇编语言中,用助记符(MemONi)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码.

汇编特点

    (1)面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的.

    (2)可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器CPU、I/O端口等.

    (3)保持了机器语言的优点,具有直接和简捷的特点.

    (4)经常与高级语言配合使用,应用十分广泛.

    (5)目标代码简短,占用内存少,执行速度快,是高效的程序设计语言.

汇编应用

    (1)70%以上的系统软件是用汇编语言编写的.

    (2)某些高级绘图程序、视频游戏程序是用汇编语言编写的.

    (3)某些快速处理、位处理、访问硬件设备等高效程序是用汇编语言编写的.

汇编工具-----MASM

MASM是微软公司开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm是Windows下开发汇编的利器。它与windows平台的磨合程度非常好,但是在其他平台上就有所限制,使用MASM的开人员必须在windows下进行开发。

MASM 6.11 下载:

http://download.pchome.net/development/linetools/detail-10660.html

汇编工具----NASM

    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

    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下载:

 

http://www.crsky.com/soft/5471.html

汇编工具----TASM

    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

 

汇编工具----VISUALASM

    VisualASM60 是一款便捷的汇编语言交叉平台IDE. 支持80888086、80386以及更高(奔腾、塞扬就更不用说了) C51、ARM等,以后会越来越多。


 

   VisualASM功能:
  1,支持可视化的编译连接;

  2,支持调用Debug TD进行调试,省去了开发人员命令输入的过程。

  3,关键字变色:寄存器、CPU指令集、FPU指令集、MMX, SSE, SSE2指令集、扩展指令集、

  4,工程模板;

  5, 支持设置代码标记,病支持代码标记的各种相关操作;

  6, 支持代码片段快速插入

  7, 支持指令集查询。

  8, 各种常用小工具.
    9,完全绿色,无需安装,不写注册表。

VISUALASM  下载:

http://www.ONlinedown.net/soft/2002.htm)

汇编工具----EMU8086

111

c语言和汇编混编,效率如何?

    c语言和汇编混编的效率是除纯汇编外效率最高的。混编优点在于汇编可以弥补C语言的一些瓶颈,从而提高效率,如C中的循环就是反复赋值的过程,这是一个瓶颈无法解决,但是这地方若要用汇编代码弥补,就大大提高了效率。

 

  缺点在于不宜编写,本来编写C就需要很小心,还要在准确的加入汇编,对各个寄存器的现场保护与恢复很费脑筋。

是汇编语言难学还是C难学?

    汇编可以直接对硬件操作,但没有好的逻辑性,C的移植性和逻辑性都比较好,对于程序,小的部分,直接对硬件操作部分可以用汇编写,总体结构用C构造,C和汇编的混编很常用。

ARM的汇编指令系统是哪种汇编?

  汇编指令有大概两种类型 RISC,CISC,像51,8086等一部分是cisc指令。相对来说简单易懂一点。像arm ,avr,PIC等是risc,指令要复杂些,学起来也就要麻烦点了。处理器不一样,其汇编指令也就不一样。

现在的驱动程序一般是由哪种语言写成的呢?

现在的驱动程序一般是不是由 C 语言加汇编语言写成的。

学习汇编用什么环境?

大多数学校的汇编语言实验是用masm5.0和debug来做的,本来学习编程的的重点在于实践,现在最简

单的事竟然成了最少做的实验。这两个工具都是基于DOS的,使用也较简单。当学完16位的汇编后
就可以学习32位的汇编了,这时如果想用汇编语言开发windows应用程序的话可以学习使用RadAsm,它是汇编语言的集成开发环境,可以和其它集成开发环境一样开发Windows程序。

如何构造Win32Asm开发环境?

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

 

 

 


 

 

 

                                           
                                             

和25pc机间的通信汇编程序

这是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

你可能感兴趣的:(汇编,input,语言,div,byte,图形)