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


;中断处理的一个小程序

;

;跳转指令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

你可能感兴趣的:(汇编,编译器,div,c)