AK47 发表于 2012-6-19 15:51:44

关于 实验16 安装程序后 标号直接定址表 中位移出错

assume cs:code,ss:zhan

zhan segment
db 64 dup (' ')
zhan ends

code segment

start:
    mov ax,zhan
        mov ss,ax
        mov sp,64
    mov ax,200H
        mov es,ax
        mov ax,cs
        mov ds,ax
        mov si,offset s0
        mov di,0
        mov cx,offset s1 - offset s0
        cld
        rep movsb
        mov ax,0
        mov ds,ax
        cli
        mov word ptr ds:,200H
        mov word ptr ds:,0
        sti
       
       
          
        mov ax,4c00H
        int 21H

s0:jmp short sat         ; 中断程序 功能实现 4个子功能
gnh_a dw zxc1,zxc2,zxc3,zxc4   ;错误在这安装到 0:200H 后标号指向的位移没变 但是用call 调用 却报错
   nop
       nop
       nop
       nop
       nopq
sat:push bx
   cmp ah,3
       ja et
       mov bl,ah
       mov bh,0
       add bx,bx
       call word ptr gnh_a                ;安装后执行到这个指令后IP跳飞了。。。。 不安装可以执行
et:pop bx
   iret

zxc4:      ;子程序4 功能号 AH 3    功能设置屏幕向下移动一行
   push bx
       push cx
       push si
       push di
       push ds
       push es
       
       mov bx,0b800H
       mov es,bx
       mov ds,bx
       mov si,160
       mov di,0
       
       mov cx,24
zxc4s:push cx
       mov cx,160
       cld
       rep movsb
       loop zxc4s
       
       mov cx,80
       mov si,0
zxc4s1:mov byte ptr es:,' '
       add si,2
       loop zxc4s1
       
       pop es
       pop ds
       pop di
       pop si
       pop cx
       pop bx
       ret
       
zxc3:      ;子程序3 功能号 AH 2    功能设置背景景色参数al 传递颜色
   push bx
       push cx
       push es
       
       mov bx,0b800H
       mov es,bx
       mov bx,1
       mov cx,2000
zxc3s:and byte ptr es:,10001111b
       ores:,al
       add bx,2
       loop zxc3s
       
       pop es
       pop cx
       pop bx
       ret

zxc2:      ;子程序2 功能号 AH 1    功能设置前景色参数al 传递颜色
   push bx
       push es
       push cx
   mov bx,0b800H
       mov es,bx
       mov bx,1
       mov cx,2000
zxc2s:and byte ptr es:,11111000b
       ores:,al
       add bx,2
       loop zxc2s
       pop cx
       pop es
       pop bx
       ret
       
zxc1:      ;子程序1功能号 AH 0   功用清屏
   push ax
       push es
       push di
       push cx
       
   mov ax,0b800H
   mov es,ax
       
       mov di,0
       mov cx,2000
zxc1s:mov byte ptr es:,' '
       add di,2
       loop zxc1s
       
       pop cx
       pop di
       pop es
       pop ax
       ret
s1:nop
code ends
end start

AK47 发表于 2012-6-19 15:57:03

是不是如果不进行安装的话      call word ptr gnh_a   编译器计算的位移是从这里开始算的。


如果是安装后的话    gnh_a dw zxc1,zxc2,zxc3,zxc4    编译器计算的位移是从这开始算的。




页: [1]
查看完整版本: 关于 实验16 安装程序后 标号直接定址表 中位移出错