汇编:实验13三题

1、编写安装7ch号中断例程,显示0结尾的字符串

中断例程装载程序:

; 8086实模式 中断例程装载程序
; 中断号 7ch
; 装载位置 0:200h

assume cs:code
code segment
start:
    mov ax,cs
    mov ds,ax
    mov si,offset handler ; ds:si指向中断例程的代码
    
    mov ax,0
    mov es,ax
    mov di,200h ; es:di指向中断例程装载位置
    mov cx,offset handlerend - offset handler ; 中断例程长度
    cld
    rep movsb ; 串传输

    ; 设置 7ch 号中断向量
    mov ax,0
    mov es,ax
    mov word ptr es:[7ch*4],200h
    mov word ptr es:[7ch*4+2],0
    
    mov ax,4c00h
    int 21h

handler:                               
    ; 注意!下文中断例程装载程序,只提供 handler 标号的部分,即,
    ; 中断处理程序开始 与 中断处理程序结束 包裹的部分
    
    ; 中断处理程序开始
    ; 显示0结尾的字符串
    ; dh 行号、dl 列号、cl 颜色、ds:si指向字符串首
    push si
    push es
    push di
    push ax
    push dx
    push cx

    mov ax,0b800h ; 显存开始位置
    mov es,ax
    mov al,dh
    mov dh,160
    mul dh ; ax=行号*160
    mov dh,0
    add dx,dx ; dx=列号*2
    add ax,dx
    mov di,ax ; di=行号*160+列号*2

s:
    mov al,[si]
    cmp al,0
    je ok
    mov ah,cl
    mov es:[di],ax
    add di,2
    inc si
    jmp s

ok:
    pop cx
    pop dx
    pop ax
    pop di
    pop es
    pop si
    iret
    ; 中断处理程序结束
handlerend:
    nop

code ends
end start

调用者程序:

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
    int 7ch
    mov ax,4c00h
    int 21h
code ends
end start

执行结果:

装载程序的编译执行

调用者程序执行结果

2、编写安装7ch号中断例程,模拟loop指令

中断例程:

; 中断处理程序开始
lp:
    push bp
    mov bp,sp
    dec cx
    jcxz lpret
    add [bp+2],bx ; bx是转移位移
lpret:
    pop bp
    iret
; 中断处理程序结束

调用者:

assume cs:code
code segment
start:
    mov ax,0b800h
    mov es,ax
    mov di,160*12
    mov bx,offset s - offset se ; 这里的结果必须是负数,bx即转移位移
    mov cx,80
s:
    mov byte ptr es:[di],'!'
    add di,2
    int 7ch ; 如果cx≠0,转移到标号s处
se:
    nop
    mov ax,4c00h
    int 21h
code ends
end start

执行结果:

3、补全程序,在屏幕2、4、6、8行显示英文诗

源码

; 在 2 4 6 8 行显示4句英文诗

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] ; 行号
        mov dl,0 ; 列号
        mov ah,2 ; 调10h中断例程中的显示例程
        int 10h ; 调bios的10h号例程

        mov dx,ds:[bx] ; ds:dx执行要显示字符串首
        mov ah,9 ; 调21h中断例程的9号例程
        int 21h ; 调dos的21h号中断例程
        
        inc si
        add bx,2

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

结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值