疯狂的暑假学习之  汇编入门学习笔记 (十二)——  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: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
iret
sqrend:
nop code ends end start
assume cs:code

code segment
start:
mov ax,3
int 7ch
mov ax,4c00h
int 21h
code ends end start

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

assume cs:code

code segment

start:
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 21h change:
push cx
push si
s: mov ch,0
mov cl,ds:[si]
jcxz ok
and cl,11011111b
mov ds:[si],cl
inc si
jmp short s
ok:
pop si
pop cx
iret
changeend:
nop code ends end start
assume cs:code

data segment
db 'conversation',0
data ends code segment start:
mov ax,data
mov ds,ax
mov si,0
int 7ch mov ax,4c00h
int 21h code ends end start

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

assume cs:code

code segment

start:
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 21h lp:
push bp
mov bp,sp
dec cx
jcxz lpret
add [bp+2],bx
lpret:
pop bp
iret
lpend:
nop code ends end start
assume cs:code

code segment

start:
mov ax,0b800h
mov es,ax
mov di,160*12
mov bx,offset s - offset se
mov cx,80
s:
mov byte ptr es:[di],'!'
add di,2
int 7ch
se:
nop mov ax,4c00h
int 21h code ends end 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:code

code segment

start:
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 21h code ends end 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:code

data segment
db 'Welcome to masm!','$'
data ends code segment start:
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 ends end 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: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指令、port的更多相关文章

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

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

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

    http://blog.csdn.net/q_l_s/article/details/54909328

  3. 汇编入门学习笔记 (七)—— dp,div,dup

    疯狂的暑假学习之  汇编入门学习笔记 (七)--  dp.div.dup 參考: <汇编语言> 王爽 第8章 1. bx.si.di.和 bp 8086CPU仅仅有4个寄存器能够用 &qu ...

  4. 汇编入门学习笔记 (九)—— call和ret

    疯狂的暑假学习之  汇编入门学习笔记 (九)--  call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据 ...

  5. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  6. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  7. Java超简明入门学习笔记(二)

    Java编程思想第4版学习笔记(二) 第三章 操作符 & 第四章 控制执行流程(流程控制语句)         第三章和第四章的内容主要是讲操作符和流程控制语句,Java的大多数操作符和流程控 ...

  8. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

  9. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...

随机推荐

  1. Redis学习篇(九)之生存时间

    EXPIRE 设置生存时间,以秒为单位 #### EXPIREAT 设置生存时间,秒时间戳格式 #### PEXPIRE 设置生存时间,毫秒为单位 #### PEXPOREAT 设置生存时间,毫秒时间 ...

  2. [BZOJ4340][BJOI2015]隐身术(后缀数组)

    考虑到K很小,于是可以暴搜每次用的是哪种操作,跳过AB相等的字符可以用SA求LCP加速. 主要流程就是,枚举B的每个后缀,对每个后缀统计合法前缀个数.DFS搜索每次决策,用SA跳过相同字符,当A或B匹 ...

  3. BZOJ 4566 JZYZOJ 1547 [haoi2016T5]找相同子串 后缀数组 并查集

    http://172.20.6.3/Problem_Show.asp?id=1547 http://www.lydsy.com/JudgeOnline/problem.php?id=4566 单纯后缀 ...

  4. JBoss 7 配置成windows启动服务

    将Jboss7 server 配置成一个windows启动服务的两个文件,部署步骤如下: 1.    先检查是否配置java_home和jboss_home的环境变量,如没配置上先配置,如我的是JBO ...

  5. python开发_calendar

    如果你用过linux,你可能知道在linux下面的有一个强大的calendar功能,即日历 在python中,同样也有这样的一个强大的calendar 下面是我做的demo: #python中的cal ...

  6. [转]Intel haxm安装失败问题解决

    在安装Intel haxm为安卓模拟器加速时,会遇到提示VT-X未开启问题,问题提示如下图 工具/原料 Intel haxm 安卓模拟器 方法/步骤 1 确认你的处理器是否是Intel的,如果是AMD ...

  7. Java性能优化的9大工具

    在这篇文章中,我会带着大家一起看一下9个可以帮助我们优化Java性能的工具.有一些我们已经在IDR Solutions中使用了,而另外一些有可能在个人项目中使用. NetBeans Profiler ...

  8. HDU 4678 Mine (2013多校8 1003题 博弈)

    Mine Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  9. CMSIS-SVD Schema File Ver. 1.0

    <?xml version="1.0" encoding="UTF-8"?> <!-- date: 07.12.2011 Copyright ...

  10. MySQL MERGE存储引擎 简介

    MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询.构成一个MERGE数据表结构的各成员MyISAM数据表必须具有完全一样的结构.每一个成员数据表的数据列必 ...