• 程序入口地址的直接定制表【 (1) 清屏(2) 设置前景色 (3) 设置背景色 (4) 向上滚动一行】


    ;编程:
    ; (1) 清屏
    ; (2) 设置前景色
    ; (3) 设置背景色
    ; (4) 向上滚动一行

    ;入口参数说明:
    ; (1)用ah寄存器传递功能号: 0 清屏, 1设置前景色,2设置背景色, 3向上滚动一行
    ;  (2)对于2 3 号功能,用al传送颜色值  al[0,1,2,3,4,5,6,7]

    ;各种功能如何实现
    ; (1) 清屏   :将显存中当前屏幕中的字符设为空格符
    ; (2) 设置前景色  :设置显存中当前屏幕中处于奇地址的属性字节的第0、1、2位
    ; (3) 设置背景色  :设置显存中当前屏幕中处于奇地址的属性字节的第4、5、6位
    ; (4) 向上滚动一行 :依次将第n+1行的内容复制到第n行,最后一行为空

    assume cs:code
    
    code segment
    start:
       mov ah, 0  ;清屏
       ;mov ah, 1 ;设置前景色
       ;mov al, 4
       ;mov ah, 2 ;设置背景色
       ;mov al, 2
       ;mov ah, 3 ;向上复制一行
       call setscreen
       
       
       mov ax, 4c00h
       int 21h
    
    ;==================================================
    ;将这些功能子程序的入口地址存储在一个表中
    ;功能号*2 = 对应的功能子程序在地址表中的偏移
    ;param  ah  功能号
    ;==================================================
    setscreen:
       jmp short set
       table dw sub1, sub2, sub3, sub4  ;标号table 没有':'  为 数据标号
       
     set:
       push bx
       
       cmp ah, 3  ;标号>3
       ja sret
       mov bl, ah
       mov bh, 0
       add bx, bx ;根据ab中的功能号计算对应子程序在table表中的偏移
       
       call word ptr table[bx]  
       ;相当于:
       ;  1、push IP 
       ; 2、jmp word ptr cs:table[bx]
     
     sret:
       pop bx
       ret
      
       
    
    ;=========================
    ;清屏子程序
    ;=========================
    sub1:
       push bx
       push cx
       push es
       mov bx, 0b800h
       mov es, bx
       mov bx, 0
       mov cx, 2000
     subls:
       mov byte ptr es:[bx], ' '
       add bx, 2
       loop subls
    
       pop es
       pop cx
       pop bx
       ret
       
       
    ;=========================  
    ;设置前景色
    ;param  al 前景色
    ;========================= 
    sub2:
       push bx
       push cx
       push es
       
       mov bx, 0b800h
       mov es, bx
       mov bx, 1
       mov cx, 2000
     sub2s:
       and byte ptr es:[bx], 11111000b
       or es:[bx], al
       add bx, 2
       loop sub2s
       
       pop es
       pop cx
       pop bx
       ret
    
       
    ;=========================  
    ;设置背景色
    ;param  al 背景色
    ;al 低4位 存放颜色值
    ; 高4位 0
    ;========================= 
    sub3:
       push bx
       push cx
       push es
       
       mov cl, 4
       shl al, cl
       mov bx, 0b800h
       mov es, bx
       mov bx, 1
       mov cx, 2000
     sub3s:
       and byte ptr es:[bx], 10001111b
       or es:[bx], al
       add bx, 2
       loop sub3s
       
       pop es
       pop cx
       pop bx
       ret
       
    ;=========================  
    ;向上滚动一行
    ;========================= 
    sub4:
       push cx
       push si
       push di
       push es
       push ds
       
       mov si, 0b800h
       mov es, si
       mov ds, si
       mov si, 160  ;ds:si 指向第n+1行
       mov di, 0  ;es:di 指向第n行
       cld
       mov cx, 24   ;共复制24行
     sub4s:;复制
       push cx
       mov cx, 160
       rep movsb
       pop cx
       loop sub4s
       
       mov cx, 80
       mov si, 0
     sub4s1:;最后一行清空
       mov byte ptr [160*24+si], ' '
       add si, 2
       loop sub4s1
       
       pop ds
       pop es
       pop di
       pop si
       pop cx
       ret
    
    code ends
    end start
  • 相关阅读:
    请求转发和重定向实现与Ajax实现表单登陆
    jquery学习:
    Ajax一目了然
    EL和JSTL
    jsp(java server pages):java服务器端的页面
    Vue 第二章 自定义修饰符、指令、生命周期函数
    Vue 第一章练习 列表的案例
    Vue 第一章练习 v-for
    第一章 Vue之代码基本结构、插值表达式、事件修饰符
    Vue之父组件传值给子组件
  • 原文地址:https://www.cnblogs.com/qintangtao/p/2873511.html
Copyright © 2020-2023  润新知