博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汇编入门学习笔记 (十二)—— int指令、port
阅读量:6438 次
发布时间:2019-06-23

本文共 3912 字,大约阅读时间需要 13 分钟。

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

二、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,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 21hcode endsend start

转载地址:http://xlzwo.baihongyu.com/

你可能感兴趣的文章
Python菜鸟之路:Python基础-Python操作RabbitMQ
查看>>
字符串文档的去重
查看>>
打印a*a的乘法表
查看>>
String、StringBuffer、StringBuilder区别
查看>>
Android--批量插入数据到SQLite数据库
查看>>
LeetCode算法题-K-diff Pairs in an Array(Java实现)
查看>>
[问题解决]基于注解配置dubbo遇到ConnectionLoss for /dubbo/xxx问题解决
查看>>
读《嵌入式系统项目分析入门与实践》⑤
查看>>
自动化Cobbler安装
查看>>
深度解析 TypeConverter & TypeConverterAttribute (二)
查看>>
STP生成树算法
查看>>
nginx常用配置
查看>>
英语考试(最小生成树)
查看>>
JS数组操作
查看>>
设置组件局部样式原理-属性选择器
查看>>
慕课-北京理工大学 机器学习 大学生上网时间 聚类,小白学习
查看>>
实用算法实现-第6篇 线段树
查看>>
webclientt和httpwebrequest
查看>>
第一个C#控制台程序
查看>>
python练习---购物车
查看>>