疯狂的暑假学习之  汇编入门学习笔记 (十二)——  int指令、port

參考: 《汇编语言》 王爽 第13、14章

一、int指令

1. int指令引发的中断

int n指令,相当于引发一个n号中断。

运行过程相当于:

(1)取中断类型吗n。

(2)标志寄存器入栈;设置IF=0,TF=0。

(3)CS,IP入栈

(4)(IP)=(n*4),(CS)=(n*4+2)

样例1:编写、安装中断7ch。实现求一个word型数据的平方,用ax存放这个数据。

 assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset sqrmov ax,0mov es,axmov di,200hmov cx,offset sqrend - offset sqrcldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hsqr:mul axiret
sqrend:nopcode endsend start
assume cs:codecode segment
start:  mov ax,3int 7chmov ax,4c00hint 21h
code endsend start

样例2:编写、安装7ch中断。实现将data段中的字符串转化为大写。

assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset changemov ax,0mov es,axmov di,200hmov cx,offset changeend - offset changecldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hchange:push cxpush si
s:  mov ch,0mov cl,ds:[si]jcxz okand cl,11011111bmov ds:[si],clinc sijmp short s
ok:pop sipop cxiret
changeend:nopcode endsend start
assume cs:codedata segmentdb 'conversation',0
data endscode segmentstart:mov ax,datamov ds,axmov si,0int 7chmov ax,4c00hint 21hcode endsend start

样例3:使中断7ch实现loop指令的功能。

assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset lpmov ax,0mov es,axmov di,200hmov cx,offset lpend - offset lpcldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hlp:push bpmov bp,spdec cxjcxz lpretadd [bp+2],bx
lpret:pop bpiret
lpend:nopcode endsend start
assume cs:codecode segmentstart:mov ax,0b800hmov es,axmov di,160*12mov bx,offset s - offset semov cx,80
s:  mov byte ptr es:[di],'!'add di,2int 7ch
se: nopmov ax,4c00hint 21hcode endsend start

2. BIOS和DOS的中断例程

BIOS中主要包括:

(1)硬件系统的检測和初始化程序

(2)外部中断和内部中断的中断例程

(3)用于对硬件设备进行I/O操作的中断例程

(4)其它和硬件系统相关的中断例程

BIOS和DOS提供的中断例程安装过程

(1)开机。初始化CS=0FFFFH。IP=0,运行FFFF:0程序。FFFF:0程序有一条跳转指令。运行完后。CPU会去运行BIOS中的硬件系统检測和初始化程序。

(2)初始化程序将建立BIOS所支持的中断向量。即将BIOS中提供的中断例程的入口地址登记在中断向量表中。注意:BIOS所提供的中断例程。仅仅须要将入口地址登记在中断向量表中就可以,由于它们是固化在ROM中的。

(3)硬件系统检測和初始化完毕后,调用int 19h进行操作系统的引导。从此将计算机交给操作系统控制

(4)DOS启动后,除了完毕其它工作外,还将他所提供的中断例程装入内存中。并建立对应的中断向量。

一般来说。一个中断例程包括了多个子程序,用ah来传递内部子程序的编号

int 10h中断

它是BIOS提供的中断例程,当中包括了多个和屏幕输出有关的子程序

ah=2   设置光标位置,此时bh存放 第几页;dh存放行号;dl存放列号

ah=9  在光标位置显示字符,此时al存放字符;bl存放颜色属性;bh存放第几页。cx存放这个字符反复显示几

样例:

assume cs:codecode segmentstart:mov ah,2mov bh,0mov dh,5mov dl,12int 10hmov ah,9mov al,'a'mov bl,11001010bmov bh,0mov cx,3int 10hmov ax,4c00hint 21hcode endsend start

int 21h中断

它是DOS提供的中断例程,包括了DOS提供给程序猿在编程时调用的子程序。

前面我们一直用以下的代码返回

mov  ax,4c00h
int 21h

事实上这是用了21号中断例程的4ch号子程序,al是用来存放程序返回值的,上面的代码即0

本质就是:

mov ah,4ch
mov al,0
int 21h

21h号中断例程的9号子程序功能是在光标位置显示字符串,用ds:dx指定字符串的首地址,字符串要以‘$’结尾

样例:

assume cs:codedata segmentdb 'Welcome to masm!','$'
data endscode segmentstart:mov ah,2mov bh,0mov dh,5mov dl,12int 10hmov ax,datamov ds,axmov dx,0    ;ds:dx指向字符串的首地址 data:0mov ah,9int 21hmov ax,4c00hint 21hcode endsend start

二、port

各种芯片(网卡,显卡等)都有一组能够由CPU读写的寄存器。CPU能够通过这些寄存器读取数据,或者操控芯片。

CPU把这些寄存器当做port,对这些寄存器进行统一编址。

每一个port宅地址空间中都有一个地址。

1. in和out指令

訪问port用in和out

假设:

in al,60h  ; 从60hport读取数据放到al中

注意:仅仅能用ax或者al来存放从port中读入的数据或要发送到port的数据。

对0~255以内的port进行读写时:

in al,20h

out 20h,al

对256~65535的port进行读写时,port号放在dx中:

mov dx,3f8h

in al.dx

ou dx,al

2. shl和shr指令

shl:左移指令,最低位补0,将移出的追后以为写入CF中

假设是移1位就:

shl  al,1

假设移动大于1位,必须将移动的位数放在cl中

mov cl,3

shl al,cl

shr是右移。其它与shl一样

3. CMOS RAM芯片

PC中有一个靠电池供电CMOS RAM芯片,它包括一个实时种和一个有128个存储单元的RAM存储器。

它有两个port:

70h:保存要读取内存单元的地址

71h:读取内存单元

CMOS RAM中存储的时间信息

0:秒。2:分。

4:时;7:日。

8:月;9:年;

样例:在屏幕显示月份。

assume cs:codecode segmentstart:mov al,8out 70h,alin al,71hmov ah,almov cl,4shr ah,cland al,00001111badd ah,30h   ;'0' 的ASCII值add al,30hmov bx,0b800hmov es,bxmov byte ptr es:[160*12+40*2],ahmov byte ptr es:[160*12+40*2+2],almov ax,4c00hint 21hcode endsend start

汇编入门学习笔记 (十二)—— int指令、port相关推荐

  1. 汇编语言学习笔记(十二)-浮点指令

    浮点数如何存储 浮点寄存器 浮点数指令 浮点计算例子 浮点高级运算 CMOV移动指令 浮点数如何存储 浮点数的运算完全不同于整数,从寄存器到指令,都有一套独特的处理流程,浮点单元也称作x87 FPU. ...

  2. SQLite学习笔记(十二)虚拟机指令

    上篇文章简单讨论了虚拟机的原理,这篇文章我们详细讨论下指令,具体从几种典型的SQL语句来看看每种SQL对应的指令流,以及每个指令的含义.通过explain语句,可以看到语句对应的指令流:通过pragm ...

  3. 计算机指令int,汇编入门学习笔记 (十二)—— int指令、端口

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.端口 参考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引发一 ...

  4. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  5. 吴恩达《机器学习》学习笔记十二——机器学习系统

    吴恩达<机器学习>学习笔记十二--机器学习系统 一.设计机器学习系统的思想 1.快速实现+绘制学习曲线--寻找重点优化的方向 2.误差分析 3.数值估计 二.偏斜类问题(类别不均衡) 三. ...

  6. ROS学习笔记十二:使用roswtf

    ROS学习笔记十二:使用roswtf 在使用ROS过程中,roswtf工具可以为我们提供ROS系统是否正常工作的检查作用. 注意:在进行下列操作之前,请确保roscore没有运行. 检查ROS是否安装 ...

  7. Polyworks脚本开发学习笔记(十二)-输出和读取文本文件

    Polyworks脚本开发学习笔记(十二)-输出和读取文本文件 Polyworks作为一个测量工具,将测量的数据方便的导出到文本文件则是一项必须的功能.在DATA_FILE这个命令下提供了很多子命令用 ...

  8. AUTOCAD2020入门学习笔记(二)

    AUTOCAD2020入门学习笔记(二) 前言 一.快捷键 1.F1~F11 2.基础快捷键 3.尺寸标注快捷键 4.绘图快捷键 二. 练习图 三.总结 前言 上一节小白小哥和大家分享了AutoCAD ...

  9. OpenCV学习笔记(十二)——图像分割与提取

    在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...

最新文章

  1. Android 解决Android的TextView和EditText换行问题
  2. silverlight后台加载本地图片
  3. mx51 uboot启动感悟
  4. html制作主体部分,html – 使用CSS制作具有动态面板主体高度的面板填充父容器高度的其余部分...
  5. BERT, ELMo, GPT-2: 这些上下文相关的表示到底有多上下文化?
  6. OpenCV中cornerSubPixel()亚像素求精原理
  7. BetterScroll、移动端、滚动事件,如何使用
  8. php if多条件_通过PHP与Python代码对比浅析语法差异
  9. Spring boot admin 使用
  10. dropload 使用表
  11. win7文件夹加密软件_winRAR去广告版软件安装教程
  12. 处理机调度之时间片轮转调度算法实现
  13. 软件测试电脑内存适配,利用Memtest86 测试你电脑的内存
  14. html 实现b站弹幕,可实现B站 蒙版弹幕 效果的前端组件 —— Barrage UI
  15. enterprise architect 小实验
  16. 电路定理——替代定理
  17. 高盛报告:未来5-10年区块链将被广泛应用【附下载】
  18. MATLAB实现混淆矩阵
  19. 重疾险和医疗险的对比
  20. 免费实现音乐文件转换:将下载的音乐转换为MP3格式

热门文章

  1. cordova使用Gradle构建下载maven太慢,使用阿里云镜像
  2. windows和centos进行文件上传和下载
  3. 图论相关算法理解和总结
  4. VirtualBox中出现UUID have already exists 解决方法
  5. 网站外链数量的变化可以从哪几点去理解
  6. Windows、Linux系统安装JDK配置Java环境变量
  7. Skybox边线消除的解决办法
  8. Nginx负载均衡实现之四层与七层负载
  9. 什么是bean的生命周期?
  10. 数组动态初始化【应用】