热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

花了几个钟头才写好一个利用直接定址表的中断处理程序

王爽《汇编语言》第十六章的实验,我做了一些改动。;21:022007-7-5

王爽《汇编语言》第十六章的实验,我做了一些改动。

 

; 21 : 02   2007 - 7 - 5
assume cs:codesg

datasg segment
    endl EQU 
< 0dh,0ah >
    function0    db endl,
" This Int 7ch function is:$ "
    function1    db endl,
" (1) Cls $ "
    function2    db endl,
" (2) Set FrontColor$ "
    function3    db endl,
" (3) Set BackColor$ "
    function4    db endl,
" (4) Scroll Up$ "
    function5    db endl,
" (5) Exit$ "
    inputf        db endl,endl,
" Please Input function number:$ "
    inputc        db endl,endl,
" Please Input color(0-8):$ "
    errors        db endl,endl,
" Input Error!Please Input the number(1-5),color(0-8) " ,endl,endl, ' $ '
datasg ends
    
stack segment
    dw 
16  dup ( 0 )
stack ends

codesg segment
    
start:
    mov ax,stack
    mov ss,ax
    mov sp,
32
    mov ax,datasg
    mov ds,ax
;
/**/ ///////////////////////////////////////////////
;安装int 7ch中断处理程序
    mov ax,
0
    mov es,ax
    cli 
    mov word ptr es:[7ch
* 4 ],offset setscreen
    mov es:[7ch
* 4 + 2 ],cs
    sti
;
/**/ ////////////////////////////////////////////////
     int  7ch

    mov ax,4c00h
    
int  21h

;
/**/ ////////////////////////////////////////////////
; int  7ch中断处理程序代码

setscreen:
    jmp 
short  showfc
table:    
    dw 
0 ,sub1,sub2,sub3,sub4   ;直接定值表,第一个0为补充地址,使得输入1调用sub1。

showfc:
    push ax
    push dx
    push bx
    push cx

;显示功能提示
showfc1:
    mov ah,
9     ; int  21h 9号功能为在标准输出上显示以$结尾的字符串,DS:DX指向字符串偏移地址。
    mov dx,offset function0
    
int  21h
    mov dx,offset function1
    
int  21h
    mov dx,offset function2
    
int  21h
    mov dx,offset function3
    
int  21h
    mov dx,offset function4
    
int  21h
    mov dx,offset function5
    
int  21h

    mov dx,offset inputf
    
int  21h

;提示输入功能号码
inputfc:
    mov ah,
1
    
int  21h        ; int  21h 1号功能为从标准输入(键盘)读取一个字符的ASCII码到al,无输入时等
                         ;待,回显输入字符。
    sub al,30h    ;输入数字ASCII码减30h转换为十进制值。
    mov bh,al
    cmp bh,
5     ;范围判断
    ja error
    cmp bh,
5     ;5号功能为退出。
    je sret
    cmp bh,
0     ;范围判断
    jb error
    cmp bh,
2     ;如果是2 3号功能则提示输入颜色值。
    je inputcolor
    cmp bh,
3
    je inputcolor
    jmp 
short   set

inputcolor:
    mov ah,
9
    mov dx,offset inputc
    
int  21h
    mov ah,
1
    
int  21h
    sub al,30h
    cmp al,
8             ;范围判断
    ja error
    cmp al,
0
    jb error            ;范围判断

set :    
        mov ah,bh
    mov bl,ah
    mov bh,
0
    add bx,bx            ;根据输入的功能号码来确定TABLE中子程序的偏移地址。
    call word ptr table[bx]        ;调用子程序
    jmp 
short  showfc1        ;功能循环

sret:        
    pop cx
    pop bx
    pop dx
    pop ax
    iret    

error:    
        call sub1
    mov ah,
9
    mov dx,offset errors
    
int  21h
    jmp 
short  showfc1

sub1:
    push bx
    push cx
    push es
    mov bx,0b800h
    mov es,bx
    mov bx,
0                 ;显存偶数地址为字符。
    mov cx,
2000                 ;显存一页4000字节,偶数字节为2000个。
sub1s:    
    mov 
byte  ptr es:[bx], '   '         ;用空格代替原先字符,相当于清除原字符。
    add bx,
2
    loop sub1s
    pop es
    pop cx
    pop bx
    ret


sub2:
    push bx
    push cx
    push es
    mov bx,0b800h
    mov es,bx
    mov bx,
1                 ;显存奇数地址为颜色值。
    mov cx,
2000                 ;显存一页4000字节,奇数字节为2000个。
sub2s:    
     and 
byte  ptr es:[bx],11111000b        ;颜色值中0  1  2位为前景色RGB,先清除掉。
    or es:[bx],al                ;再or上我们输入的al值,则得到我们需要的前景色。
    add bx,
2
    loop sub2s
    pop es
    pop cx
    pop bx
    ret

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        ;颜色值中7  6  5位为背景色RGB。
    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         ;显存一页25行( 0 - 24 ),160列( 0 - 159 ),这里的160为下一行开头的第一列。
    mov di,
0             ;上一行开头。SI,DI顺序递增~
    cld
    mov cx,
24             ;只需要复制后面的24行,开头第一行不要了。
sub4s:    
    push cx
    mov cx,
160             ;列数还是要够160的,这里是循环次数,注意和上面的区别。
    rep movsb
    pop cx
    loop sub4s

    mov cx,
80             ;一行160列,偶数列为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

codesg ends
end start

 

唉,做个这么简单的东西都要花这么长时间,年轻人的话估计有45分钟也就搞定调试完了。


推荐阅读
  • 本文介绍了[从头学数学]中第101节关于比例的相关问题的研究和修炼过程。主要内容包括[机器小伟]和[工程师阿伟]一起研究比例的相关问题,并给出了一个求比例的函数scale的实现。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
author-avatar
筱杰丶Jevon_879
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有