汇编入门学习笔记 (十二)—— int指令、端口
来源:互联网 发布:mac 强制关掉程序 编辑:程序博客网 时间:2024/06/10 21:36
疯狂的暑假学习之 汇编入门学习笔记 (十二)—— 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,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 axiretsqrend:nop code ends end start
assume cs:codecode segmentstart:mov ax,3int 7chmov ax,4c00hint 21hcode 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 sis:mov ch,0mov cl,ds:[si]jcxz okand cl,11011111bmov ds:[si],clinc sijmp short sok:pop sipop cxiretchangeend:nopcode endsend start
assume cs:codedata segmentdb 'conversation',0data 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],bxlpret:pop bpiretlpend:nopcode endsend start
assume cs:codecode segmentstart:mov ax,0b800hmov es,axmov di,160*12mov bx,offset s - offset semov cx,80s:mov byte ptr es:[di],'!'add di,2int 7chse: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,4c00hint 21h
其实这是用了21号中断例程的4ch号子程序,al是用来存放程序返回值的,上面的代码即0本质就是:
mov ah,4chmov al,0int 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
二、端口
各种芯片(网卡,显卡等)都有一组可以由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: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指令、端口
- 汇编入门学习笔记 (八)—— 转移指令
- [汇编学习笔记][第十三章int指令]
- 汇编入门学习笔记 (四)—— [BX] 和 loop指令
- 汇编入门学习笔记 (十)—— 标志寄存器、串传送指令
- 汇编(十二)——位操作类指令练习
- 内中断、int指令、端口 x86汇编
- 汇编学习--7.16--int指令
- 汇编入门学习笔记 (一)—— 基础知识、寄存器
- 汇编入门学习笔记 (十一)—— 内中段
- 汇编入门学习笔记 (十三)—— 外中断
- 汇编指令学习笔记(1)
- (学习笔记)ARM汇编指令集
- 汇编语言学习笔记(十三)int指令
- [bx]和 loop 指令——汇编学习笔记(六)
- X86汇编指令学习笔记
- Javascript学习笔记十二——Ajax入门
- 汇编学习笔记第11~13章:标志寄存器-内中断-int指令
- ubuntu无法解析主机错误与解决办法
- 多线程总结笔记
- 使用tcgetattr函数与tcsetattr函数控制终端
- sql查询模板
- Android开发之四大组件——Service
- 汇编入门学习笔记 (十二)—— int指令、端口
- POJ 2796Feel Good
- Struts2 OGNL 自己的一些笔记
- 真正的成功是熬出来的
- Session && Cookie
- 不要做一个浮躁的程序员
- 依赖倒转原则
- eclipse+selenium环境搭建
- atexit函数