汇编入门学习笔记 (十二)—— int指令、port
疯狂的暑假学习之 汇编入门学习笔记 (十二)—— 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相关推荐
- 汇编语言学习笔记(十二)-浮点指令
浮点数如何存储 浮点寄存器 浮点数指令 浮点计算例子 浮点高级运算 CMOV移动指令 浮点数如何存储 浮点数的运算完全不同于整数,从寄存器到指令,都有一套独特的处理流程,浮点单元也称作x87 FPU. ...
- SQLite学习笔记(十二)虚拟机指令
上篇文章简单讨论了虚拟机的原理,这篇文章我们详细讨论下指令,具体从几种典型的SQL语句来看看每种SQL对应的指令流,以及每个指令的含义.通过explain语句,可以看到语句对应的指令流:通过pragm ...
- 计算机指令int,汇编入门学习笔记 (十二)—— int指令、端口
疯狂的暑假学习之 汇编入门学习笔记 (十二)-- int指令.端口 参考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引发一 ...
- Python语言入门这一篇就够了-学习笔记(十二万字)
Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...
- 吴恩达《机器学习》学习笔记十二——机器学习系统
吴恩达<机器学习>学习笔记十二--机器学习系统 一.设计机器学习系统的思想 1.快速实现+绘制学习曲线--寻找重点优化的方向 2.误差分析 3.数值估计 二.偏斜类问题(类别不均衡) 三. ...
- ROS学习笔记十二:使用roswtf
ROS学习笔记十二:使用roswtf 在使用ROS过程中,roswtf工具可以为我们提供ROS系统是否正常工作的检查作用. 注意:在进行下列操作之前,请确保roscore没有运行. 检查ROS是否安装 ...
- Polyworks脚本开发学习笔记(十二)-输出和读取文本文件
Polyworks脚本开发学习笔记(十二)-输出和读取文本文件 Polyworks作为一个测量工具,将测量的数据方便的导出到文本文件则是一项必须的功能.在DATA_FILE这个命令下提供了很多子命令用 ...
- AUTOCAD2020入门学习笔记(二)
AUTOCAD2020入门学习笔记(二) 前言 一.快捷键 1.F1~F11 2.基础快捷键 3.尺寸标注快捷键 4.绘图快捷键 二. 练习图 三.总结 前言 上一节小白小哥和大家分享了AutoCAD ...
- OpenCV学习笔记(十二)——图像分割与提取
在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...
最新文章
- Android 解决Android的TextView和EditText换行问题
- silverlight后台加载本地图片
- mx51 uboot启动感悟
- html制作主体部分,html – 使用CSS制作具有动态面板主体高度的面板填充父容器高度的其余部分...
- BERT, ELMo, GPT-2: 这些上下文相关的表示到底有多上下文化?
- OpenCV中cornerSubPixel()亚像素求精原理
- BetterScroll、移动端、滚动事件,如何使用
- php if多条件_通过PHP与Python代码对比浅析语法差异
- Spring boot admin 使用
- dropload 使用表
- win7文件夹加密软件_winRAR去广告版软件安装教程
- 处理机调度之时间片轮转调度算法实现
- 软件测试电脑内存适配,利用Memtest86 测试你电脑的内存
- html 实现b站弹幕,可实现B站 蒙版弹幕 效果的前端组件 —— Barrage UI
- enterprise architect 小实验
- 电路定理——替代定理
- 高盛报告:未来5-10年区块链将被广泛应用【附下载】
- MATLAB实现混淆矩阵
- 重疾险和医疗险的对比
- 免费实现音乐文件转换:将下载的音乐转换为MP3格式