汇编试验十二 编写0号中断的处理程序

要求:除法溢出的时候,在屏幕中心处显示overflow!

分析:

  • 0号中断,对应的中断入口地址中的程序可以不用修改,放到内存0:空余位置(空余位置一般是0000::0200~0000:02FF)于是,就将显示字符串的程序放到这里;
  • 用一个do0安装程序,将这个中断程序复制到内存0000:0200那里去;格式是:es:di 目的地址,ds:si源程序,cld复制方向,rep movsb 复制
  • 子程序(中断程序)中,显示的字符串,不能放到一个独立的代码段,而是放到一个中断程序本身里面,因为复制程序运行完后,内存释放,代码段中的内容可能改变;
  • 重新写一个程序故意除法溢出

效果:

Source Code:

assume cs:code

code segment
start:
    mov ax,cs
    mov ds,ax
    mov si,offset do0   ;ds:si指向源地址

    mov ax,0
    mov es,ax
    mov di,200h         ;es:di指向目的地址
    cld
    rep movsb

    mov ax,0
    mov es,ax
    mov word ptr es:[0*4],200h
    mov word ptr es:[0*4+2],0

    mov ax,4c00h
    int 21h

    do0: jmp short do0start
        db "overflow!"

    do0start:
        mov ax,cs
        mov ds,ax
        mov si,202h     ;ds:si指向字符串,复制到0:200处

        mov ax,0b800h
        mov es,ax
        mov di,12*160+36*2  ;显示位置

        mov cx,9
        s:
            mov al,[si]
            mov es:[di],al
            inc si
            add di,2
            loop s
        mov ax,4c00h
        int 21h
    do0end:nop
code ends
end start

assume cs:code

code segment
start:
mov ax,1000h
mov bh,1
div bh
code ends
end start

时间: 2024-10-18 23:54:15

汇编试验十二 编写0号中断的处理程序的相关文章

【实战编程】编写0号中断处理程序

题目:编写0号中断处理程序,在除法溢出时,在屏幕中间显示字符串“hacker by admin!” 之前先补充一个rep movsb的指令知识 movsb和movsw是相反的,都是根据标志寄存器DF的值选择正向传递还是反向传递. 这两个指令都是把ds:si中的值传递到es:di的位置中去 如果df=0时,取正向移动.(inc si和di) 如果df=1时,取反向移动.(dec si和di) 由上可知,只需要改变si和di的值就可以选择正向还是反向 cld 指令 :使df=0:std 指令 :使d

汇编语言:0号中断处理程序

assume cs:code code segment ;第一步:把中断向量表中0号表项的内容进行修改,使之指向我们自己编写 ;的中断处理程序的入口地址 start: mov ax,0 mov ds,ax mov word ptr ds:[0],0200h mov word ptr ds:[2],0 ;第三步,把我们刚才编写好的0号中断处理程序拷贝到中断向量表中 ;0号表项所指向的内存地址中0000:0200 mov ax,cs mov ds,ax mov si,offset int0  ;ds

Arduino101学习笔记(十二)—— 101定时器中断

一.API 1.开定时器中断 //********************************************************************************************* //函数名称:CurieTimerOne.start(int timerPeriodUsec, userCallBack) //输入参数:timerPeriodUsec:: 多少微妙产生中断 // userCallBack : 中断函数 //函数返回:无 //函数功能:开定时器

汇编试验十四:访问CMOS RAM

CMOS RAM 芯片的特征: 包含一个时钟和一个有128个存储单元的RAM存储器. 该芯片靠电池供电.所以,关机后其内部的时钟仍可正常工作,RAM中的信息不丢失. 128个字节的RAM中,内部时钟占用 0~0dh  单元来保存时间信息,其余大部分单元用于保存系统配置信息,供系统启动时BIOS程序读取. 该芯片内部有两个端口,端口地址为 70h 和 71h .CPU 通过这两个端口来读写CMOS RAM. 70h 为地址端口存放要访问的 CMOS RAM 单元的地址: 71h  为数据端口,存放

汇编实验十:编写子程序

预备知识: (1) ret :修改IP IP = SS*16 + SP   SP+=2 retf :修改CS,IP IP = SS*16 + SP ,SP+=2 , CS = SS*16 + SP , SP+=2 Source Code: assume cs:code stack segment db 16 dup (0) stack ends code segment mov ax,4c00H int 21H start: mov ax,stack mov ss,ax mov sp,16 pu

汇编试验五:编写、调试具有多个段的程序

ds 数据段放入数据正确: 两次push 操作后,ss栈段正确: 由于pop 操作顺序,ds数据段并没有发生改变: Source Code: assume cs:code, ds:data, ss:stack data segment dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends code segment start: mov ax,

linux平台学x86汇编(十二):字符串的存储与加载

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 字符串的存储与加载是指,将字符串的值加载到寄存器和将其传回内存位置中.其使用指令lods指令和stos指令. lods指令用于把内存中的字符串值传送到eax寄存器中,该指令有三种不同格式:lodsb(1字节).lodsw(2字节).lodsl(4字节).lods指令使用esi寄存器作为隐含的源操作数.esi寄存器必须包含要加载的字符串所在的内存地址. 在使用lods指令把字符

汇编入门学习笔记 (十二)—— int指令、port

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

汇编入门学习笔记 (十二)—— int指令、端口

疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.端口 参考: <汇编语言> 王爽 第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 seg