您的位置:首页 > 移动开发 > 微信开发

用汇编实现中断的一个小程序

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐