[059][汇编语言]实验 编程 处理0号中断(除法溢出错误)

要做的事情

中断程序入口地址 与 中断程序本身 所在
  • 1、编写可以显示 "overflow" 的中断处理程序 : do0
  • 2、将do0送入内存0000:0200H开始处,即从内存单元0000:0200H开始存放 0号中断处理程序本身
  • 3、将 do0入口地址 0000:0200H存储在 中断向量表 0号表项(内存单元 0000:0000~0000:0003H)

事情做完后得到的东西

从0号表项读取0号中断处理程序的入口地址 从入口地址处开始执行0号中断处理程序.png

程序框架

assume cs:code
    code segment
    start:  do0安装程序
            设置中段向量表
            mov ax,4c00H
            int 21H
    do0:    显示字符串“overflow!”
            mov ax,4c00H
            int 21H
    code ends
    end start

实现 do0 的安装程序

  • 功能:执行do0的安装程序后,会将do0的代码复制到内存0000:0200H处

do0安装代码实现

设置ds:si指向源地址    do0 程序本身所在 【cs:标号do0】
设置es:di指向目的地址   中断向量表的【0000:0200】
设置cx为传输长度
设置传输方向为正
rep movsb


assume cs:code
    code segment
    start:  mov ax,cs
            mov ds,ax
            mov si,offset do0
            
            mov ax,0
            mov es,ax
            mov di,200H
            
            mov cx,offset do0end - offset do0
            cld
            rep movsb
            
            设置中断向量表
            
            mov ax,4c00H
            int 21H
            
        do0:    显示字符串“overflow!"
                mov ax,4c00H
                int 21H
        do0end: nop
                
        code ends
        end start
  • 要使用 rep movsb,必须是ds:si 指向源地址es:di 指向目的地址且结合cx
  • mov si,offset do0 得到标号 do0的偏移地址(原始地址的偏移地址)
  • mov cx,offset do0end - offset do0 计算得到 do0所有指令的字节数(do0代码长度)

实现 do0 中断处理程序本身

  • 功能:在除法溢出发生时,在屏幕上显示字符串“overflow!”

do0程序本身代码实现

assume cs:code
    code segment
    start:  mov ax,cs
            mov ds,ax
            mov si,offset do0
            
            mov ax,0
            mov es,ax
            mov di,200H
            
            mov cx,offset do0end - offset do0
            cld
            rep movsb
            
            设置中断向量表
            
            mov ax,4c00H
            int 21H
            
            
        do0:    jmp short do0Start
                db 'overflow!'
            
        do0Start:   mov ax,cs
                    mov ds,ax
                    mov si,202H
                    
                    
                    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
  • "overflow!"字符串 放在 do0程序的开始处
do0:    jmp short do0Start
    db 'overflow!'
  • 设置ds:si指向字符串
mov ax,cs
mov ds,ax
mov si,202H

段地址
  "overflow!" 和 do0的代码处于同一个段中,
  发生除法溢出的时候,do0的段地址就是CS
  所以需要把 ds 设置成 CS

偏移地址
  0000:0200H 处的指令是 jmp short d0start
  这条jmp指令占两个字节,
  所以"overflow!"的偏移地址是 202H

设置中断向量

  • 功能:在中断向量表的0号表项处填入0号中断处理程序的入口地址0000:0020H
mov ax,0
mov es,ax
mov word ptr es:[0*4],200H
mov word ptr es:[0*4+2],0       

完整源码 : do0.asm

完整源码结构.png
assume cs:code
    code segment
    start:  mov ax,cs
            mov ds,ax
            mov si,offset do0
            
            mov ax,0
            mov es,ax
            mov di,200H
            
            mov cx,offset do0end - offset do0
            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
                    
                    
                    mov ax,0B800H
                    mov es,ax
                    mov di,12*160+36*2
                
                    mov ah,02H
                    mov cx,9
                s:  mov al,[si]
                    mov es:[di],al
                    mov es:[di+1],ah
                    inc si
                    add di,2
                    loop s
            
                    mov ax,4c00H
                    int 21H
            do0end: nop
                
        code ends
        end start
  • 方便看结果,对于“overflow”的显示增加了样式:绿色
    mov ah,02H ;绿色
    mov cx,9
s:  mov al,[si]
    mov es:[di],al
    mov es:[di+1],ah ;设置属性

测试程序 : testdo0.asm

assume cs:code
    code segment
    start:  mov ax,0FFFFH
            mov bh,1
            div bh
            
            mov ax,4c00H
            int 21H
                
        code ends
        end start
        

调试测试程序

  • 1、编译、连接、调试,文件 do0.asm
masm do0.asm
link do0.obj
debug do0.exe
使用 debug 【g命令】一步到位执行完全部指令

以看到下面的结果为准:
  (一)在中断处理向量表的0号表项填入入口地址,
       前四个内存单元应该是 00 02 00 00 组成 0000:0200H;
  (二)0号中断处理程序被写入内存0000:0020H开始的地址。
  • 2、编译、连接、调试,文件 testdo0.asm
masm testdo0.asm
link testdo0.obj
debug testdo0.exe
使用debug【u命令】查看 mov ax,4c00H所在内存单元的偏移地址X
使用debug【g命令】 g X 直接跳转到这个地址就可以看输出结果


以看到下面的结果为准:
  (一)在运行testdo0.exe 率先查看中断处理向量表的状态,
  要求入口地址以及处理程序都被正确填写了;
  (二)本程序中的 mov ax,4C00H 语句所在内存单元偏移地址是 0007H,
  因此使用的【G命令】是 g 7 (如图);
  (三)屏幕上出现绿色的字符串 “overflow!” 。

调试过程图解

  • 工具与源码文件在同一个目录层次
0、文件结构,同一文件目录下 编译连接调试工具 与 自己编写的源码文件.png
1 安装do0程序 0号中断处理程序.png
2 调试测试程序 此时内存已经安装好了0号中断处理程序.png
3、运行测试程序 用g命令直接跳到 mov ax 4c00H 处 显示overflow.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,482评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 简书连载风云录蔷薇小说目录择一世长安专题择一世长安【目录】 文丨蔷薇下的阳光 上一章 《第三十九章:首战告捷》 前...
    蔷薇下的阳光阅读 611评论 1 9
  • 03102 李佑平 《跑跑镇》,一本创意作品,物与物的碰撞,出现一个新的事物,很有意思。他可以让孩子们将两...
    李佑平阅读 516评论 0 0