鱼C论坛

 找回密码
 立即注册
查看: 2153|回复: 1

[汇编作业] 求解实验16为何会出现这样的结果

[复制链接]
发表于 2015-6-20 08:51:07 | 显示全部楼层 |阅读模式

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

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

x
assume cs:code

code segment

start:  mov ax,0
                mov es,ax
                mov di,200h
                mov ax,cs
                mov ds,ax
                mov si,offset int7ch
                mov cx,offset int7chend - offset int7ch
                cld
                rep movsb
               
                mov word ptr es:[7ch*4],200h
                mov word ptr es:[7ch*4+2],0
               
                mov ax,4c00h
                int 21h

int7ch:
        jmp istart
table   dw do1,do2,do3,do4

istart: push ax
        push bx
                push dx
               
                mov bl,ah
                mov bh,0
                cmp bl,3
                ja bye                              ;提取BH中的功能号,并进行比对是否大于3,大于则跳出
                mov ah,0
                push ax
                pop dx
                add bx,bx
               
                call word ptr table[bx]             ;跳转到相应功能对应的偏移地址
               
bye:    pop dx
                pop bx
                pop ax
                iret
               
do1:    push ax
        push cx
        push es
                push di
        
            mov ax,0b800h
                mov es,ax
                mov di,0
                mov cx,2000
               
do1s:        mov byte ptr es:[di],' '
                add di,2
                loop do1s                             ;清屏
               
                pop di
                pop es
                pop cx
                pop ax
                ret

do2:    push ax
        push cx
                push es
                push di
               

        mov ax,0b800h
        mov es,ax
                mov di,1
                mov cx,2000
               
do2s:        and byte ptr es:[di],11111000b              ;先将前景色置0,再修改前景色
                or es:[di],dl
                add di,2
                loop do2s                                   ;修改前景色
               
                pop di
                pop es
                pop cx
                pop ax
                ret
               
do3:    push ax
        push cx
                push es
                push di
                push dx
               
                mov ax,0b800h
                mov es,ax
                mov di,1
                mov cx,4
                shl dl,cl
                mov cx,2000
               
do3s:   and byte ptr es:[di],10001111b
        or es:[di],dl
                add di,2
                loop do3s                                 ;设置背景色
               
                pop dx
                pop di
                pop es
                pop cx
                pop ax
                ret
               
do4:    push ax
                push cx
                push es
                push di
                push ds
                push si
               
                mov ax,0b800h
                mov es,ax
                mov ds,ax
                mov si,160
                mov di,0
                cld
            mov cx,24
s0:                push cx
                mov cx,160
        rep movsb
                pop cx
                loop s0
               
                mov cx,80
s1:                mov byte ptr [si],' '
                add si,2
                loop s1
               
                pop si
                pop ds
                pop di
                pop es
                pop cx
                pop ax                                     ;向上滚动一行
               
int7chend:
        nop

code ends

end start

在新的INT7ch中断中,call会call到别的地址,求解为什么会出现这样的结果?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-4 14:06:05 | 显示全部楼层
自己也调试了很久,
突然发现table的地址竟然是安装程序中的偏移地址,
而非中断例程中的偏移地址。
table dw do0,do1,do2,do3中的table应当是从中断例程的20:2开始,
因为jmp占了0、1两个单元,
我自己写的安装程序中table的地址正是从2c开始的,
call word ptr table[bx]命令,
当bx=0的时候,
一直是跑到cs:[0+2c]的位置,即0:2c,
这就是错误的原因。
感觉也没法通过更改偏移地址来完善。
所以说,当使用直接定址表的时候,
中断例程一定要放在安装程序的最前面。
怪不得书中的例子怎么调试都会出错,呵呵。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 13:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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