精华内容
下载资源
问答
  • 汇编

    千次阅读 2010-12-25 20:09:00
    汇编 汇编简介 ·汇编简介 ·汇编特点 ·汇编应用 汇编工具 ·汇编工具-----MASM ·汇编工具----NASM ·汇编工具----RadASM ·汇编工具----TASM ·汇编工具----VISUALASM ·汇编工具----EMU8086 ...

    汇编

    汇编简介

    回到顶部
        汇编语言(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

    展开全文
  • CRLF是什么东西?

    万次阅读 多人点赞 2014-11-10 00:15:46
    对于CRLF这个词来说,相信搞开发的应该都不会陌生,意思是

    对于CRLF这个词来说,相信搞开发的应该都不会陌生,其意思是回车换行

    但是对于这个普遍解释,我还有以下两点疑问


    1.为什么CR代表回车,LF代表换行?

    2.回车和换行到底是什么东西,'\r','\n'又是什么东西?


    答1:

            关于为什么用CRLF代表回车换行,则要提一下一个历史问题,相信大家在电视上看美国一些老电影的时候都看过打字员使用打字机的场景,当打字到一行尾部的时候,机器会有两个操作,一个是打印的针头会调回到开始处;另一个是打印纸同时会向下移动一行。对于前者就叫做Carriage Return(Carriage Return可以翻译为机器滑动的部分回到开始处)简写即为CR;而后者就叫做Line Feed(Line Feed有行满的意思),简称LF。所以在没有计算机之前,需要同时使用CRLF来表示起一个新行。


    答2:

            1中提到的回车和换行可以看做是两个操作,是两个动词,通过两个动作实现了换行,但是当出现计算机后,我们在写文本文件的时候,就需要在一行的结尾处做个标记来指示该换行了,所以Windows系统就沿用了打字机时代的名词,使用“回车符”+“换行符”表示到达当前行的结尾处。然而在计算机发展的早期存储设备相对昂贵,所以有的计算机专家认为用两个字符(回车+换行)表示行尾过于浪费,所以Unix系统只采用了“换行符”,而Mac系统只采用了“回车符”。

            因为'\r','\n'本身是一种语法的表示,所以此处以java语法为背景进行说明,其他语言的含义本质是相似,可类比理解。Java中有8个基本类型,其中一个为char型,而char型的常量有三种表示方式:1.由单引号括起的单个字符;2.由单引号括起的\+字符,例如‘\r’、'\n'、'\t';3.由单引号括起的\u+4位16进制,例如'\u000d','\u000a','\u0009'。其中2类字符表示的含义不再是'\'后的字符本身,而是表示一个新的意思,'\'称作转义字符。由于有的字符能够显示在屏幕上,有的不能,所以需要一种方式来表示那种无法显示在屏幕上的字符,采用转义字符('\')就是为了这个目的。而在我所知道的语言的中,'\r'都表示“回车符”,'\n'都表示"换行符"。所以'\r'、'\n'是回车符和换行符的一种符号表示。

            如果浏览器的控制台中书写如下Javascript代码:alert("我是第一行\n我是第二行"),会看到此行文字分两行显示,读者可自行尝试一下。


    展开全文
  • 汇编学习

    2011-12-24 00:42:21
    对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩...
      
    

    对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?―― Here we go!(阅读时看不懂不要紧,下文必有分解)

      因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提)

      CPU是可以执行电脑所有算术╱逻辑运算与基本 I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。 所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。

      内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放数值的储存位置,叫“地址”。8086地址总线有20位,所以CPU拥有达1M的寻址空间,这也是DOS的有效控制范围,而8086能做的运算仅限于处理16位数据,即只有0到64K,所以,必须用分段寻址才能控制整个内存地址。完整的20位地址可分成两部份:1.段基址(Segment):16位二进制数后面加上四个二进制0,即一个16进制0,变成20位二进制数,可设定1M中任何一个64K段,通常记做16位二进制数;2.偏移量(Offset):直接使用16位二进制数,指向段基址中的任何一个地址。如:2222(段基址):3333(偏移量),其实际的20位地址值为:25553。除了上述营养要充分吸收外,你还要知道什么是DOS、BIOS功能调用,简单的说,功能调用类似于WIN95 API,相当于子程序。汇编写程序已经够要命了,如果不用MS、IBM的子程序,这日子真是没法过了(关于功能调用详见《电脑爱好者》98年11期)。

      编写汇编语言有两种主要的方法:1.使用MASM或TASM等编译器;2.使用除错程序DEBUG.COM。DEBUG其实并不能算是一个编译器,它的主要用途在于除错,即修正汇编程序中的错误。不过,也可以用来写短的汇编程序,尤其对初学者而言,DEBUG 更是最佳的入门工具。因为DEBUG操作容易:只要键入DEBUG回车,A回车即可进行汇编,过程简单,而使用编译器时,必须用到文本编辑器、编译器本身、LINK以及EXE2BIN等程序,其中每一个程序都必须用到一系列相当复杂的命令才能工作,而且用编译器处理源程序,必须加入许多与指令语句无关的指示性语句,以供编译器识别,使用 DEBUG 可以避免一开始就碰到许多难以理解的程序行。DEBUG 除了能够汇编程序之外,还可用来检查和修改内存位置、载入储存和执行程序、以及检查和修改寄存器,换句话说,DEBUG是为了让我们接触硬件而设计的。(8086常用指令用法将在每个汇编程序中讲解,限于篇幅,不可能将所有指令列出)。

      DEBUG的的A命令可以汇编出简单的COM文件,所以DEBUG编写的程序一定要由地址 100h(COM文件要求)开始才合法。FOLLOW ME,SETP BY SETP(步步回车):

      输入 A100 ; 从DS:100开始汇编
       2.输入 MOV DL,1 ; 将数值 01h 装入 DL 寄存器
       3.输入 MOV AH,2 ; 将数值 02h 装入 DL 寄存器
       4.输入 INT 21 ; 调用DOS 21号中断2号功能,用来逐个显示装入DL的字符
       5.输入 INT 20 ; 调用DOS 20号中断,终止程序,将控制权交回给 DEBUG
       6.请按 Enter 键
       7.现在已将汇编语言程序放入内存中了,输入 G(运行)
       8.出现结果:输出一个符号。
       ㄖ ←输出结果其实不是它,因WORD97无法显示原结果,故找一赝品将就着。
       Program terminated normally

      我们可以用U命令将十六进制的机器码反汇编(Unassemble)成汇编指令。你将发现每一行右边的汇编指令就是被汇编成相应的机器码,而8086实际上就是以机器码来执行程序。
       1.输入 U100,106
       1FED:0100 B201 MOV DL,01
       1FED:0102 B402 MOV AH,02
       1FED:0104 CD21 INT 21
       1FED:0106 CD20 INT 20
       DEBUG可以用R命令来查看、改变寄存器内容。CS:IP寄存器,保存了将执行指令地址。
       1.输入R
       AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
       DS=1FED ES=1FED SS=1FED CS=1FED IP=0100 NV UP EI PL NZ NA PO NC
       1FED:0100 B201 MOV DL,01

      当程序由DS:100开始执行,那么终止程序时,DEBUG会自动将IP内容重新设定为100。当你要将此程序做成一个独立的可执行文件,则可以用N命令对该程序命名。但一定要为COM文件,否则无法以DEBUG载入。
       输入N SMILE.COM ;我们得告诉DEBUG程序长度:程序从100开始到106,故占用7
       ;字节。我们利用BX存放长度值高位部分,而以CX存放低位部分。
       2.输入RBX ;查看 BX 寄存器的内容,本程序只有7个字节,故本步可省略
       3.输入 RCX  ;查看 CX 寄存器的内容
       4.输入 7  ;程序的字节数
       5.输入 W ;用W命令将该程序写入(Write)磁盘中

      修行至此,我们便可以真正接触8086汇编指令了。 当我们写汇编语言程序的时候,通常不会直接将机器码放入内存中,而是打入一串助记符号(Mnemonic Symbols),这些符号比十六进制机器码更容易记住,此之谓汇编指令。助记符号,告诉CPU应执行何种运算。 也就是说,助忆符号所构成的汇编语言是为人设计的,而机器语言是对PC设计的。

      现在,我们再来剖析一个可以将所有ASCII码显示出来的程序。
       1. 输入 DEBUG
       2. 输入 A100
       3.输入 MOV CX,0100 ;装入循环次数
       MOV DL,00 ;装入第一个ASCII码,随后每次循环装入新码
       MOV AH,02
       INT 21
       INC DL ;INC:递增指令,每次将数据寄存器 DL 内的数值加 1
       LOOP 0105 ;LOOP:循环指令,每执行一次LOOP,CX值减1,并跳
       ;到循环的起始地址105,直到CX为0,循环停止
       INT 20
       4.输入 G即可显示所有ASCII码
     
       当我们想任意显示字符串,如:UNDERSTAND?,则可以使用DOS21H号中断9H号功能。输入下行程序,存盘并执行看看:
       1.输入 A100
       MOV DX,109 ;DS:DX = 字符串的起始地址
       MOV AH,9 ;DOS的09h功能调用
       INT 21 ;字符串输出
       INT 20
       DB 'UNDERSTAND?$';定义字符串

      在汇编语言中,有两种不同的指令:1.正规指令:如 MOV 等,是属于CPU的指令,用来告诉CPU在程序执行时应做些什么,所以它会以运算码(OP-code)的方式存入内存中;2.伪指令:如DB等,是属于DEBUG等编译器的指令,用来告诉编译器在编译时应做些什么。DB(Define Byte)指令用来告诉DEBUG 将单引号内的所有ASCII 码放入内存中。使用 9H 功能的字符串必须以$结尾。用D命令可用来查看DB伪指令将那些内容放入内存。
       6.输入 D100
       1975:0100 BA 09 01 B4 09 CD 21 CD-20 75 6E 64 65 72 73 74 ......!. underst
       1975:0110 61 6E 64 24 8B 46 F8 89-45 04 8B 46 34 00 64 19 and$.F..E..F4.d.
       1975:0120 89 45 02 33 C0 5E 5F C9-C3 00 C8 04 00 00 57 56 .E.3.^_.......WV
       1975:0130 6B F8 0E 81 C7 FE 53 8B-DF 8B C2 E8 32 FE 0B C0 k.....S.....2...
       1975:0140 74 05 33 C0 99 EB 17 8B-45 0C E8 D4 97 8B F0 89 t.3.....E.......
       1975:0150 56 FE 0B D0 74 EC 8B 45-08 03 C6 8B 56 FE 5E 5F V...t..E....V.^_
       1975:0160 C9 C3 C8 02 00 00 6B D8-0E 81 C3 FE 53 89 5E FE ......k.....S.^.
       1975:0170 8B C2 E8 FB FD 0B C0 75-09 8B 5E FE 8B 47 0C E8 .......u..^..G..

      现在,我们来剖析另一个程序:由键盘输入任意字符串,然后显示出来。db 20指示DEBUG保留20h个未用的内存空间供缓冲区使用。
       输入A100
       MOV DX,0116 ;DS:DX = 缓冲区地址,由DB伪指令确定缓冲区地址
       MOV AH,0A ;0Ah 号功能调用
       INT 21 ;键盘输入缓冲区
       MOV DL,0A ;由于功能Ah在每个字符串最后加一个归位码(0Dh由 Enter
       MOV AH,02 ;产生),使光标自动回到输入行的最前端,为了使新输出的
       INT 21 ;字符串不会盖掉原来输入的字符串,所以利用功能2h加一
       ;个换行码(OAh),使得光标移到下一行的的最前端。
       MOV DX,0118 ;装入字符串的起始位置
       MOV AH,09 ;9h功能遇到$符号才会停止输出,故字符串最后必须加上
       INT 21 ;$,否则9h功能会继续将内存中的无用数据胡乱显示出来
       INT 20
       DB 20 ;定义缓冲区
       送你一句话:学汇编切忌心浮气燥。

      客套话就不讲了。工欲善其事,必先利其器。与其说DEBUG 是编译器,倒不如说它是“直译器”,DEBUG的A命令只可将一行汇编指令转成机器语言,且立刻执行。真正编译器(MASM)的运作是利用文本编辑器(EDIT等)将汇编指令建成一个独立且附加名为.ASM的文本文件,称源程序。它是MASM 程序的输入部分。MASM将输入的ASM文件,编译成.OBJ文件,称为目标程序。OBJ文件仅包含有关程序各部份要载入何处及如何与其他程序合并的信息,无法直接载入内存执行。链结程序LINK则可将OBJ文件转换成可载入内存执行(EXEcute)的EXE文件。还可以用EXE2BIN,将符合条件的EXE文件转成COM文件(COM 文件不但占用的内存最少,而且运行速度最快)。
       下面我们用MASM写一个与用DEBUG写的第一个程序功能一样的程序。
       用EDIT编辑一个SMILE.ASM的源程序文件。
       源程序 DEBUG 程序
       prognam segment
       assume cs:prognam
       org 100h A100
       mov dl,1 mov dl,1
       mov ah,2 mov ah,2
       int 21h int 21
       int 20h int 20
       prognam ends
       end

      比较一下:1.因为MASM会将所有的数值假设为十进制,而DEBUG则只使用十六进制,所以在源程序中,我们必须在有关数字后加上代表进制的字母,如H代表十六进制,D代表十进制。若是以字母开头的十六进制数字,还必须在字母前加个0,以表示它是数,如0AH。2.源程序增加五行叙述:prognam segment 与 prognam ends 是成对的,用来告诉 MASM 及LINK,此程序将放在一个称为PROGNAM(PROGram NAMe)的程序段内,其中段名(PROGNAM)可以任取,但其位置必须固定。assume cs:prognam 必须在程序的开头,用来告诉编译器此程序所在段的位置放在CS寄存器中。end用来告诉MASM,程序到此结束, ORG 100H作用相当于DEBUG的A100,从偏移量100开始汇编。COM 文件的所有源程序都必须包含这五行,且必须依相同的次序及位置出现,这点东西记下就行,千篇一律。接着,我们用MASM编译SMILE.ASM。
       输入 MASM SMILE ←不用打入附加名.ASM。
       Microsoft (R) Macro Assembler Version 5.10
       Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.
       Object filename [SMILE.OBJ]: ←是否改动输出OBJ文件名,如不改就ENTER
       Source listing [NUL.LST]: ← 是否需要列表文件(LST),不需要就ENTER
       Cross-reference [NUL.CRF]: ←是否需要对照文件(CRF),不需要则ENTER
       50162 + 403867 Bytes symbol space free
       0 Warning Errors ←警告错误,表示编译器对某些语句不理解,通常是输入错误。
       0 Severe Errors ←严重错误,会造成程序无法执行,通常是语法结构错误。

      如果没有一个错误存在,即可生成OBJ文件。OBJ中包含的是编译后的二进制结果,它还无法被 DOS载入内存中加以执行,必须加以链结(Linking)。以LINK将OBJ文件(SMILE.OBJ)链结成 EXE 文件(SMILE.EXE)时,。
       1.输入 LINK SMILE ←不用附加名OBJ
       Microsoft (R) Overlay Linker Version 3.64
       Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.
       Run File [SMILE.EXE]: ← 是否改动输出EXE文件名,如不改就ENTER
       List File [NUL.MAP]: ← 是否需要列表文件(MAP),不需要则ENTER
       Libraries [.LIB]: ←是否需要库文件,要就键入文件名,不要则ENTER
       LINK : warning L4021: no stack segment← 由于COM文件不使用堆栈段,所以错误信息
       ←"no stack segment"并不影响程序正常执行

      至此已经生成EXE文件,我们还须使用EXE2BIN 将EXE文件(SMILE.EXE),转换成COM文件(SMILE.COM)。输入EXE2BIN SMILE产生 BIN 文件(SMILE.BIN)。其实 BIN 文件与 COM 文件是完全相同的,但由于DOS只认COM、EXE及BAT文件,所以BIN文件无法被正确执行,改名或直接输入 EXE2BIN SMILE SMILE.COM即可。现在,磁盘上应该有 SMILE.COM 文件了,你只要在提示符号C:>下,直接输入文件名称 SMILE ,就可以执行这个程序了。

      你是否觉得用编译器产生程序的方法,比 DEBUG 麻烦多了!以小程序而言,的确是如此,但对于较大的程序,你就会发现其优点了。我们再将ASCII程序以编译器方式再做一次,看看有无差异。首先,用EDIT.COM建立 ASCII.ASM 文件。
       prognam segment ;定义段
       assume cs:prognam ;把上面定义段的段基址放入 CS
       mov cx,100h ; 装入循环次数
       mov dl,0 ; 装入第一个ASCII码,随后每次循环装入新码
       next: mov ah,2
       int 21h
       inc dl ;INC:递增指令,每次将数据寄存器 DL 内的数值加 1
       loop next ; 循环指令,执行一次,CX减1,直到CX为0,循环停止
       int 20h
       prognam ends ;段终止
       end ;汇编终止
       在汇编语言的源程序中,每一个程序行都包含三项元素:
        start: mov dl,1 ;装入第一个ASCII码,随后每次循环装入新码
        标识符 表达式 注解

      在原始文件中加上注解可使程序更易理解,便于以后参考。每行注解以“;”与程序行分离。编译器对注解不予理会,注解的数据不会出现在OBJ、EXE或COM文件中。由于我们在写源程序时,并不知道每一程序行的地址,所以必须以符号名称来代表相对地址,称为“标识符”。我们通常在适当行的适当位置上,键入标识符。标识符(label)最长可达31 个字节,因此我们在程序中,尽量以简洁的文字做为标识符。现在,你可以将此ASCII.ASM 文件编译成 ASCII.COM 了。1.MASM ASCII,2.LINK ASCII,3.EXE2BIN ASCII ASCII.COM。

      注意:当你以编译器汇编你设计的程序时,常会发生打字错误、标识符名称拼错、十六进制数少了h、逻辑错误等。汇编老手常给新人的忠告是:最好料到自己所写的程序一定会有些错误(别人告诉我的);如果第一次执行程序后,就得到期望的结果,你最好还是在检查一遍,因为它可能是错的。原则上,只要大体的逻辑架构正确,查找程序中错误的过程,与写程序本身相比甚至更有意思。写大程序时,最好能分成许多模块,如此可使程序本身的目的较单纯,易于撰写与查错,另外也可让程序中不同部份之间的界限较清楚,节省编译的时间。如果读程序有读不懂的地方最好用纸笔记下有关寄存器、内存等内容,在纸上慢慢比划,就豁然开朗了。   下面我们将写一个能从键盘取得一个十进制的数值,并将其转换成十六进制数值而显示于屏幕上的“大程序”。前言:要让8086执行这样的功能,我们必须先将此问题分解成一连串的步骤,称为程序规划。首先,以流程图的方式,来确保整个程序在逻辑上没有问题(不用说了吧!什么语言都要有此步骤)。这种模块化的规划方式,称之为“由上而下的程序规划”。而在真正写程序时,却是从最小的单位模块(子程序)开始,当每个模块都完成之后,再合并成大程序;这种大处著眼,小处著手的方式称为“由下而上的程序设计”。

      我们的第一个模块是BINIHEX,其主要用途是从8086的BX寄存器中取出二进制数,并以十六进制方式显示在屏幕上。注意:子程序如不能独立运行,实属正常。
       binihex segment
       assume cs:binihex
       mov ch,4 ;记录转换后的十六进制位数(四位)
       rotate: mov cl,4 ;利用CL当计数器,记录寄存器数位移动次数
       rol bx,cl ;循环寄存器BX的内容,以便依序处理4个十六进制数
       mov al,bl ;把bx低八位bl内数据转移至al
       and al,0fh ;把无用位清零
       add al,30h ;把AL内数据加30H,并存入al
       cmp al,3ah ;与3ah比较
       jl printit ;小于3ah则转移
       add al,7h ;把AL内数据加30H,并存入al
       printit:mov dl,al ;把ASCII码装入DL
       mov ah,2
       int 21h
       dec ch ;ch减一,减到零时,零标志置1
       jnz rotate ;JNZ:当零标志未置1,则跳到指定地址。即:不等,则转移
       int 20h ;从子程序退回主程序
       binihex ends
       end

      利用循环左移指令ROL循环寄存器BX(BX内容将由第二个子程序提供)的内容,以便依序处理4个十六进制数:1. 利用CL当计数器,记录寄存器移位的次数。2.将BX的第一个十六进制值移到最右边。利用 AND (逻辑“与”运算:对应位都为1时,其结果为1,其余情况为零)把不要的部份清零,得到结果:先将BL值存入AL中,再利用AND以0Fh(00001111)将AL的左边四位清零。由于0到9的ASCII码为30h到39h,而A到F之ASCII码为41h到46h,间断了7h,所以得到结果:若AL之内容小于3Ah,则AL值只加30h,否则AL再加7h。ADD指令会将两个表达式相加,其结果存于左边表达式内。标志寄存器(Flag Register)是一个单独的十六位寄存器,有9个标志位,某些汇编指令(大部份是涉及比较、算术或逻辑运算的指令)执行时,会将相关标志位置1或清0, 常碰到的标志位有零标志(ZF)、符号标志(SF)、溢出标志(OF)和进位标志(CF)。 标志位保存了某个指令执行后对它的影响,可用其他相关指令,查出标志的状态,根据状态产生动作。CMP指令很像减法,是将两个表达式的值相减,但寄存器或内存的内容并未改变,只是相对的标志位发生改变而已:若 AL 值小于 3Ah,则正负号标志位会置0,反之则置1。 JL指令可解释为:小于就转移到指定位置,大于、等于则向下执行。CMP和JG 、JL等条件转移指令一起使用,可以形成程序的分支结构,是写汇编程序常用技巧。

      第二个模块DECIBIN 用来接收键盘打入的十进制数,并将它转换成二进制数放于BX 寄存器中,供模块1 BINIHEX使用。
       decibin segment
       assume cs:decibin
       mov bx,0 ;BX清零
       newchar:mov ah,1 ;
       int 21h ;读一个键盘输入符号入al,并显示
       sub al,30h ;al减去30H,结果存于al中,完成ASCII码转二进制码
       jl exit ;小于零则转移
       cmp al,9d
       jg exit ;左>右则转移
       cbw ;8位al转换成16位ax
       xchg ax,bx ;互换ax和bx内数据
       mov cx,10d ;十进制数10入cx
       mul cx ;表达式的值与ax内容相乘,并将结果存于ax
       xchg ax,bx
       add bx,ax
       jmp newchar ;无条件转移
       exit: int 20 ;回主程序
       decibin ends
       end
       CBW 实际结果是:若AL中的值为正,则AH填入00h;反之,则AH填入FFh。XCHG常用于需要暂时保留某个寄存器中的内容时。
       当然,还得一个子程序(CRLF)使后显示的十六进制数不会盖掉先输入的十进制数。
       crlf segment
       assume cs:crlf
       mov dl,0dh ;回车的ASCII码0DH入DL
       mov ah,2
       int 21h
       mov dl,0ah ;换行的ASSII码0AH入AH
       mov ah,2
       int 21h
       int 20 ;回主程序
       crlf ends
       end

      现在我们就可以将BINIHEX、DECIBIN及CRLF等模块合并成一个大程序了。首先,我们要将这三个模块子程序略加改动。然后,再写一段程序来调用每一个子程序。
       crlf proc near;
       mov dl,0dh
       mov ah,2
       int 21h
       mov dl,0ah
       mov ah,2
       int 21h
       ret
       crlf endp

      类似SEGMENT与ENDS的伪指令,PROC与ENDP也是成对出现,用来识别并定义一个程序。其实,PROC 真正的作用只是告诉编译器:所调用的程序是属于近程(NEAR)或远程(FAR)。 一般的程序是由 DEBUG 直接调用的,所以用 INT 20 返回,用 CALL 指令所调用的程序则改用返回指令RET,RET会把控制权转移到栈顶所指的地址,而该地址是由调用此程序的 CALL指令所放入的。
       各模块都搞定了,然后我们把子程序组合起来就大功告成
       decihex segment ;主程序
       assume cs:decihex
       org 100h
       mov cx,4 ;循环次数入cx;由于子程序要用到cx,故子程序要将cx入栈
       repeat: call decibin;调用十进制转二进制子程序
       call crlf ;调用添加回、换行符子程序
       call binihex ;调用二进制转十六进制并显示子程序
       call crlf
       loop repeat ;循环4次,可连续运算4次
       mov ah,4ch ; 调用DOS21号中断4c号功能,退出程序,作用跟INT 20H
       int 21H ; 一样,但适用面更广,INT20H退不出时,试一下它
       decibin proc near push cx ;将cx压入堆栈,;
       ┇ exit: pop cx ;将cx还原; retdecibin endp binihex proc near push cx
       ┇ pop cx retbinihex endp crlf proc near
       push cx
       ┇ pop cx retcrlf endpdecihex ends end

      CALL指令用来调用子程序,并将控制权转移到子程序地址,同时将CALL的下行一指令地址定为返回地址,并压入堆栈中。CALL 可分为近程(NEAR)及远程(FAR)两种:1.NEAR:IP的内容被压入堆栈中,用于程序与程序在同一段中。2.FAR:CS 、IP寄存器的内容依次压入堆栈中,用于程序与程序在不同段中。PUSH、POP又是一对指令用于将寄存器内容压入、弹出,用来保护寄存器数据,子程序调用中运用较多。堆栈指针有个“后进先出”原则,像PUSH AX,PUSH BX…POP BX,POP AX这样才能作到保护数据丝毫不差。

      汇编语言超浓缩教程到这要告一段落了,希望能奠定你独立设计的基础。而更多更好的技巧则全依赖你平时的积累了。祝你成功!

     

    展开全文
  • 汇编教程

    2011-06-25 13:27:00
    对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩...

      对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?―― Here we go!(阅读时看不懂不要紧,下文必有分解)

      因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提)

      CPU是可以执行电脑所有算术╱逻辑运算与基本 I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。 所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。

      内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放数值的储存位置,叫“地址”。8086地址总线有20位,所以CPU拥有达1M的寻址空间,这也是DOS的有效控制范围,而8086能做的运算仅限于处理16位数据,即只有0到64K,所以,必须用分段寻址才能控制整个内存地址。完整的20位地址可分成两部份:1.段基址(Segment):16位二进制数后面加上四个二进制0,即一个16进制0,变成20位二进制数,可设定1M中任何一个64K段,通常记做16位二进制数;2.偏移量(Offset):直接使用16位二进制数,指向段基址中的任何一个地址。如:2222(段基址):3333(偏移量),其实际的20位地址值为:25553。除了上述营养要充分吸收外,你还要知道什么是DOS、BIOS功能调用,简单的说,功能调用类似于WIN95 API,相当于子程序。汇编写程序已经够要命了,如果不用MS、IBM的子程序,这日子真是没法过了(关于功能调用详见《电脑爱好者》98年11期)。

      编写汇编语言有两种主要的方法:1.使用MASM或TASM等编译器;2.使用除错程序DEBUG.COM。DEBUG其实并不能算是一个编译器,它的主要用途在于除错,即修正汇编程序中的错误。不过,也可以用来写短的汇编程序,尤其对初学者而言,DEBUG 更是最佳的入门工具。因为DEBUG操作容易:只要键入DEBUG回车,A回车即可进行汇编,过程简单,而使用编译器时,必须用到文本编辑器、编译器本身、LINK以及EXE2BIN等程序,其中每一个程序都必须用到一系列相当复杂的命令才能工作,而且用编译器处理源程序,必须加入许多与指令语句无关的指示性语句,以供编译器识别,使用 DEBUG 可以避免一开始就碰到许多难以理解的程序行。DEBUG 除了能够汇编程序之外,还可用来检查和修改内存位置、载入储存和执行程序、以及检查和修改寄存器,换句话说,DEBUG是为了让我们接触硬件而设计的。(8086常用指令用法将在每个汇编程序中讲解,限于篇幅,不可能将所有指令列出)。

      DEBUG的的A命令可以汇编出简单的COM文件,所以DEBUG编写的程序一定要由地址 100h(COM文件要求)开始才合法。FOLLOW ME,SETP BY SETP(步步回车):

      输入 A100 ; 从DS:100开始汇编
       2.输入 MOV DL,1 ; 将数值 01h 装入 DL 寄存器
       3.输入 MOV AH,2 ; 将数值 02h 装入 DL 寄存器
       4.输入 INT 21 ; 调用DOS 21号中断2号功能,用来逐个显示装入DL的字符
       5.输入 INT 20 ; 调用DOS 20号中断,终止程序,将控制权交回给 DEBUG
       6.请按 Enter 键
       7.现在已将汇编语言程序放入内存中了,输入 G(运行)
       8.出现结果:输出一个符号。
       ㄖ ←输出结果其实不是它,因WORD97无法显示原结果,故找一赝品将就着。
       Program terminated normally

      我们可以用U命令将十六进制的机器码反汇编(Unassemble)成汇编指令。你将发现每一行右边的汇编指令就是被汇编成相应的机器码,而8086实际上就是以机器码来执行程序。
       1.输入 U100,106
       1FED:0100 B201 MOV DL,01
       1FED:0102 B402 MOV AH,02
       1FED:0104 CD21 INT 21
       1FED:0106 CD20 INT 20
       DEBUG可以用R命令来查看、改变寄存器内容。CS:IP寄存器,保存了将执行指令地址。
       1.输入R
       AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
       DS=1FED ES=1FED SS=1FED CS=1FED IP=0100 NV UP EI PL NZ NA PO NC
       1FED:0100 B201 MOV DL,01

      当程序由DS:100开始执行,那么终止程序时,DEBUG会自动将IP内容重新设定为100。当你要将此程序做成一个独立的可执行文件,则可以用N命令对该程序命名。但一定要为COM文件,否则无法以DEBUG载入。
       输入N SMILE.COM ;我们得告诉DEBUG程序长度:程序从100开始到106,故占用7
       ;字节。我们利用BX存放长度值高位部分,而以CX存放低位部分。
       2.输入RBX ;查看 BX 寄存器的内容,本程序只有7个字节,故本步可省略
       3.输入 RCX  ;查看 CX 寄存器的内容
       4.输入 7  ;程序的字节数
       5.输入 W ;用W命令将该程序写入(Write)磁盘中

      修行至此,我们便可以真正接触8086汇编指令了。 当我们写汇编语言程序的时候,通常不会直接将机器码放入内存中,而是打入一串助记符号(Mnemonic Symbols),这些符号比十六进制机器码更容易记住,此之谓汇编指令。助记符号,告诉CPU应执行何种运算。 也就是说,助忆符号所构成的汇编语言是为人设计的,而机器语言是对PC设计的。

      现在,我们再来剖析一个可以将所有ASCII码显示出来的程序。
       1. 输入 DEBUG
       2. 输入 A100
       3.输入 MOV CX,0100 ;装入循环次数
       MOV DL,00 ;装入第一个ASCII码,随后每次循环装入新码
       MOV AH,02
       INT 21
       INC DL ;INC:递增指令,每次将数据寄存器 DL 内的数值加 1
       LOOP 0105 ;LOOP:循环指令,每执行一次LOOP,CX值减1,并跳
       ;到循环的起始地址105,直到CX为0,循环停止
       INT 20
       4.输入 G即可显示所有ASCII码
     
       当我们想任意显示字符串,如:UNDERSTAND?,则可以使用DOS21H号中断9H号功能。输入下行程序,存盘并执行看看:
       1.输入 A100
       MOV DX,109 ;DS:DX = 字符串的起始地址
       MOV AH,9 ;DOS的09h功能调用
       INT 21 ;字符串输出
       INT 20
       DB 'UNDERSTAND?$';定义字符串

      在汇编语言中,有两种不同的指令:1.正规指令:如 MOV 等,是属于CPU的指令,用来告诉CPU在程序执行时应做些什么,所以它会以运算码(OP-code)的方式存入内存中;2.伪指令:如DB等,是属于DEBUG等编译器的指令,用来告诉编译器在编译时应做些什么。DB(Define Byte)指令用来告诉DEBUG 将单引号内的所有ASCII 码放入内存中。使用 9H 功能的字符串必须以$结尾。用D命令可用来查看DB伪指令将那些内容放入内存。
       6.输入 D100
       1975:0100 BA 09 01 B4 09 CD 21 CD-20 75 6E 64 65 72 73 74 ......!. underst
       1975:0110 61 6E 64 24 8B 46 F8 89-45 04 8B 46 34 00 64 19 and$.F..E..F4.d.
       1975:0120 89 45 02 33 C0 5E 5F C9-C3 00 C8 04 00 00 57 56 .E.3.^_.......WV
       1975:0130 6B F8 0E 81 C7 FE 53 8B-DF 8B C2 E8 32 FE 0B C0 k.....S.....2...
       1975:0140 74 05 33 C0 99 EB 17 8B-45 0C E8 D4 97 8B F0 89 t.3.....E.......
       1975:0150 56 FE 0B D0 74 EC 8B 45-08 03 C6 8B 56 FE 5E 5F V...t..E....V.^_
       1975:0160 C9 C3 C8 02 00 00 6B D8-0E 81 C3 FE 53 89 5E FE ......k.....S.^.
       1975:0170 8B C2 E8 FB FD 0B C0 75-09 8B 5E FE 8B 47 0C E8 .......u..^..G..

      现在,我们来剖析另一个程序:由键盘输入任意字符串,然后显示出来。db 20指示DEBUG保留20h个未用的内存空间供缓冲区使用。
       输入A100
       MOV DX,0116 ;DS:DX = 缓冲区地址,由DB伪指令确定缓冲区地址
       MOV AH,0A ;0Ah 号功能调用
       INT 21 ;键盘输入缓冲区
       MOV DL,0A ;由于功能Ah在每个字符串最后加一个归位码(0Dh由 Enter
       MOV AH,02 ;产生),使光标自动回到输入行的最前端,为了使新输出的
       INT 21 ;字符串不会盖掉原来输入的字符串,所以利用功能2h加一
       ;个换行码(OAh),使得光标移到下一行的的最前端。
       MOV DX,0118 ;装入字符串的起始位置
       MOV AH,09 ;9h功能遇到$符号才会停止输出,故字符串最后必须加上
       INT 21 ;$,否则9h功能会继续将内存中的无用数据胡乱显示出来
       INT 20
       DB 20 ;定义缓冲区
       送你一句话:学汇编切忌心浮气燥。

      客套话就不讲了。工欲善其事,必先利其器。与其说DEBUG 是编译器,倒不如说它是“直译器”,DEBUG的A命令只可将一行汇编指令转成机器语言,且立刻执行。真正编译器(MASM)的运作是利用文本编辑器(EDIT等)将汇编指令建成一个独立且附加名为.ASM的文本文件,称源程序。它是MASM 程序的输入部分。MASM将输入的ASM文件,编译成.OBJ文件,称为目标程序。OBJ文件仅包含有关程序各部份要载入何处及如何与其他程序合并的信息,无法直接载入内存执行。链结程序LINK则可将OBJ文件转换成可载入内存执行(EXEcute)的EXE文件。还可以用EXE2BIN,将符合条件的EXE文件转成COM文件(COM 文件不但占用的内存最少,而且运行速度最快)。
       下面我们用MASM写一个与用DEBUG写的第一个程序功能一样的程序。
       用EDIT编辑一个SMILE.ASM的源程序文件。
       源程序 DEBUG 程序
       prognam segment
       assume cs:prognam
       org 100h A100
       mov dl,1 mov dl,1
       mov ah,2 mov ah,2
       int 21h int 21
       int 20h int 20
       prognam ends
       end

      比较一下:1.因为MASM会将所有的数值假设为十进制,而DEBUG则只使用十六进制,所以在源程序中,我们必须在有关数字后加上代表进制的字母,如H代表十六进制,D代表十进制。若是以字母开头的十六进制数字,还必须在字母前加个0,以表示它是数,如0AH。2.源程序增加五行叙述:prognam segment 与 prognam ends 是成对的,用来告诉 MASM 及LINK,此程序将放在一个称为PROGNAM(PROGram NAMe)的程序段内,其中段名(PROGNAM)可以任取,但其位置必须固定。assume cs:prognam 必须在程序的开头,用来告诉编译器此程序所在段的位置放在CS寄存器中。end用来告诉MASM,程序到此结束, ORG 100H作用相当于DEBUG的A100,从偏移量100开始汇编。COM 文件的所有源程序都必须包含这五行,且必须依相同的次序及位置出现,这点东西记下就行,千篇一律。接着,我们用MASM编译SMILE.ASM。
       输入 MASM SMILE ←不用打入附加名.ASM。
       Microsoft (R) Macro Assembler Version 5.10
       Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.
       Object filename [SMILE.OBJ]: ←是否改动输出OBJ文件名,如不改就ENTER
       Source listing [NUL.LST]: ← 是否需要列表文件(LST),不需要就ENTER
       Cross-reference [NUL.CRF]: ←是否需要对照文件(CRF),不需要则ENTER
       50162 + 403867 Bytes symbol space free
       0 Warning Errors ←警告错误,表示编译器对某些语句不理解,通常是输入错误。
       0 Severe Errors ←严重错误,会造成程序无法执行,通常是语法结构错误。

      如果没有一个错误存在,即可生成OBJ文件。OBJ中包含的是编译后的二进制结果,它还无法被 DOS载入内存中加以执行,必须加以链结(Linking)。以LINK将OBJ文件(SMILE.OBJ)链结成 EXE 文件(SMILE.EXE)时,。
       1.输入 LINK SMILE ←不用附加名OBJ
       Microsoft (R) Overlay Linker Version 3.64
       Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.
       Run File [SMILE.EXE]: ← 是否改动输出EXE文件名,如不改就ENTER
       List File [NUL.MAP]: ← 是否需要列表文件(MAP),不需要则ENTER
       Libraries [.LIB]: ←是否需要库文件,要就键入文件名,不要则ENTER
       LINK : warning L4021: no stack segment← 由于COM文件不使用堆栈段,所以错误信息
       ←"no stack segment"并不影响程序正常执行

      至此已经生成EXE文件,我们还须使用EXE2BIN 将EXE文件(SMILE.EXE),转换成COM文件(SMILE.COM)。输入EXE2BIN SMILE产生 BIN 文件(SMILE.BIN)。其实 BIN 文件与 COM 文件是完全相同的,但由于DOS只认COM、EXE及BAT文件,所以BIN文件无法被正确执行,改名或直接输入 EXE2BIN SMILE SMILE.COM即可。现在,磁盘上应该有 SMILE.COM 文件了,你只要在提示符号C:>下,直接输入文件名称 SMILE ,就可以执行这个程序了。

      你是否觉得用编译器产生程序的方法,比 DEBUG 麻烦多了!以小程序而言,的确是如此,但对于较大的程序,你就会发现其优点了。我们再将ASCII程序以编译器方式再做一次,看看有无差异。首先,用EDIT.COM建立 ASCII.ASM 文件。
       prognam segment ;定义段
       assume cs:prognam ;把上面定义段的段基址放入 CS
       mov cx,100h ; 装入循环次数
       mov dl,0 ; 装入第一个ASCII码,随后每次循环装入新码
       next: mov ah,2
       int 21h
       inc dl ;INC:递增指令,每次将数据寄存器 DL 内的数值加 1
       loop next ; 循环指令,执行一次,CX减1,直到CX为0,循环停止
       int 20h
       prognam ends ;段终止
       end ;汇编终止
       在汇编语言的源程序中,每一个程序行都包含三项元素:
        start: mov dl,1 ;装入第一个ASCII码,随后每次循环装入新码
        标识符 表达式 注解

      在原始文件中加上注解可使程序更易理解,便于以后参考。每行注解以“;”与程序行分离。编译器对注解不予理会,注解的数据不会出现在OBJ、EXE或COM文件中。由于我们在写源程序时,并不知道每一程序行的地址,所以必须以符号名称来代表相对地址,称为“标识符”。我们通常在适当行的适当位置上,键入标识符。标识符(label)最长可达31 个字节,因此我们在程序中,尽量以简洁的文字做为标识符。现在,你可以将此ASCII.ASM 文件编译成 ASCII.COM 了。1.MASM ASCII,2.LINK ASCII,3.EXE2BIN ASCII ASCII.COM。

      注意:当你以编译器汇编你设计的程序时,常会发生打字错误、标识符名称拼错、十六进制数少了h、逻辑错误等。汇编老手常给新人的忠告是:最好料到自己所写的程序一定会有些错误(别人告诉我的);如果第一次执行程序后,就得到期望的结果,你最好还是在检查一遍,因为它可能是错的。原则上,只要大体的逻辑架构正确,查找程序中错误的过程,与写程序本身相比甚至更有意思。写大程序时,最好能分成许多模块,如此可使程序本身的目的较单纯,易于撰写与查错,另外也可让程序中不同部份之间的界限较清楚,节省编译的时间。如果读程序有读不懂的地方最好用纸笔记下有关寄存器、内存等内容,在纸上慢慢比划,就豁然开朗了。   下面我们将写一个能从键盘取得一个十进制的数值,并将其转换成十六进制数值而显示于屏幕上的“大程序”。前言:要让8086执行这样的功能,我们必须先将此问题分解成一连串的步骤,称为程序规划。首先,以流程图的方式,来确保整个程序在逻辑上没有问题(不用说了吧!什么语言都要有此步骤)。这种模块化的规划方式,称之为“由上而下的程序规划”。而在真正写程序时,却是从最小的单位模块(子程序)开始,当每个模块都完成之后,再合并成大程序;这种大处著眼,小处著手的方式称为“由下而上的程序设计”。

      我们的第一个模块是BINIHEX,其主要用途是从8086的BX寄存器中取出二进制数,并以十六进制方式显示在屏幕上。注意:子程序如不能独立运行,实属正常。
       binihex segment
       assume cs:binihex
       mov ch,4 ;记录转换后的十六进制位数(四位)
       rotate: mov cl,4 ;利用CL当计数器,记录寄存器数位移动次数
       rol bx,cl ;循环寄存器BX的内容,以便依序处理4个十六进制数
       mov al,bl ;把bx低八位bl内数据转移至al
       and al,0fh ;把无用位清零
       add al,30h ;把AL内数据加30H,并存入al
       cmp al,3ah ;与3ah比较
       jl printit ;小于3ah则转移
       add al,7h ;把AL内数据加30H,并存入al
       printit:mov dl,al ;把ASCII码装入DL
       mov ah,2
       int 21h
       dec ch ;ch减一,减到零时,零标志置1
       jnz rotate ;JNZ:当零标志未置1,则跳到指定地址。即:不等,则转移
       int 20h ;从子程序退回主程序
       binihex ends
       end

      利用循环左移指令ROL循环寄存器BX(BX内容将由第二个子程序提供)的内容,以便依序处理4个十六进制数:1. 利用CL当计数器,记录寄存器移位的次数。2.将BX的第一个十六进制值移到最右边。利用 AND (逻辑“与”运算:对应位都为1时,其结果为1,其余情况为零)把不要的部份清零,得到结果:先将BL值存入AL中,再利用AND以0Fh(00001111)将AL的左边四位清零。由于0到9的ASCII码为30h到39h,而A到F之ASCII码为41h到46h,间断了7h,所以得到结果:若AL之内容小于3Ah,则AL值只加30h,否则AL再加7h。ADD指令会将两个表达式相加,其结果存于左边表达式内。标志寄存器(Flag Register)是一个单独的十六位寄存器,有9个标志位,某些汇编指令(大部份是涉及比较、算术或逻辑运算的指令)执行时,会将相关标志位置1或清0, 常碰到的标志位有零标志(ZF)、符号标志(SF)、溢出标志(OF)和进位标志(CF)。 标志位保存了某个指令执行后对它的影响,可用其他相关指令,查出标志的状态,根据状态产生动作。CMP指令很像减法,是将两个表达式的值相减,但寄存器或内存的内容并未改变,只是相对的标志位发生改变而已:若 AL 值小于 3Ah,则正负号标志位会置0,反之则置1。 JL指令可解释为:小于就转移到指定位置,大于、等于则向下执行。CMP和JG 、JL等条件转移指令一起使用,可以形成程序的分支结构,是写汇编程序常用技巧。

      第二个模块DECIBIN 用来接收键盘打入的十进制数,并将它转换成二进制数放于BX 寄存器中,供模块1 BINIHEX使用。
       decibin segment
       assume cs:decibin
       mov bx,0 ;BX清零
       newchar:mov ah,1 ;
       int 21h ;读一个键盘输入符号入al,并显示
       sub al,30h ;al减去30H,结果存于al中,完成ASCII码转二进制码
       jl exit ;小于零则转移
       cmp al,9d
       jg exit ;左>右则转移
       cbw ;8位al转换成16位ax
       xchg ax,bx ;互换ax和bx内数据
       mov cx,10d ;十进制数10入cx
       mul cx ;表达式的值与ax内容相乘,并将结果存于ax
       xchg ax,bx
       add bx,ax
       jmp newchar ;无条件转移
       exit: int 20 ;回主程序
       decibin ends
       end
       CBW 实际结果是:若AL中的值为正,则AH填入00h;反之,则AH填入FFh。XCHG常用于需要暂时保留某个寄存器中的内容时。
       当然,还得一个子程序(CRLF)使后显示的十六进制数不会盖掉先输入的十进制数。
       crlf segment
       assume cs:crlf
       mov dl,0dh ;回车的ASCII码0DH入DL
       mov ah,2
       int 21h
       mov dl,0ah ;换行的ASSII码0AH入AH
       mov ah,2
       int 21h
       int 20 ;回主程序
       crlf ends
       end

      现在我们就可以将BINIHEX、DECIBIN及CRLF等模块合并成一个大程序了。首先,我们要将这三个模块子程序略加改动。然后,再写一段程序来调用每一个子程序。
       crlf proc near;
       mov dl,0dh
       mov ah,2
       int 21h
       mov dl,0ah
       mov ah,2
       int 21h
       ret
       crlf endp

      类似SEGMENT与ENDS的伪指令,PROC与ENDP也是成对出现,用来识别并定义一个程序。其实,PROC 真正的作用只是告诉编译器:所调用的程序是属于近程(NEAR)或远程(FAR)。 一般的程序是由 DEBUG 直接调用的,所以用 INT 20 返回,用 CALL 指令所调用的程序则改用返回指令RET,RET会把控制权转移到栈顶所指的地址,而该地址是由调用此程序的 CALL指令所放入的。
       各模块都搞定了,然后我们把子程序组合起来就大功告成
       decihex segment ;主程序
       assume cs:decihex
       org 100h
       mov cx,4 ;循环次数入cx;由于子程序要用到cx,故子程序要将cx入栈
       repeat: call decibin;调用十进制转二进制子程序
       call crlf ;调用添加回、换行符子程序
       call binihex ;调用二进制转十六进制并显示子程序
       call crlf
       loop repeat ;循环4次,可连续运算4次
       mov ah,4ch ; 调用DOS21号中断4c号功能,退出程序,作用跟INT 20H
       int 21H ; 一样,但适用面更广,INT20H退不出时,试一下它
       decibin proc near push cx ;将cx压入堆栈,;
       ┇ exit: pop cx ;将cx还原; retdecibin endp binihex proc near push cx
       ┇ pop cx retbinihex endp crlf proc near
       push cx
       ┇ pop cx retcrlf endpdecihex ends end

      CALL指令用来调用子程序,并将控制权转移到子程序地址,同时将CALL的下行一指令地址定为返回地址,并压入堆栈中。CALL 可分为近程(NEAR)及远程(FAR)两种:1.NEAR:IP的内容被压入堆栈中,用于程序与程序在同一段中。2.FAR:CS 、IP寄存器的内容依次压入堆栈中,用于程序与程序在不同段中。PUSH、POP又是一对指令用于将寄存器内容压入、弹出,用来保护寄存器数据,子程序调用中运用较多。堆栈指针有个“后进先出”原则,像PUSH AX,PUSH BX…POP BX,POP AX这样才能作到保护数据丝毫不差。

      汇编语言超浓缩教程到这要告一段落了,希望能奠定你独立设计的基础。而更多更好的技巧则全依赖你平时的积累了。祝你成功!

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/topasstem8/archive/2011/06/25/6567247.aspx

    展开全文
  • 文章目录第四章 汇编语言程序汇编语言程序结构汇编源程序的编程格式DOS调用BIOS功能调用键盘输入功能调用(INT 16H)BIOS屏显功能调用的调用模式(int 10H)程序设计方法汇编程序结构语法子程序设计宏指令程序设计 ...
  • 《计算机组成原理与汇编实验报告》由会员分享,可在线阅读,更多相关《计算机组成原理与汇编实验报告(5页珍藏版)》请在人人文库网上搜索。1、计算机组成原理与汇编实验报告中南大学 计算机组成原理 与汇编 实验报告 ...
  • VS2015中运行32位汇编程序

    千次阅读 2017-07-08 22:37:01
     这学期开汇编语言课。作为培养方案中的一门选修课,与课组中教微机原理、嵌入式的同事商量,决定这门课就以8086为载体,带大家入门即可。不过,在课程结束之前,也向同学们做了拓展。  本文的版权属于我的2015级...
  • 汇编语言实验

    千次阅读 2018-11-04 23:31:06
    fzuASM汇编编译调试    第一部分同https://jingyan.baidu.com/article/14bd256e7e4b7cbb6d2612f6.html 汇编课程编译.asm文件以及调试对应.exe 需要的东西 windows DOS(黑框) odbg110 make32.bat以及对应的...
  • 汇编语言过程

    2020-12-29 22:39:42
    汇编语言堆栈简介 如下图所示,如果把 10 个盘子垒起来,其结果就称为堆栈。虽然有可能从这个堆栈的中间移出一个盘子,但是,更普遍的是从顶端移除。新的盘子可以叠加到堆栈顶部,但不能加在底部或中部。 堆栈...
  • 汇编语言

    2009-10-15 20:59:00
    汇编基础(){function onclick(){NEBlog.gPermaLinkPage.updownMenu.openSameClas
  • 1:在C++程序中使用__asm块插入汇编代码程序(不能用LENGTHOF与SIZEOF运算符,而是LENGTH和SIZE) struct Package { long originZip; //4 long destinationzip;//4 float shippingPrice; //4 }; int main(int ...
  • 文章目录SHU汇编程序设计常见考点、易错点总结与综合示例一、常见考点1、寻址方式2、移位3、乘除运算4、加减操作5、取址操作6、出入栈7、中断8、标志位9、常见的字符的ASCII码10、IO端口11、输入输出二、常见易错点...
  • 汇编语言8086笔记

    千次阅读 多人点赞 2017-06-07 14:56:36
    为什么要学习汇编语言? 汇编语言是很多相关课程的重要基础,比如:操作系统、接口技术等。它是底层编程语言,是计算机系统提供给用户最快最有效的语言,也是能对硬件直接编程的语言。因此,对空间和时间要求很高的...
  • 记录汇编语言课笔记,可能有不正确的地方,欢迎指出 教材《80X86微机原理及接口技术实验指导书》 这篇文章是书中部分实验代码的总结,可以用Tdpit 环境编译并运行在配套实验箱中,这个环境支持比较标准的intel风格...
  • 常见汇编代码

    千次阅读 2016-01-07 16:33:46
    常见汇编代码 编写程序:比较AX,BX,CX中带符号数的大小,将最大的数放在AX中code segment assume cs:code mov ax,32 mov bx,74 mov cx,23sort: cmp ax,bx jge X ;如果ax大于等于bx就跟cx比较 xchg ax,bx X:...
  • x86汇编代码记录

    2019-03-19 14:44:41
    一、汇编代码如何执行 编译 masm a.asm 链接 link a.obj 执行 a.exe 二、汇编练习代码 设计程序。实现Y=2X+3,X是一位十进制数。要求X从键盘输入,在下一行上显示’Y=2X+3=’ 以及十进制计算结果。 .model small...
  • 汇编源码

    2018-09-02 18:24:27
    # 常见汇编代码 # 1. 编写程序:比较AX,BX,CX中带符号数的大小,将最大的数放在AX中  code segment  assume cs:code     mov ax,32  mov bx,74  mov cx,23    sort: cmp ax,bx   ...
  • 汇编语言考前总结

    千次阅读 2011-09-15 17:33:01
    题外话:学好汇编,建议大家看王爽老师的《汇编语言》 清华大学出版社  图书配套网站 汇编网:http://www.asmedu.net/ 讨论氛围非常好。 JRH的汇编网博客(卖弄一下呵呵):...
  • [汇编理论]汇编语言

    千次阅读 2006-03-12 18:26:00
    所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员...
  • 汇编程序设计题目

    2021-01-02 16:57:02
    编写一个汇编语言程序,要求从键盘接收一个四位的十六进制数,并在 终端上显示与它等值的二进制数 源代码 CODES SEGMENT ASSUME CS:CODES START: MAIN PROC FAR PUSH DS SUB AX,AX PUSH AX CALL HEXIBIN CALL...
  • 超强大汇编语言超浓缩教程

    千次阅读 2019-09-01 21:40:55
    最近想了解计算机组成原理,特保存一些查看的资料: ...急,一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好...
  • 汇编小记

    2015-01-12 19:30:27
    汇编语言的"回车"和“换行” 回车键的历史 关于“回车键”的来历,还得从机械的英文打字机说起。在打字机上,有一个部件叫“字车”,每输入一个单词,“字车”就前进一格。当输满一行后,使用者就要推动“字车”到...
  • 汇编语言:指令集合

    2020-10-14 19:02:18
    有一定编程基础可以很轻松用高级语言编写出程序,...汇编指令集合指令集合循环指令 指令集合 循环指令 LOOP ;每执行一次loop指令CX=CX-1,判断cx是否为零,CX不为零跳转执行,CX为零跳出循环顺序执行下条语句; ...
  • 文章目录一、用C语言写正弦函数代码二、再翻译为汇编 一、用C语言写正弦函数代码 #include<stdio.h> #include<math.h> void main() { float x,sum,a,b; //sum代表和,a为分子,b为分母 char s; ...
  • 汇编输入字符串

    2015-03-07 22:18:03
    ;汇编实现读入字符串并显示NAME INPUT DATA SEGMENT STR DB 'PLEASE INPUT A STRING:$' BUF DB 20 ;定义了BUF的长度,最多容纳20-2=18个字符 DB ? ;纪录输入字符后,实际读入的字符
  • 汇编实验2.4查找电话号码phone
  • 既然这样 先po出一点代码 好了 hexidec segment assume cs: hexidec main proc far start : push ds sub ax,ax push ax repeat: call hexibin call crlf call binidec call crlf jmp repeat ret main endp

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 981
精华内容 392
热门标签
关键字:

crlf汇编