注册 登录
编程论坛 汇编论坛

王爽汇编之中断处理程序----------练技术

Explorerlxz 发布于 2014-06-09 12:36, 1329 次点击
越来越感觉汇编也不是那么难于理解!实验12 编写0号中断的处理程序很简单,书上全部都给出了代码,不过今天还是收获到win7下原来也有debug,我之前是从来都不知道的,虽然简单,但也有必要记录一下,此贴就把以后关于中断处理的程序全部贴在这里了!
只有本站会员才能查看附件,请 登录
程序代码:
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],200h
    mov word ptr es:[2],0

do0:    jmp short do0start
    db "overflow!"
   
do0start:
    mov ax,cx
    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
    mov byte ptr es:[di+1],02
    inc si
    add di,2
    loop s

    mov ax,4c00h
    int 21h

do0end:    nop
code ends
end start
4 回复
#2
funyh2502014-06-09 13:26
#3
Explorerlxz2014-06-09 17:29
中断其实和调用子程序差不多,安装中断之前先把中断程序当作一个单独的子程序运行一下
下面是实验13,编写并安装int 7ch中断例程
只有本站会员才能查看附件,请 登录
程序代码:
assume cs:code
data segment
    db "welcome to masm!",0
data ends

code segment
start:
    mov dh,10
    mov dl,10
    mov cl,2
    mov ax,data
    mov ds,ax
    mov si,0
    call int7c
    mov ah,0
    int 16h
    mov ax,4c00h
    int 21h
;-----------------------------------
int7c:
    push es
    push bx
    push cx
    push ax
    mov ax,0b800h
    mov es,ax

    mov al,dh
    mov ah,160
    mul ah
    mov bx,ax
    mov al,dl
    mov ah,2
    mul ah
    add bx,ax
    mov ch,0ffh
    mov ah,cl

s:
    mov al,[si]
    cmp al,0
    jz ok
    mov es:[bx],al
    mov es:[bx+1],ah
    add bx,2
    inc si
    loop s

ok:   

    pop ax
    pop bx
    pop cx
    pop es
    ret
;--------------------------------------
code ends
end start
然后把子程序拿出来,放到安装中断程序的里面
程序代码:
assume cs:code
code segment
start:
    mov ax,cs
    mov ds,ax
    mov si,offset int7c

    mov ax,0
    mov es,ax
    mov di,200h
    mov cx,offset int7cend-offset int7c
    cld
    rep movsb

    mov ax,0
    mov es,ax
    mov word ptr es:[4*7ch],200h
    mov word ptr es:[4*7ch+2],0
    mov ax,4c00h
    int 21h
;中断7ch,显示一个以0结束的字符串
;
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址
int7c:
    push es
    push bx
    push cx
    push ax
    mov ax,0b800h
    mov es,ax

    mov al,dh
    mov ah,160
    mul ah
    mov bx,ax
    mov al,dl
    mov ah,2
    mul ah
    add bx,ax
    mov ch,0ffh
    mov ah,cl

s:
    mov al,[si]
    cmp al,0
    jz ok
    mov es:[bx],al
    mov es:[bx+1],ah
    add bx,2
    inc si
    loop s

ok:   

    pop ax
    pop bx
    pop cx
    pop es
    iret
int7cend:nop
code ends
end start
运行上面的程序,安装完成7ch中断例程后,执行下面的程序测试中断是否安装成功
程序代码:
data segment
    db "welcome to masm!",0
data ends

code segment
start:
    mov dh,10
    mov dl,10
    mov cl,2
    mov ax,data
    mov ds,ax
    mov si,0
    int 7ch
    mov ah,0
    int 16h
    mov ax,4c00h
    int 21h
code ends
end start
只有本站会员才能查看附件,请 登录

#4
Explorerlxz2014-06-09 17:50
实验13中的第二个题目,int 7ch中断完成loop指令的功能,方法同楼上
程序代码:
assume cs:code
code segment
start:
    mov ax,0b800h
    mov es,ax
    mov di,160*12
    mov bx,offset s-offset se
    mov cx,80
s:   

    mov byte ptr es:[di],'!'
    add di,2
    call int7ch
se:
    mov ah,0
    int 16h
    mov ax,4c00h
    int 21h
;--------------------------------
int7ch:
    push bp
    mov bp,sp
    dec cx
    jcxz lpret
    add [bp+2],bx
lpret:
    pop bp
    ret
;--------------------------------
code ends
end start
只有本站会员才能查看附件,请 登录

安装中断的程序
程序代码:
assume cs:code
code segment
start:
    mov ax,cs
    mov ds,ax
    mov si,offset int7ch

    mov ax,0
    mov es,ax
    mov di,200h
    mov cx,offset int7cend-offset int7ch
    cld
    rep movsb

    mov ax,0
    mov es,ax
    mov word ptr es:[4*7ch],200h
    mov word ptr es:[4*7ch+2],0
    mov ax,4c00h
    int 21h
;中断7ch,完成loop指令的功能
;
参数:(cx)=循环次数,(bx)=位移
    push bp
    mov bp,sp
    dec cx
    jcxz lpret
    add [bp+2],bx
lpret:
    pop bp
    iret
int7cend:nop
code ends
end start
测试中断功能的程序
程序代码:
assume cs:code
code segment
start:
    mov ax,0b800h
    mov es,ax
    mov di,160*12
    mov bx,offset s-offset se
    mov cx,80
s:   

    mov byte ptr es:[di],'!'
    add di,2
    int 7ch
se:
    mov ah,0
    int 16h
    mov ax,4c00h
    int 21h
code ends
end start
结果如下
只有本站会员才能查看附件,请 登录

#5
Explorerlxz2014-06-09 19:38
实验13最后一个题目,通过调用BIOS,dos中断显示四行英文诗
只有本站会员才能查看附件,请 登录
程序代码:
assume cs:code
code segment
    s1:    db 'Good,better,best,','$'
    s2:    db 'Never let it rest,','$'
    s3:    db 'Till good is better,','$'
    s4:    db 'And better,best,','$'
    s:    dw offset s1,offset s2,offset s3,offset s4
    row:    db    2,4,6,8

start:
    mov ax,cs
    mov ds,ax
    mov bx,offset s
    mov si,offset row
    mov cx,4
ok:
    mov bh,0    ;第0页
    mov dh,[si]    ;dh中放行号
    mov dl,0    ;dl中放列号
    mov ah,2    ;置光标
    int 10h

    mov dx,[bx]    ;ds:dx指向字符串的首地址
    mov ah,9
    int 21h        ;int 21h中断9号功能

    add bx,2
    inc si
    loop ok

    mov ax,4c00h
    int 21h
code ends
end start
1