zoukankan      html  css  js  c++  java
  • 【实战编程】编写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 指令 :使df=1.

    注:使用movsb或movsw时  正确时候操作是:rep movsb

    下面开始正式编程

    assume cs:code
    data segment db
    'hacker by admin!' data ends code segment start: mov ax,cs mov ds,ax mov si,offset do mov ax,0 mov es,ax mov di,200h mov cx,offset doend - offset do ;获取中断程序的长度,好进行复制 cld rep movsb mov word ptr es:[0],200h mov word ptr es:[2],0h mov dx,0ffffhmov bx,1div bx ;测试除法溢出的代码 mov ax,4c00h int 21h do: mov ax,data mov ds,ax mov si,0h mov ax,0b800h mov es,ax mov di,0 mov cx,16 s: mov ah,2 ;绿色字体 mov al,ds:[si] mov es:[di],ax inc si inc di inc di loop s mov ax,4c00h int 21h doend:nop code ends end start

     上述代码写完后,可以执行看看

    可以说是成功编写完毕了。

    但这里其实还有个小毛病不知道各位有没有发现

    我的data段数据是放在do子程序的外面!!!

    懂8086机制的同学们就知道,每一次程序开启,所分配的空间都是系统自己给我们的,也就是说

    在程序运行期间,data段的数据是存在的。

    一旦程序退出了,原本存放在内存中的data数据就立马会被其他的程序数据覆盖掉!!

    经更改后代码如下:

    assume cs:code
    
    code segment
    start:
    mov ax,cs
    mov ds,ax
    mov si,offset do
    mov ax,0
    mov es,ax
    mov di,200h
    mov cx,offset doend - offset do
    cld
    rep movsb
    mov word ptr es:[0],200h
    mov word ptr es:[2],0h
    ;mov dx,0ffffh
    ;mov bx,1
    ;div bx
    mov ax,4c00h
    int 21h
    
    do:jmp short dostart
    db 'hacker by admin!'   ;我们将data中的数据放带do子程序里来
    
    dostart: 
    mov ax,0
    mov ds,ax
    mov si,202h
    mov ax,0b800h
    mov es,ax
    mov di,160*8+80    ;取屏幕中间部分
    mov cx,16
    s:
    mov ah,2
    mov al,ds:[si]
    mov es:[di],ax
    inc si
    inc di
    inc di
    loop s
    mov ax,4c00h
    int 21h
    doend:nop
    
    code ends
    end start

    将data中的数据放在子程序里来,可以看到,在数据的前面有一个jmp指令

    用来跳转到我们真正的中断程序中!

    在8086汇编中  jmp指令占用2个字节空间,所以我们的si将会在202H处开始复制数据到显示屏中

    下图是我安装好程序,再去用debug查看0:0200内存区域 代码还是在那里【因为其他合法的程序一般都不会使用 0:200~0:2FF( 0:200h~0:2FFh)的 256个字节的空间】

    接下来用debug的a指令让程序手动溢出试试

    mov dx,0ffffh
    mov bx,1
    div bx

    所以说,只要运行一遍这个程序,在之后无论什么时候出现除法溢出都会成功显示该字符串。

  • 相关阅读:
    温习:ASP.NET页面生命周期
    浅析大型网站的架构
    ASP.Net2.0小技巧 保持滚动条的位置 焦点移动到某个控件 $符号轻松的使用FindControl
    hiberfil.sys msocache,cpce&天极网,终结析沟,viewstate,cache,scroll不变,换行,cs下换行,为空,marshalbyrefobject,gettype,主题,getlegth(0),is
    Crontab中使用>&的问题
    到底什么是MiddleWare(中间件),请用plain English描述
    Dell D630安装SATA AHCI驱动的方法
    What Is Bootloader And How To Unlock Bootloader On Android Phones
    SCSI和RAID的相关知识
    Defy GPRS设置
  • 原文地址:https://www.cnblogs.com/wh4am1/p/7501389.html
Copyright © 2011-2022 走看看