汇编代码 绕圈的笑脸

      转载别人的拿来看看。

      都说不学汇编就很难有大成就,虽说是有些底层但精通汇编还是少之甚少,希望自己能学会它吧,也能更好的学高级语言,为java打好更深理解的基础。并希望汇编高手支持帮助!真正感兴趣的可以组织到一块学习的,相信团队的力量能帮助我们奠定坚实基础!
《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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值