. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验16 调用子程序时出错(子程序及装载程序应该没问题)  [待解决] 回复[ 2次 ]   点击[ 567次 ]  
zhllhz
[帖 主]   [ 发表时间:2010-03-27 09:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17
assume cs:code
code segment
        start:  ;装载中断例程
                mov ax,cs
                mov ds,ax
                mov si,offset do7ch

                mov ax,0
                mov es,ax
                mov di,200h

                mov cx,offset do7chend- offset do7ch
                cld
                rep movsb
                ;设置中断向量表
                mov ax,0
                mov es,ax

                cli
                mov word ptr es:[7ch*4],200h
                mov word ptr es:[7ch*4+2],0
                sti

                mov ax,4c00h
                int 21h
;do7ch-------------------------------------------------------------------------
      do7ch:    ;名称:7ch号中断程序
                ;参数:ah 传递功能号,al传递颜色值,(AL)={0~7}
                ;功能:(0):清屏;
                ;      (1):设置前景色
                ;      (2):设置背景色
                ;      (3):向上滚动一行
                ;返回值:无
        a:

                push ds
                push bx
                push dx
                push si
                jmp short dstart
        b:              ;表单 存储各个子程序相对于标号DO7CH的偏移地址
                        dw offset cls - offset do7ch,offset pcolor - offset do7ch
                     dw offset bcolor - offset do7ch,offset roll - offset do7ch
      dstart:

                cmp ah,3        ;大于3的输入无效
                  ja do7chover1

                mov dx,0
                mov ds,dx


                mov dx,[7ch*4]  ;取中断入口偏移地址

                  mov bx,[7ch*4+2]
                mov ds,bx       ;中断入口段地址


                  mov si,offset b- offset a
                add dx,si       ;入口到表单的位移

                  mov bl,ah        ;具体的功能号在表单中对应的位置
                mov bh,0
                add bx,bx
                mov bx,0

                add bx,dx       ;(bx)=所选子程序相对DO7CH偏移地址存放位置

                  mov dx,[7ch*4]  ;修改相对偏移地址为绝对偏移地址
                  add dx,[bx]     ;dx中存放的是中断向量表中存储的(IP)+表单中存放的偏移地址
                                ;便是子程序的绝对的偏移地址了
                call word ptr dx
    do7chover1: jmp do7chover

        cls:   ;清屏函数
                  push ax
                push es
                push bx
                push cx

                mov ax,0b800h
                mov es,ax
                mov bx,0

                mov cx,2000
        cls_s:  mov byte ptr es:[bx],' '
                add bx,2
                loop cls_s

                pop cx
                pop bx
                pop es
                pop ax
                ret

        pcolor: ;显示前景色
                  push ax
                push bx
                push es
                push cx

                mov bx,0b800h
                mov es,bx
                mov bx,1

                mov cx,2000

      pcolor_s: and byte ptr es:[bx],11111000b
                or es:[bx],al
                add bx,2
                loop pcolor_s

                pop cx
                pop es
                pop bx
                pop ax
                ret
        bcolor: ;显示背景色
                  push ax
                push bx
                push cx
                push es

                mov bx,0b800h
                mov es,bx
                mov bx,1

                shl al,1
                shl al,1
                shl al,1
                shl al,1

                mov cx,2000
     bcolor_s:  and byte ptr es:[bx],10001111b
                or es:[bx],al
                add bx,2
                loop bcolor_s

                pop es
                pop cx
                pop bx
                pop ax
                ret
        roll:   ;向上滚动一行
                  push ax
                push cx
                push es
                push si
                push ds
                push di

                mov ax,0b800h
                mov es,ax
                mov di,0

                mov ds,ax
                mov si,160

                mov cx,24
        roll_s: push cx
                mov cx,160
                cld
                rep movsb
                pop cx
                loop roll_s

                mov cx,80
        roll_s2:
                mov byte ptr es:[si+2],' '
                add si,2
                loop roll_s2

                pop si
                pop ds
                pop di
                pop es
                pop cx
                pop ax
                ret
      do7chover:
                pop si
                pop dx
                pop bx
                pop ds

                iret
      do7chend: nop
;----------------------------------------------------------------------------------------
code ends
end start
abob
[第1楼]   [ 回复时间:2010-03-31 15:04 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
call word ptr dx 
------------------
这个能通过编译吗?    call dx             

子程序及装载程序应该没问题
---------------
“应该”?自己通过debug确认。
zhllhz
[第2楼]   [ 回复时间:2010-04-20 18:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17
我贴程序的时候把改乱的发上来了 (后来看的时候发现的)
这个程序出现过的问题是在程序中写"[bx]"与“ds:[bx]”的结果是不一样的
恩,估计是环境问题吧
放实模式下去可以 我觉得 去试试。。。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved