格式

int指令也是一种内中断指令,int指令的格式为int n,n是中断类型码。也就是说,使用int指令可以调用任意的中断例程,例如我们可以显示的调用0号中断例程,还记得在汇编学习笔记(10)中我们自己定义了除法溢出的例程么,我们在这里直接调用看看

 assume cs:codesg

 codesg segment

 start:
mov ax,0b800h
mov es,ax
mov byte ptr es:[*+*],'h'
int codesg ends end start

成了,perfect!

既然可以随时随地的调用中断例程,那么就可以借助中断例程来完成一些系统必须的子程序,下面是书上的例子,当次搬运工

 ;编写7ch号中断例程,计算word型数据的平方
assume cs:codesg codesg segment start:
;ds:si指向sqr
mov ax,cs
mov ds,ax
mov si,offset sqr
;es:di指向0000:01e0
mov ax,
mov es,ax
mov di,01e0h
;安装
mov cx,offset sqrend-offset sqr
cld
rep movsb
;设置中断向量表
mov ax,
mov es,ax
mov word ptr es:[7ch*],01e0h
mov word ptr es:[7ch*+],
mov ax,
int 7ch mov ax,4c00h
int 21h
sqr:
mul ax
iret
sqrend:
nop codesg ends end start

 ;编写7ch号中断例程,将字符串全部转换为大写
assume cs:codesg,ds:data
data segment
db 'h',
data ends
codesg segment start:
;ds:si指向sqr
mov ax,cs
mov ds,ax
mov si,offset upper
;es:di指向0000:01e0
mov ax,
mov es,ax
mov di,01e0h
;安装
mov cx,offset upperend-offset upper
cld
rep movsb
;设置中断向量表
mov ax,
mov es,ax
mov word ptr es:[7ch*],01e0h
mov word ptr es:[7ch*+],
mov ax,data
mov ds,ax
mov si,
mov cl,
;显示原始字符串
call display
;调用中断程序
int 7ch
;大写
call upper
mov cl,
;显示改写后的字符串
call display mov ax,4c00h
int 21h
upper:
push cx
push si
change:
mov cl,[si]
mov ch,
jcxz s0
and byte ptr [si],11011111b
inc si
jmp short change
s0:
pop si
pop cx
iret
upperend:
nop display:
push ax
push es
push di
push si
push cx
mov ax,0b800h
mov es,ax
mov ax,
mul cl
add ax,
mov di,ax
mov ch,
s1:
mov cl,ds:[si]
jcxz ok
mov byte ptr es:[di],cl
add di,
inc si
jmp short s1
ok:
pop cx
pop si
pop di
pop es
pop ax
ret
codesg ends end start

中断例程实现loop指令

中断例程实现loop指令需要完成以下功能:

1.(cx)=(cx)-1
  2.如果(cx)!=0,循环执行,否则向下继续执行

为了完成上述的两种功能,显然中断例程必须获取cs和ip的值。因调用中断例程是现将cs、ip入栈,所以只需将ip的值减去循环体的长度就可以了

 assume cs:code

 code segment

 start:
mov ax,cs
mov ds,ax
mov si,offset looper
mov ax,01e0h
mov es,ax
mov di,
mov cx,offset l-offset looper
cld
rep movsb
mov ax,
mov es,ax
mov word ptr es:[7ch*],01e0h
mov word ptr es:[7ch*+],
mov ax,0b800h
mov es,ax
mov di,*
mov bx,offset s-offset send
mov cx,
s:
mov byte ptr es:[di],'!'
add di,
int 7ch
send:
nop
mov ax,4c00h
int 21h looper:
push bp
mov bp,sp
dec cx
jcxz loopend
add [bp+],bx
loopend:
pop bp
iret
l:
nop
code ends end start

BIOS提供的中断例程

BIOS提供了很多中断例程以供调用,下面举个显示字符串的例子,int 10h例程中的9号子程序

 assume cs:code

 code segment

 start:
mov ah,
mov bh,
mov dh,
mov dl,
int 10h mov ah,
mov al,'a'
mov bl,11001010b
mov bh,
mov cx,
int 10h
mov ax,4c00h
int 21h
code ends end start

端口的读写

端口的读写只有两种指令和寄存器可以使用

  • in 读入指令,in al 读入8位数据;in ax 读入16位数据
  • out 写入指令,out al 对端口写入8位数据;out ax写入16位数据

CMOS RAM芯片

CMOS芯片包含两个端口70h和71h,70h是地址端口,71h是数据端口,从CMOS RAM中读取2号单元内容程序如下

 assume cs:code

 code segment

 start:
mov al,
out 70h,al ;表示要读取2号单元
in al,71h;读取2号单元内容 mov ax,4c00h
int 21h
code ends end start

写入的是这样

 assume cs:code

 code segment

 start:
mov al,
out 70h,al ;表示要写入2号单元
mov al,
out 71h,al;写入0 mov ax,4c00h
int 21h
code ends end start

shl和shr指令

shl是逻辑左移指令,shr是逻辑右移指令。左移的最低位和右移的最高位都用0补充,并将移出的最后一位写入CF中,不论左移还是右移,都是从最低位开始的。

mov al,10010000
  shl al,1
  shr al,1

左移后(al)=00100000 CF=1,右移后(al)=00010000 CF=0.左移一位相当于x=x*2,右移一位相当于x=x/2.

显示时间

 assume cs:code,ds:data

 data segment
db 'yy/mm/dd hh:mm:ss','$'
index db ,,,,,
data ends code segment start:
mov ax,data
mov ds,ax
mov si,
mov di,
mov cx,
s:
push cx
;获取需要读取的端口地址
mov al,index[si]
out 70h,al
in al,71h mov ah,al
mov cl,
;取得十位
shr ah,cl
;个位
and al,00001111b
;转为字符
add ah,30h
add al,30h mov ds:[di],ah
mov ds:[di+],al inc si
add di, pop cx
loop s
;光标显示位置
mov ah,
mov bh,
mov dh,
mov dl,
int 10h
;显示ds:dx指向的字符串
mov ax,data
mov ds,ax
mov dx,
mov ah,
int 21h mov ax,4c00h
int 21h
code ends end start

汇编学习笔记(11)int指令和端口的更多相关文章

  1. Ext.Net学习笔记11:Ext.Net GridPanel的用法

    Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...

  2. 并发编程学习笔记(11)----FutureTask的使用及实现

    1. Future的使用 Future模式解决的问题是.在实际的运用场景中,可能某一个任务执行起来非常耗时,如果我们线程一直等着该任务执行完成再去执行其他的代码,就会损耗很大的性能,而Future接口 ...

  3. 《C++ Primer Plus》学习笔记11

    <C++ Primer Plus>学习笔记11 第17章 输入.输出和文件 <<<<<<<<<<<<<< ...

  4. JVM学习笔记——字节码指令

    JVM学习笔记——字节码指令 字节码 0与 1是计算机仅能识别的信号,经过0和1的不同组合产生了数字之上的操作.另外,通过不同的组合亦产生了各种字符.同样,可以通过不同的组合产生不同的机器指令.在不同 ...

  5. SQL反模式学习笔记11 限定列的有效值

    目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...

  6. golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好

    golang学习笔记11   golang要用jetbrain的golang这个IDE工具开发才好  jetbrain家的全套ide都很好用,一定要dark背景风格才装B   从File-->s ...

  7. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  8. angular学习笔记(三十)-指令(10)-require和controller

    本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...

  9. angular学习笔记(三十)-指令(7)-compile和link(2)

    继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...

随机推荐

  1. portal开发"下拉框"“日期框”查询要怎么配置

    下面的这些是我今天的成果! 总的来说是一步一步摸索出来的!还是等感谢超哥的耐心指导,犯了一些错误! 1.比如在wd配置文件中中写id=“check_it_two”,在java中写成 checki_it ...

  2. 在VS中关于MySQL的相关问题

    最近在vs上折腾mysql数据库 遇到了一些小问题,这里记录一下 问题一:数据源选择中没有mysql数据库的选项 解放方法: 1.安装MySql的VS插件(版本请下载最新版)mysql-for-vis ...

  3. WPF Radio组的绑定

    都是控件编,RadioButtion 简单绑定使用,model.cs下边定义属性 private int _isSuccess; public int IsSuccess { get { return ...

  4. (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  5. 使用正则表达式统计vs项目代码总行数[转]

    怎么统计VS2008中工程的总共代码行数?怎么统计VS2008中工程的总共代码行数?在一个大工程中有很多的源文件和头文件,我如何快速统计总行数? ------解决方案----------------- ...

  6. Lucene的Query类介绍

    把Lucene的查询当成sql的查询,也许会笼统的明白些query的真相了. 查询分为大致两类,1:精准查询.2,模糊查询. 创建测试数据. private Directory directory; ...

  7. 编写类String的构造函数、拷贝构造函数、析构函数和赋值函数

    一.题目: class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &othe ...

  8. svn服务器时间与本地时间不同步解决

    在用svn的时候,由于svn的时间与本地不同步,导致每次看log总是需要对时间. 今天修改了svn服务器时间与本地同步.只需要修改svn服务器时间与本地时间相同即可,但要主要修改时区,不然会出现时间又 ...

  9. 关于python decode()和 encode()

    1.先收集一下这几天看到的关于decode()解码和encode()编码的用法 bytes和str是字节包和字符串,python3中会区分bytes和str,不会混用这两个.字符串可以编码成字节包,而 ...

  10. iOS: 学习笔记, Swift名字空间

    在Swift中, 名字空间是用class(extension)嵌套来实现的, 下面用一个简单例子来进行展示 // // main.swift // SwiftNameSpace // // Creat ...