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

疯狂的暑假学习之  汇编入门学习笔记 (十二)——  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中间件:淘宝网系统高性能利器

【TechTarget中国原创】淘宝网是亚太最大的网络零售商圈,其知名度毋庸置疑,吸引着越来越多的消费者从街头移步这里,成为其忠实粉丝。如此多的用户和交易量,也意味着海量的信息处理,其背后的IT架构的稳定性、可靠性也显…

@autowired注解 抽象类_别再用ifelse了,用注解去代替他吧

来自公众号:咖啡拿铁策略模式经常在网上看到一些名为“别再if-else走天下了”,“教你干掉if-else”等之类的文章,大部分都会讲到用策略模式去代替if-else。策略模式实现的方式也大同小异。主要是定义统一行为(接口或抽象类),并实现…

卸载mysql8.0卸载程序_程序卸载失败,来使用微软官方的Windows卸载工具试试

在我们实际的Windows操作系统使用中,总会遇到一些程序无法成功卸载的情况。当然,我们可以使用第三方软件来进行尝试卸载。要么,第三方软件会进行收费。要么,免费的会带给你捆绑软件的安装或者烦人的广告。还可能会造成系统文件的误…

Asterisk文件目录

目录 说明 /etc/asterisk Asterisk主目录,包含其它关于Asterisk的配置文件;  *zaptel.conf这个配置文件放在/etc,因为其它软件也可以使用Zaptel这个硬件及其驱动,所以不是放在/etc/asterisk里. /usr/lib/asterisk/modules 这个目录包含所有可以加载Asterisk模块(应用程序…

英特网rst服务器未在运行,技术员示范win7系统提示“英特尔(R)RST服务未在运行”的详细办法...

不知道大家有没有遇到过win7系统提示“英特尔(R)RST服务未在运行”的问题,最近有很多朋友来向我咨询win7系统提示“英特尔(R)RST服务未在运行”的问题如何解决,于是小编就个大家整理的win7系统提示“英特尔(R)RST服务未在运行”的解决步骤,就…

初识临时表

临时表就是那些名称以井号 (#) 开头的表。如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表。临时表不存储在当前数据库内,而是存储在系统数据库 tempdb 内。 创建临时表有多种方法。其一,先创建表结构,跟创建普…

小米手机电池恢复代码_解决小米手机屏幕问题的方法

屏幕在我们的小米手机中永远不会失败,因为没有它,我们将无法使用可用的应用程序和功能。为了帮助大家,我们汇总了小米和Redmi手机中最常见的问题,为您提供了针对我们所面临的每种情况的解决方案。MIUI定制层汇集了适用于小米手机的…

Asterisk拨号方案语法基础

Asterisk语法基础 extensions.conf(四部分:context,extension,priorities,application) context:用于对extensions组命名,把拨号方案的不同部分进行分离,免得交织在一起。 表示方法是把名字放在[]的中间,名字只能用a~z,A~Z,0~9,以及连字号和下划线组成(空格不在允许的字符里…

使用promise解决回调地狱_「每日一题」Promise 是什么?

window.Promise 已经是 JS 的一个内置对象了。1. Promise 有规格文档吗?2. 你一般如何使用 Promise。-----------目前的 Promise 都遵循 Promises/A 规范。英文规范:https://promisesaplus.com/中文翻译:图灵社区 : 阅读 : 【翻译】Promises/…

应用css div进行页面布局设计,利用CSS与DIV进行页面布局.ppt

《利用CSS与DIV进行页面布局.ppt》由会员分享,可在线阅读,更多相关《利用CSS与DIV进行页面布局.ppt(6页珍藏版)》请在人人文库网上搜索。1、利用CSS与DIV进行页面布局,学习目标:,理解CSSDIV网页布局的含义掌握网页结构的规划掌握CSS样式的创建…

【原】winform高效导出Excel带格式设置

参考网上的方法修改,1000条记录导出只要3S(1GRDM,C2.8CPU).1.项目添加excel对象类库的引用,Microsoft Excel 11.0 object library(不同版本的Excel,类库不同,这是2003的) 2.代码1//-…

vscode 逗号不换行_来自一个插件的疯狂夸赞,VS Code「彩虹屁」插件问世,网友:我想要郭德纲版...

听说有人开发了「虚拟程序员鼓励师」,安装使用后的我疯狂捶墙,导致我家变成了单间。机器之心报道,机器之心编辑部。你可能从未想过,会有这么一个人:对你写的每一行代码都不吝夸赞,知道你什么时候想骂人&…

Asterisk拨号方案中变量的应用

在拨号方案中使用变量可以减少打字、增加清晰度,也有助于在拨号方案中加入逻辑. 这里的变量有全局变量,通道变量和环境变量。 1.全局变量 全局变量应该在extensions.conf文件的开始利用[globals]这个context定义或利用 SetGlobalVar()应用.如: [globals] 80000Zap/1或 [inter…

电压源和电流的关联参考方向_结点电压法解题系列之四:电流源支路

利用结点电压法求解时,有的结点之间连接的是电流源支路。如图1所示电路中,结点2与参考结点4之间连接的是5A电流源。对结点2列写标准形式KCL,或直接利用KCL列出结点电压方程,都很容易,也不易出错。只需要注意&#xff1…

狼人杀服务器紧急维护中,狼人杀最可怕的武器是那张嘴?禁言长老:你已被管理员禁言一天!...

语言的能力有多强?不论是用来攻击对手,或是讨好他人,讽刺或是欺骗,语言有着神秘的力量,仿佛能够颠倒黑白。对于那些"口吐芬芳"的人,更是恨不得在他嘴上贴个封条,让他好好安静一会。相…

炎炎夏日需要一个清凉的地 - 自制水冷系统(十一 指尖的思绪之程序篇)

前段时间接手了一个项目,所以DIY的进程有些停滞。实际编写的程序并没有多长时间,得益于Keil这个强大的IDE。能在第一次做51开发的时候,如此顺利的完成代码。不多说废话了,说明下代码的具体思路。具体思路根据(八 系统设…

wordpress 后台慢_建站经验-wordpress用户注册收不到验证邮件

背景我的一个博客http://axuretop.com,已经在后台开放注册了,注册用户默认为“订阅者”。一旦发布新的文章,会订阅邮件给用户。后台有300多个订阅用户,但是发现评论文章的很少,严重怀疑他们无法订阅我的文章&#xff0…

SIP.conf的常用参数配置

sip.conf Sip.conf 用于配置SIP通道。 [1005]------------------------------------------------------ 拨号方案实例 username1005----------------------------------------- 用户名typefriend----------------------------------------------- 类型,友好secret…

ai字体行间距怎么调整_字体基础知识(一)

本期教程主要讲解字体基础知识:字体、字号、字形、字重、行高、行距、字间距、字偶间距。本文所用软件为Microsoft PowerPoint 2013。1 字体文字的风格样式,就是我们平时常说的黑体、宋体、楷体、Segoe UI Black、Courier New、Consolas。如下图所示&…

免费的crm系统部署在自己的服务器,crm系统本地部署与云端部署的区别

CRM系统的部署方式通常有三种模式,分别是:本地部署、云端部署、公有云部署等三种模式。通常企业在选择的部署方式是本地部署与云端部署。那么他们部署方式得区别是什么?本地部署CRM系统本地部署的CRM软件:是意味着保存在企业自身的服务器中。…