鱼C论坛

 找回密码
 立即注册
查看: 2496|回复: 2

[汇编作业] 第13章检测实验及笔记

[复制链接]
发表于 2016-1-27 14:36:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
两个简单问题,选做一个,记住复制代码和改写中断向量表的固定步骤
;中断7ch的中断例程
;功能:将0结尾字符串改为大写
;参数:ds:si指向串首
;返回值:无
assume cs:code
code segment
start:
;复制代码
        mov ax,cs
        mov ds,ax
        mov si,offset todo
        
        mov ax,0h
        mov es,ax
        mov di,200h
        
        mov cx,offset todoend - offset todo
        cld
        rep movsb
;改写中断向量表
        mov ax,0
        mov ds,ax
        mov word ptr ds:[7ch*4],200h
        mov word ptr ds:[7ch*4+2],0
        
        mov ax,4c00h
        int 21h
;中断处理
        todo:
                push cx
                mov ch,0
                s:
                mov cl,ds:[si]
                jcxz return
                and cl,11011111b
                mov ds:[si],cl
                inc si
                jmp s
        return:
                pop cx
                iret
        todoend:
                nop
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-27 14:51:05 | 显示全部楼层
稍难一点的,难点在于中断处理程序如何改变父程序
;功能:用7ch中断例程完成loop指令的功能
assume cs:code
code segment
        start:
        ;复制
        mov ax,cs
        mov ds,ax
        mov si,offset todo
        
        mov ax,0
        mov es,ax
        mov di,0200h
        
        mov cx,offset todoend - offset todo
        
        cld
        rep movsb
        
        ;安装
        mov ax,0
        mov ds,ax
        mov word ptr ds:[7ch*4],0200h
        mov word ptr ds:[7ch*4+2],0h
        mov ax,4c00h
        int 21h
                
                todo:
                ;loop的原理:1.(cx)=(cx)-1 2.如果(cx)<>0跳回,=0继续
                ;这段代码要做的:
                ;1.(cx)=(cx)-1
                sub cx,1
                ;2.判断
                ;2.1为零继续
                jcxz return
                ;2.2不为零跳回。如何找到调用父程序s标号的段和偏移?
                ;在int的时候,cs,ip入了栈,所以可以改写栈中数据,等中断结束回到父程序时,依据被改写的cs:ip实现跳回
                ;(不是从栈中将cs:ip取出来jmp!)
                ;当前ss:[sp]正是ip的值
                add [sp],bx;偏移改为指向s
                return:
                        iret                
                todoend:nop
code ends
end start

书上没有直接用[sp],而是用[bp]中转,更安全
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-28 10:24:53 | 显示全部楼层
本帖最后由 yundi 于 2016-1-28 12:54 编辑

BIOS,DOS中断

先不用中断做个练习
;在屏幕5行12列显示3个红底高亮闪烁绿色的'a'
;参数dh=行号,dl=列号,al=字符,cx=重复次数

assume cs:code
code segment
start:
        mov dh,5
        mov dl,12
        mov al,'a'
        mov cx,3 ;参数赋值
        
        call showa;调子程序
        mov ax,4c00h
        int 21h
showa:
        push ax
        mov ax,0b800h
        mov ds,ax;段0b800h
        mov bx,0
        mov al,160
        mul dh;160*dh
        add bx,ax
        mov al,2
        mul dl;2*dl
        add bx,ax;偏移160*行+2*列
        pop ax;
s:        mov byte ptr ds:[bx],al
        mov byte ptr ds:[bx+1],11001010b
        add bx,2
        loop s
        ret        
code ends
end start

用上提供的中断例程,变得简单多了
;在屏幕5行12列显示3个红底高亮闪烁绿色的'a'
assume cs:code
code segment
start:
        ;定位光标
        mov ah,2
        mov bh,0
        mov dh,5
        mov dl,12
        int 10h
        ;显示
        mov ah,9
        mov al,'a'
        mov bl,11001010b
        mov bh,0
        mov cx,3
        int 10h
        
        mov ax,4c00h
        int 21h

code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 14:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表