• 依次显示’a’ - ‘z’

    • 无法看清屏幕显示,同一位置显示字母,字母切换太快
    • 在显示一个字母后,延时一段时间
assume cs:code
code segment
start:mov ax,0b800hmov es,axmov ah,'a's:mov es:[160*12+40*2],al;让CPU执行一段时间空循环mov dx,10hmov ax,0s0:sub ax,1sbb dx,0cmp ax,0jne s0cmp dx,0jne s0inc ahcmp ah,'z'jna smov ah,4chint 21h
code ends
end start
  • 执行1,000,000h次用两个16位寄存器存放32位的循环次数
  • 子程序调用版本
assume cs:codestack segmentdb 128 dup(0)
stack endscode segment
start:mov ax,stackmov ss,axmov sp,128;显示字符mov ax,0b800hmov es,axmov ah,'a's:mov es:[160*12+40*2],ahcall delayinc ahcmp ah,'z'jna smov ah,4chint 21h
;定义延时函数
delay:push axpush dxmov dx,10hmov ax,0s1:sub ax,1sbb dx,0cmp ax,0jne s1cmp dx,0jne s1pop dxpop axret
code ends
end start

  • 按下esc键,改变显示颜色

    • 原理:键盘输入到达60H端口后,就会引发9号中断,CPU则转去执行int 9中断例程
  • 编写int 9中断例程改变显示颜色

    • 从60h端口读出键盘输出IN AL,60H
    • 调用BIOS的int 9中断例程,处理硬件细节
      • 关于中断处理程序入口地址面对的问题
      • 要将中断向量表的int 9中断例程的入口地址改为自编的中断处理程序的入口地址
      • 在新中断处理程序中调用原来的int 9 中断例程,还需要是原来的int 9中断例程的地址
      • 解决方法:保留原中断例程入口地址
      • 在原来int 9中断例程的地址的偏移地址和段地址保存在ds:[0]和ds:[2]的单元中,需要调用原来的int 9 中断例程的时候,到ds:[0]和ds:[2]找到
mov ax,0
mov es,ax
push es:[9*4]
pop ds:[0]
push es:[9*4+2]
pop ds:[2]mov word ptr es:[9*4],offset int9
mov es:[9*4+2],cs
  • 如何调用原int 9指令的中断例程

    • int 9已改,但仍然需要调用原int 9指令功能
    • 解决方法:模拟对原中断例程的调用
      • 标志寄存器入栈
      • IF = 0 TF = 0
      • CS和IP入栈
      • (IP) = ((DS) *16 + 0) (CS) = ((DS) *16 + 2)
pushf
pop ax
and ah,11111100b;改变IF和TF
push ax
popf
call dword ptr ds:[0]
  • 判断是否为esc的扫描码,如果是,改变显示的颜色后返回;如果不是直接返回
assume cs:codestack segmentdb 128 dup(0)
stack endsdata segmentdw 0,0
data endscode segment
start:mov ss,axmov sp,128mov ax,datamov ds,ax;改中断例程入口地址mov ax,0mov es,axpush es:[9*4]pop ds:[0]push es:[9*4+2]pop ds:[2]mov word ptr es:[9*4],offset int9mov es:[9*4+2],cs;显示'a'~'z'mov ax,0b800hmov es,axmov ah,'a's:mov es:[160*12+40*2],ahcall delayinc ahcmp ah,'z'jna s;恢复原来地址push ds:[0]push es:[9*4]push ds:[2]push es:[9*4+2]mov ah,4chint 21h
;定义延时函数
delay:push axpush dxmov dx,10hmov ax,0s1:sub ax,1sbb dx,0cmp ax,0jne s1cmp dx,0jne s1pop dxpop axret
;定义中断程序
int9: push axpush bxpush esin al,60hpushf pushf pop bxand bh,11111100bpush bxpopfcall dword ptr ds:[0];原有中断例程cmp al,1;ESC扫描码jne int9ret;改变颜色mov ax,0b800hmov es,axinc byte ptr es:[160*12+40*2+1];字符属性
int9ret:pop espop bxpop axiret
code ends
end start

贺利坚老师汇编课程74笔记:按下esc键改变显示颜色相关推荐

  1. 贺利坚老师汇编课程73笔记:键盘输入的处理过程

    指路老师的博客 键盘的每一个键相当于一个开关,键盘中有一个芯片对键盘的每一个键的开关状态进行扫描 按下一个键的操作 开关接通,该芯片就产生了一个扫描码,扫描码说明按下的键在键盘的位置 扫描码被送入主板 ...

  2. 贺利坚老师汇编课程40笔记:指令里的数据在哪里有多长

    指路老师的博客 汇编中数据位置的表达 立即数 寄存器 内存:段地址SA+偏移地址EA 指令处理数据长度 字操作WORD16位 字节操作BYTE8位 用word ptr或byte ptr指明 示例 操作 ...

  3. 贺利坚老师汇编课程28笔记:使用附加段寄存器ES进行拷贝

    指路老师的博客链接 将内存FFFF:0 ~ FFFF:B中的数据拷贝到0:200~0:20b单元中 段地址每循环一次变一次的初始方案 ;初始方案 ASSUME CS:CODE CODE SEGMENT ...

  4. 贺利坚老师汇编课程70笔记:端口的读写

    指路老师的博客 端口对应外部设备 发声程序 assume cs:codecode segment start:mov al,08h;设置声音频率out 42h,alout 42h,alin al,61 ...

  5. 贺利坚老师汇编课程66笔记:自定义除法中断学习如何编制中断程序

    指路老师的博客 CPU随时可能检测中断信息,所以中断程序常驻内存(一直存储在内存的某段空间中) 中断处理程序的入口地址,即中断向量,必须存储在中断向量表的表项中 (0000:0000 - 0000:0 ...

  6. 贺利坚老师汇编课程61笔记:操作显存数据即在屏幕上显示

    指路老师的博客 屏幕上内容 = 显存数据 B8000H~BFFFFH共32K空间时80 * 25(25行80列)彩色字符模式,第0页的显示缓冲区 编程序在屏幕的中间,白底蓝字,显示"Welc ...

  7. 贺利坚老师汇编课程60笔记:逻辑移位指令shl和shr

    指路老师的博客 逻辑左移 SHL OPR,CNT 将OPR逻辑左移CNT位 将寄存器或内存单元中的数据向左移位 将最后移出的一位写入CF 最低位用0补充 移动位数大于1时必须用CL MOV AL,01 ...

  8. 贺利坚老师汇编课程57笔记:CMP和JXXX配合实现条件转移指令if

    指路老师的博客 实现分支程序设计 套路 CMP OPER1,OPER2;或者其他影响标志寄存器的指令 JXXX 标号 恐惧 JXXX系列指令和CMP指令配合,构造条件转移指令 不必考虑CMP指令对相关 ...

  9. 贺利坚老师汇编课程56笔记:CMP指令

    指路老师的博客 CMP 操作对象1,操作对象2;计算操作对象1-操作对象2 CMP是比较指令,功能相当于减法指令,只是不保存结果 CMP指令执行后,将对标志寄存器产生影响 其他指令通过识别这些被影响的 ...

最新文章

  1. CAXA电子图板2020中文版
  2. 记一次内核模块查看 - 初步通过文件厂商判断有无可疑内核模块
  3. 来自闪闪宝石的光芒 - “宝石迷阵” x 信息检索 | 论文访谈间 #20
  4. Ext.form 表单为什么第二次就不正常显示
  5. python -asyncio
  6. Cocos2d-x Win7环境编译apk
  7. 使用sqoop将HIVE中的数据输出带Mysql中
  8. python比较运算符重载_python运算符重载
  9. php qmqp 没有方法,CentOS7 php 安装 amqp扩展
  10. 产品经理须知 | API接口知识小结
  11. ​百度网盘下线SVIP免第三方广告特权;小米回应手机异常发热;Windows 11新应用商店将于6月24日亮相|极客头条...
  12. Oracle的三种高可用集群方案
  13. 安装floodlight遇到的问题和解决
  14. 努力在html中适配图片尝试失败
  15. html5实现统计功能,基于HTML5的统计图表系统的设计与实现
  16. 七种应刻意训练的顶级思维方法
  17. matlab eig函数_MATLAB作图实例:14:绘制虚数和复数图
  18. 社交电商快速吸粉裂变模式-全新拼团模式
  19. FW:维度打击,机器学习中的降维算法:ISOMAP  MDS_拔剑-浆糊的传说_新浪博客...
  20. 实用的电脑快捷键技巧,赶紧收藏!

热门文章

  1. 中职计算机英语课件ppt,语文版中职英语(基础模块 上册)Unit 7《Computers》ppt课件1.ppt...
  2. 软件版本控制Subversion和Git
  3. 多级三目运算符的判断
  4. hbase1.1.1 连接集群_HBase-1.2.1集群搭建
  5. 【深度优先搜索】计蒜客:等边三角形
  6. 【python笔记】入门练手的题
  7. php get 传循环出来的参数_简单学习PHP中的反射
  8. json取数据怎么取_灯罩怎么取下来 各种吸顶灯的灯罩拆卸方法
  9. JavaScript文档对象模型document对象查找Html元素(2)
  10. linux装系统到u盘,萌新的Linux之路(1):安装Linux系统到U盘