花了几个钟头才写好一个利用直接定址表的中断处理程序_hkbyest的博客-程序员秘密_endl equ <0dh,0ah>

技术标签: 汇编  语言  c  byte  function  table  

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

 

; 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分钟也就搞定调试完了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hkbyest/article/details/1680239

智能推荐

WPF TreeView 带复选框_wpf treeview加对选框_windowsliusheng的博客-程序员秘密

//前台界面 &amp;lt;TreeView Name=&quot;TreeView_NodeList&quot; BorderThickness=&quot;1&quot; Margin=&quot;10,10,10,35&quot;&amp;gt;            &amp;lt;TreeView.Resources&amp;gt;                &amp;lt;HierarchicalDataTemplate  DataType=&quot;{x:Type local.

Python爬虫框架Scrapy报错:ModuleNotFoundError: No module named ‘scrapy.utils.http‘_scrapy 爬虫运行爬虫名模块不存在_落空空。的博客-程序员秘密

今天在部署爬虫框架时输入csdnspider&gt;scrapyd-deploy aef -p 结果报错如下:E:\Code\python\spider\scrapy_spider\csdnspider&gt;scrapyd-deploy aef -p csdnspiderTraceback (most recent call last):E:\Code\python\spider\scrapy_spider\csdnspider&gt;scrapyd-deploy aef-p csdnspi

不要以为写写代码就是计算机科学_自嗨er的博客-程序员秘密

文章转载自:http://www.nowamagic.net/librarys/veda/detail/1784我一直认为计算机科学与技术这门专业,在本科阶段是不可能切分成计算机科学和计算机技术的,因为计算机科学需要相当多的实践,而实践需要技术;每一个人(包括非计算机专业),掌握简单的计算机技术都很容易(包括程序设计),但计算机专业的优势就在于,我们掌握许多其他专业并不“深究”的东西,例如

QPS的计算_qps怎么计算_一颗向上的草莓的博客-程序员秘密

QPS = req/sec =请求数/秒Q:如何根据日志查看一个服务的qpsA:一般access.log是记录请求的日志,tail -f XXX.access.log,可发现格式如下:前面是请求的时间,后面有接请求的方法名字,那么我们要统计getCart的qpscat osp-cart.api.vip.com_access.log | grep getCart | awk '{print $2}' | awk -F '.' '{print $1}' | ...

数据库三级模式结构_数据库的三层模式结构_杜小白Zero的博客-程序员秘密

一、三级模式结构数据库系统的三级模式结构是指模式、外模式和内模式。1、模式模式也称为逻辑模式或概念模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。一个数据库只有一个模式,模式位于三级结构的中间层。2、外模式外模式也称为用户模式,它是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示...

计组-运算器实验.doc_「已注销」的博客-程序员秘密

实验目的 1.掌握模拟过程中算术、逻辑运算单元的控制方法; 2.理解寄存器组中寄存器数据输出的方法。 实验环境 操作系统:Windows 10 虚拟模拟软件:logisim 三、实验内容及结果 CP226 中的运算器由一片CPLD实现,有8种运算,通过S2,S1,S0 来选择,运算数据由寄存器A及寄存器W 给出,运算结果输出到直通门D。功能如下表: S2 S1 S0...

随便推点

Ubuntu 下新版Mysql(8.x版本) root忘记密码的更改方法(修改密码处把password替换成md5)_请执行sql语句password的值换成自己的32位md5_TMAIAM的博客-程序员秘密

1、sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf2、在上面的文件中的[mysqld] 的最后补充一句:skip-grant-tables保存并退出3、重启mysql服务:sudo service mysql restart4、进入mysql并修改root的密码依次输入以下命令(1)mysql(2)use mysql(3)UPDATE mysql.user SET authentication_string=md5(‘123456’) WHERE Us

Spring中多配置文件以及寻觅引用其他bean的方式_weixin_33910460的博客-程序员秘密

       Spring多配置文件有什么好处?              按照目的、功能去拆分配置文件,可以提高配置文件的可读性与维护性,如将配置事务管理、数据源等少改动的配置与配置bean单独分开。         Spring读取配置文件的几种方式:       1、使用Spring自身提供的ApplicationContext方式读取       在Ja...

StarUML 最新免费使用方法_staruml要钱吗_黑白极客的博客-程序员秘密

csdn卡字眼怎么强嘛,网上试了很多办法,多已失效。今天记录下亲测有效的方法。亲测3.0.1有效1,下载StarUML下载地址2.补丁下载补丁3.使用注意:先运行APP一次后关闭掉。替换app.asar] 然后再运行使用访问(Finder)前往/Applications/StarUML.app/Contents/Resources/ ,用补丁替换掉同名的文件即可!若找不到,可以右击桌面StarUML 的图标,点击进入所在文件夹 找到Resources/。...

好程序员Web前端教程入门之MySQL命名规范及使用技巧_好程序员IT的博客-程序员秘密

  好程序员Web前端教程入门之MySQL命名规范及使用技巧,不懂MySQL的前端不是一个好前端,作为Web应用方面最好的关系数据库管理系统应用软件之一,MySQL体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。接下来的好程序员Web前端课程就给大家简单分享MySQL命名规范及使用技巧。  命名规范1、库名、表名、字段名必须...

超参数与超平面_呆狐仙的博客-程序员秘密

简单介绍一.超参数1.引言2.超参数的定义3.超参数的特点4.超参数与模型参数的区别5.超参数的示例6.超参数的优化1.超参数优化的目的2.超参数优化的方法二.超平面一.超参数1.引言机器学习模型中一般有两类参数:一类需要从数据中学习和估计得到,称为模型参数(Parameter)—即模型本身的参数。比如,线性回归直线的加权系数(斜率)及其偏差项(截距)都是模型参数。另一类则是机器学习算法中的调优参数(tuning parameters),需要人为设定,称为超参数(Hyperparameter)。比

用于iis中的wordpress,wp的url重写_anwumi7922的博客-程序员秘密

本文引用自-Club·King《isapi_rewrite3.1完整中文手册》可以用于iis中的wordpress,wp的url重写。并且是完整功能的。没有45天限制。lite版则不能用代理,location,等功能。先安装官方文件,再用复盖补丁文件夹下所有文件替换。替换时提示拒绝访问则需要先停止iisadmin。开始,运行net stop /y iisadmin再进行复...

推荐文章

热门文章

相关标签