`

汇编语言程序

asm 
阅读更多
《1》、实现绕圈的笑脸:
assume cs:code 
code segment 
       dec dh 
       dec dl 
       inc dh 
       inc dl        ;预存指令 
start: mov ax,cs 
       mov ds,ax       
       mov si,0 
       lea di,s1     ;使ds:si指向预存指令,ds:di指向目的地址 
       mov dx,0h     ;光标起始坐标0,0 
     s:mov ah,2 
       mov bh,0 
       int 10h       ;调用int 10h第2号中断,置光标 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>        
       mov ah,0ah     ;int 10h第0a号中断 
       mov al,2       ;显示笑脸 
       mov bh,0        ;第0页 
       mov cx,1       ;重复次数1 
       int 10h 
       call delay     ;延迟显示 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
       mov ah,0ah      ;用int 10h  0a号中断清除笑脸 
       mov al,0 
       mov bh,0 
       int 10h 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
     
       cmp dh,24       ;行号是否为24 
       jb L             ;小于则转 L 
       mov ax,[si]     ;等于则改s1处为自减 
       mov [di],ax      
    L2:cmp dl,79       ;列号是否为79 
       jb L1           ;小于则转 L1 
       mov ax,[si+2]    ;等于,改si+2处为自减 
       mov [di+2],ax 
       jmp s1             
     L:cmp dh,0         ;行号是否为0 
       ja L2             ;大于0转L2 
       mov ax,[si+4]     ;为0 ,改s1处为自加 
       mov [di],ax 
       jmp L2 
    L1:cmp dl,0         ;列号是否为0 
       ja s1            ;大于转 s1 
       mov ax,[si+6]    ;等于改 s1+2处 自加 
       mov [di+2],ax 
    s1:inc dh 
       inc dl  
       jmp s   
       mov ax,4c00h 
       int 21h 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>        
 delay:push ax 
       push dx 
       mov dx,2000h 
       mov ax,0 
   s3: sub ax,1 
       sbb dx,0 
       cmp ax,0 
       jne s3 
       cmp dx,0 
       jne s3 
       pop dx 
       pop ax 
       ret  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>        
 code ends 
 end start 
改进一下的【加中断可控制了】:
assume cs:code  
code segment  
       dec dh  
       dec dl  
       inc dh  
       inc dl        ;预存指令  
start: mov ax,cs  
       mov ds,ax        
       mov si,0  
       lea di,s1     ;使ds:si指向预存指令,ds:di指向目的地址  
       mov dx,0h     ;光标起始坐标0,0  
     s:mov ah,2  
       mov bh,0  
       int 10h       ;调用int 10h第2号中断,置光标  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>         
       mov ah,0ah     ;int 10h第0a号中断  
       mov al,2       ;显示笑脸  
       mov bh,0        ;第0页  
       mov cx,1       ;重复次数1  
       int 10h  
       call delay     ;延迟显示  
       in al,60H  
       cmp al,10H  
       jz over  

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
       mov ah,0ah      ;用int 10h  0a号中断清除笑脸  
       mov al,0  
       mov bh,0  
       int 10h  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
      
       cmp dh,24       ;行号是否为24  
       jb L             ;小于则转 L  
       mov ax,[si]     ;等于则改s1处为自减  
       mov [di],ax       
    L2:cmp dl,79       ;列号是否为79  
       jb L1           ;小于则转 L1  
       mov ax,[si+2]    ;等于,改si+2处为自减  
       mov [di+2],ax  
       jmp s1              
     L:cmp dh,0         ;行号是否为0  
       ja L2             ;大于0转L2  
       mov ax,[si+4]     ;为0 ,改s1处为自加  
       mov [di],ax  
       jmp L2  
    L1:cmp dl,0         ;列号是否为0  
       ja s1            ;大于转 s1  
       mov ax,[si+6]    ;等于改 s1+2处 自加  
       mov [di+2],ax  
    s1:inc dh  
       inc dl   
       jmp s    
 over:  mov ax,4c00h  
       int 21h  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>         
 delay:push ax  
       push dx  
       mov dx,500h  
       mov ax,0  
   s3: sub ax,1  
       sbb dx,0  
       cmp ax,0  
       jne s3  
       cmp dx,0  
       jne s3  
       pop dx  
       pop ax  
       ret   
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>         
 code ends  
 end start
《2》、像素颜色
;子程序display入口参数 
;cx列号 
;dx行号 
;al像素颜色 
;子程序delay延时 
stack segment stack 
     db  100h dup(?) 
stack ends 
code segment 
 assume cs:code,ds:code,ss:stack 
 start: 
       xor ax,ax         ;设置显示模式(640*480 16色图形) 
       mov ah,0 
       mov al,12h 
       int 10h 
       mov ah,0bh            ;置调色板背景色 
       mov bh,0 
       mov bl,0 
       int 10h 
       mov cx,0 
       mov dx,0 
       mov al,0 
    s2:call display 
       call delay 
       inc al 
       cmp al,10h 
       je exit 
       add cx,10 
       jmp s2 
 exit: mov ah,01 
       int 21h                              ;esc退出观看效果                               
       cmp al,1bh 
       jne exit 
       mov ax,0003h 
       int 10h 
       mov ax,4c00h 
       int 21h 
 display:push ax 
         push bx 
         push si 
         mov bx,cx 
         mov si,cx 
         add si,10      
    s: mov ah,0ch 
       int 10h 
       inc cx 
       cmp cx,si 
       jne s 
       mov cx,bx 
       inc dx 
       cmp dx,10 
       jne s 
       mov dx,0 
       pop si 
       pop bx 
       pop ax 
       ret 
 delay:push ax 
       push dx 
       mov dx,2000h 
       mov ax,0 
     s1:sub ax,1 
        sbb dx,0 
        cmp ax,0 
        jne s1 
        cmp dx,0 
        jne s1 
        pop dx 
        pop ax 
       ret 
 code ends 
 end start 
《3》进制转换:

(1)16转10进制:
TITLE CONVERT HEXADECIMAL TO BCD
DATA SEGMENT
PROMPT DB 'Hello  Boss!  INPUT   sixten bits number ,please  :$'
HEXBUF DB 3,0,3  DUP(0)
DISP   DB  0AH,0DH
BCDBUF DB  6  DUP(0),'$'
DATA   ENDS
STACK1  SEGMENT PARA STACK
         DW 20H  DUP(0)
STACK1   ENDS
COSEG    SEGMENT
         ASSUME  CS:COSEG,DS:DATA,SS:STACK1
HEXBCD: MOV  AX,DATA
        MOV  DS,AX
        LEA  DX,PROMPT
        MOV  AH,09H
        INT  21H
        LEA  DX,HEXBUF
         MOV  AH,0AH
        INT  21H
        LEA   SI,HEXBUF+2
        MOV   BX,0
        MOV   CH,HEXBUF+1
HEX1:   MOV   AL,[SI]
        CMP   AL,'9'
        JBE   NUMB
        SUB   AL,07H
NUMB:   AND   AL,0FH
        MOV   CL,04
        SAL   BX,CL
        OR    BL,AL
        INC   SI
        DEC   CH
        JNE   HEX1
        MOV   WORD PTR   BCDBUF+0,0
        MOV   WORD PTR   BCDBUF+2,0
        MOV   WORD PTR   BCDBUF+4,0
       
        TEST   BX,8000H
         JNS   PLUS
         MOV   BCDBUF,'-'
NEG      BX  
PLUS:    MOV CH,0FH
LOP0:    CLC
         SHL   BX,1
         CALL  ADDIT
         CALL  MULTI
          DEC   CH
        JNE   LOP0
        SHL   BX,1
        CALL  ADDIT


        LEA  DI,BCDBUF+1
        MOV  CX,3
LOP1:   OR  BYTE PTR  [DI],30H
         INC  DI
         LOOP  LOP1

         LEA  DX,DISP
          MOV  AH,09H
          INT  21H
        
          MOV  AH,4CH
          INT   21H

ADDIT     PROC
          LEA  DI,BCDBUF+3
           MOV CL,3
ADD1:     MOV AL,[DI]

           ADC AL,0
           AAA
           MOV   [DI],AL
           DEC   DI
           DEC   CL
           JNE   ADD1
           RET
ADDIT      ENDP
MULTI      PROC
           LEA   DI,BCDBUF+3
           MOV  CL,3
           CLC  
MUL1:      MOV   AL,[DI]
           ADC  AL,AL
           AAA
           MOV   [DI],AL
           DEC    DI
           DEC    CL
           JNE  MUL1
            RET
MULTI       ENDP
COSEG       ENDS
            END HEXBCD   

(2)十转十六进制:

TITLE ADDITION 
DATA SEGMENT 
A1   DB "Input a number please: ","$" 
A2   DB 0DH,0AH,"The result is: ","$" 
DATA ENDS 
STACK1 SEGMENT PARA STACK 
       DW 20H DUP(?) 
STACK1 ENDS 
COSEG SEGMENT 
      ASSUME CS:COSEG,DS:DATA,SS:STACK1 
START: MOV AX,DATA 
       MOV DS,AX

       MOV DX,OFFSET A1 
       MOV AH,9 
       INT 21H

       MOV AH,01H 
       INT 21H        
       
       AND AL,0FH
       SUB AH,AH
       ADD BX,AX

       MOV AH,01H 
       INT 21H 
       
       CMP AL,0DH
       JE ERR1

       MOV DX,BX
       MOV CL,3
       SAL BX,CL
       ADD BX,DX
       ADD BX,DX

       AND AL,0FH
       SUB AH,AH
       ADD BX,AX
       
ERR1:  MOV DX,OFFSET A2 
       MOV AH,9 
       INT 21H

        SUB AX,AX
        MOV CH,4
ERR2:   MOV CL,4
        ROL BX,CL
        MOV AL,BL
        AND AL,0FH
        ADD AL,30H
        CMP AL,3AH
        JB ERR3
        ADD AL,07H
ERR3:   MOV DL,AL
        MOV AH,2
        INT 21H
        DEC CH
        JNZ ERR2   
            
        MOV AH,4CH 
        INT 21H 
COSEG   ENDS 
        END START

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics