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

参考: 《汇编语言》 王爽 第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:code  code segment start: mov ax,cs mov ds,ax mov si,offset sqr mov ax,0 mov es,ax mov di,200h mov cx,offset sqrend - offset sqr cld rep movsb mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 mov ax,4c00h int 21h sqr: mul ax iretsqrend: nop code ends  end start

assume cs:codecode segmentstart: mov ax,3 int 7ch mov ax,4c00h int 21hcode endsend start

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

assume cs:codecode segmentstart: mov ax,cs mov ds,ax mov si,offset change mov ax,0 mov es,ax mov di,200h mov cx,offset changeend - offset change cld rep movsb mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 mov ax,4c00h int 21hchange: push cx push sis: mov ch,0 mov cl,ds:[si] jcxz ok and cl,11011111b mov ds:[si],cl inc si jmp short sok: pop si pop cx iretchangeend: nop code endsend start

assume cs:codedata segment db 'conversation',0data endscode segmentstart: mov ax,data mov ds,ax mov si,0 int 7ch mov ax,4c00h int 21h code endsend start

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

assume cs:codecode segmentstart: mov ax,cs mov ds,ax mov si,offset lp mov ax,0 mov es,ax mov di,200h mov cx,offset lpend - offset lp cld rep movsb mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 mov ax,4c00h int 21hlp: push bp mov bp,sp dec cx jcxz lpret add [bp+2],bxlpret: pop bp iretlpend: nop code endsend start

assume cs:codecode segmentstart: mov ax,0b800h mov es,ax mov di,160*12 mov bx,offset s - offset se mov cx,80s: mov byte ptr es:[di],'!' add di,2 int 7chse: nop mov ax,4c00h int 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,2 mov bh,0 mov dh,5 mov dl,12 int 10h mov ah,9 mov al,'a' mov bl,11001010b mov bh,0 mov cx,3 int 10h mov ax,4c00h int 21hcode endsend start

int 21h中断

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

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

mov  ax,4c00hint 21h

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

本质就是:

mov ah,4chmov al,0int 21h

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

例子:

assume cs:codedata segment db 'Welcome to masm!','$'data endscode segmentstart: mov ah,2 mov bh,0 mov dh,5 mov dl,12 int 10h mov ax,data mov ds,ax mov dx,0    ;ds:dx指向字符串的首地址 data:0 mov ah,9 int 21h mov ax,4c00h int 21h code endsend start

二、端口

各种芯片(网卡,显卡等)都有一组可以由CPU读写的寄存器。CPU可以通过这些寄存器读取数据,或者操控芯片。CPU把这些寄存器当做端口,对这些寄存器进行统一编址。每个端口宅地址空间中都有一个地址。

1. in和out指令

访问端口用in和out

如果:

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

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

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

in al,20h

out 20h,al

对256~65535的端口进行读写时,端口号放在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存储器。

它有两个端口:

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

71h:读取内存单元

CMOS RAM中存储的时间信息

0:秒;2:分;

4:时;7:日;

8:月;9:年;

例子:在屏幕显示月份。

assume cs:code

code segment

start:

mov al,8

out 70h,al

in al,71h

mov ah,al

mov cl,4

shr ah,cl

and al,00001111b

add ah,30h ;'0' 的ASCII值

add al,30h

mov bx,0b800h

mov es,bx

mov byte ptr es:[160*12+40*2],ah

mov byte ptr es:[160*12+40*2+2],al

mov ax,4c00h

int 21h

code ends

end start

计算机指令int,汇编入门学习笔记 (十二)—— int指令、端口相关推荐

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

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

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

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

  3. 汇编入门学习笔记 (十二)—— int指令、port

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第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. 真的超越了波士顿动力!深度强化学习打造的 ANYmal 登上 Science 子刊
  2. 我用ASP.NET缓存之OutputCache
  3. .NET C#语言基础 20140814
  4. 协议开发 中移动CMPP2.0协议API(三)
  5. Hibernate 双向一对一实现(基于annotation)
  6. Linux下修改python pip镜像源:推荐豆瓣源
  7. UITableViewCell在非Nib及Cell重用下设置CellStyle
  8. Java快速入门学习笔记1 | Eclipse使用
  9. Spring-Bean配置-使用外部属性文件(转)
  10. mysql 认证介绍,MySQL认证介绍 (转帖)
  11. 短视频如何有效涨粉?三个小技巧来帮忙,吸粉引流也不难
  12. 一、云计算-云平台-国产-华为-FusionSphere+HCIE Cloud相关知识点+笔试题库
  13. U3D Distortion
  14. amazon s3cmd 安装、批量下载
  15. 微信小助手 for mac(WeChatPlugin)使用攻略
  16. java基于ssm的网上图书商城
  17. ERR Target instance replied with error: NOAUTH Authentication required
  18. 『强烈推荐2个网站』这才是Win10官方原版正确下载姿势
  19. 谷歌浏览器访问抖音网页版白屏
  20. 重磅!iPhone 13 型号曝光

热门文章

  1. (JAVA)String类之比较方法(2)
  2. 【算法设计与分析】09 递推方程与算法分析
  3. 【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析
  4. 【OS修炼指南目录】----《X86汇编语言-从实模式到保护模式》读书笔记目录表
  5. vertex shader(5)
  6. Ubuntu apache 禁止目录浏览
  7. Poj1207 The 3n + 1 problem(水题(数据)+陷阱)
  8. [原]2011年度生活三层总结
  9. (ZT)在日本市场推广 iPhone 应用的经验
  10. 微软企业库5.0学习笔记(三十三)数据访问模块