用汇编实现中断的一个小程序
2011-01-02 04:59
239 查看
;中断处理的一个小程序
;
;跳转指令jmp指令分为三种:
; 段间跳转指令jmp far(把cs和ip寄存器的值变为标号所在的内存地址)
; 段内跳转指令jmp near(只修改ip寄存器值为标号的偏移地址)
; 段内短跳转指令jmp short(不修改cs和ip的值编译器自动计算跳转的位置,但跳得位置不能大于256)
;
;在内存中0000:0200到0000:0300中为空闲区域,即全为0并且不会被使用
assume cs:code
code segment
start:
;第一步:把中断向量表中0号表象的内容进行修改,使之只想我们自己编写
;的中断处理程序的入口地址
mov ax,0
mov ds,ax
mov word ptr ds:[0],200h
mov word ptr ds:[2],0
;第三步:把我们刚才的编写的0号中断处理程序拷贝到中断向量表中
;0号表项所指向的内存地址当中0000:0200
;movsb字节传送指令:指令在内存单元之间传送字符串
;使用movsb指令时ds:si指向了要拷贝字符串的首地址,es:si指向了要拷贝的
;目的地址
mov ax,cs
mov ds,ax
mov si,offset int0;表示标号所在的偏移地址,现在ds:si指向了要拷贝的源地址
mov ax,0
mov es,ax
mov di,200h
mov cx,offset int0end - offset int0
;拷贝字节的方向性问题
; clp指令拷贝数据的方向是从低字节往高字节拷贝,也就是
; 说没拷贝一个字节si和di加1
; std指令拷贝数据是从高字节往低字节拷贝
cld
rep movsb
;第四步:利用到吗自动引发0号中断处理程序
mov ax,1000h
mov bh,1
div bh
mov ax,4c00h
int 21h
;第二步:编写自己的中断处理程序,实现在屏幕中央显示字符串的功能
int0:jmp short int0start;这行代码占了两个字节空间
db "I am teacher"
int0start:mov ax,0b800h
mov es,ax ;配置显存首地址0b800
;要把I am teacher一个个拷贝到显存地址空间中
mov ax,cs
mov ds,ax
mov si,202h
;屏幕24行,有80列每一个占有两个字节
mov di,12*160*36*2
mov cx,12
s:mov al,ds:[si];这里[si]默认段地址为ds
mov es:[di],al
inc si
add di,2;颜色默认值白底黑字
loop s
mov ax,4c00h
int 21h
int0end:nop;结束标志
code ends
end start
写是写了,可总是没显示 还在慢慢调试 真烦啊 不知道什么原因 逻辑上来看应该没问题啊 可是就是没显示ORZ
;
;跳转指令jmp指令分为三种:
; 段间跳转指令jmp far(把cs和ip寄存器的值变为标号所在的内存地址)
; 段内跳转指令jmp near(只修改ip寄存器值为标号的偏移地址)
; 段内短跳转指令jmp short(不修改cs和ip的值编译器自动计算跳转的位置,但跳得位置不能大于256)
;
;在内存中0000:0200到0000:0300中为空闲区域,即全为0并且不会被使用
assume cs:code
code segment
start:
;第一步:把中断向量表中0号表象的内容进行修改,使之只想我们自己编写
;的中断处理程序的入口地址
mov ax,0
mov ds,ax
mov word ptr ds:[0],200h
mov word ptr ds:[2],0
;第三步:把我们刚才的编写的0号中断处理程序拷贝到中断向量表中
;0号表项所指向的内存地址当中0000:0200
;movsb字节传送指令:指令在内存单元之间传送字符串
;使用movsb指令时ds:si指向了要拷贝字符串的首地址,es:si指向了要拷贝的
;目的地址
mov ax,cs
mov ds,ax
mov si,offset int0;表示标号所在的偏移地址,现在ds:si指向了要拷贝的源地址
mov ax,0
mov es,ax
mov di,200h
mov cx,offset int0end - offset int0
;拷贝字节的方向性问题
; clp指令拷贝数据的方向是从低字节往高字节拷贝,也就是
; 说没拷贝一个字节si和di加1
; std指令拷贝数据是从高字节往低字节拷贝
cld
rep movsb
;第四步:利用到吗自动引发0号中断处理程序
mov ax,1000h
mov bh,1
div bh
mov ax,4c00h
int 21h
;第二步:编写自己的中断处理程序,实现在屏幕中央显示字符串的功能
int0:jmp short int0start;这行代码占了两个字节空间
db "I am teacher"
int0start:mov ax,0b800h
mov es,ax ;配置显存首地址0b800
;要把I am teacher一个个拷贝到显存地址空间中
mov ax,cs
mov ds,ax
mov si,202h
;屏幕24行,有80列每一个占有两个字节
mov di,12*160*36*2
mov cx,12
s:mov al,ds:[si];这里[si]默认段地址为ds
mov es:[di],al
inc si
add di,2;颜色默认值白底黑字
loop s
mov ax,4c00h
int 21h
int0end:nop;结束标志
code ends
end start
写是写了,可总是没显示 还在慢慢调试 真烦啊 不知道什么原因 逻辑上来看应该没问题啊 可是就是没显示ORZ
相关文章推荐
- ARM汇编程序---通过ARM汇编实现累加一个队列的所有元素
- win32汇编实现一个简单的TCP服务端程序(WinSock的简单认知应用)
- 用MASM写一个简单的实现递归操作的汇编程序,所谓递归,上课已经跟大家说清楚了,如果我们只考虑简单的只分一次的递
- 利用BIOS中断或DOS中断实现一个显示当前时间的程序
- 利用BIOS中断或DOS中断实现一个电子表的程序,要求精确到秒
- 一个用Dijkstra算法实现的路由算法的java程序——8 GraphMain类
- 用程序来控制一个网页,实现自己主动输入等操作
- 一个简单的AJAX实现,基于C#的ASP.Net,包括服务器端的程序代码
- 编写一个计算某个月份的天数程序,请用if-else条件语句实现。要求根据用户输入的月份,判断出月份所包含的天数。
- n个并发进程共用一个公共变量Q,写出用信号灯实现n个进程互斥的程序描述,给出信号灯值得取值范围,并说明每个取值范围的物理意义。
- C++实现的一个简单两个大数相加程序!
- 这是一个实现在光照下的机器人手臂的动作交互程序
- QT 实现一个任务栏托盘图标程序 weathertrayicon
- 在程序中怎样实现一个搜索功能
- C语言实现的一个简单的HTTP程序
- 本人用汇编写的一个bmp位图的字符转换程序
- 利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆
- 例2.编定汇编程序,实现符号函数(设-128≤X≤127)
- 一个在widegets平台上实现的时钟程序
- 用python实现一个socket echo程序 && tcp socket的几个关闭状态