关于 实验16 安装程序后 标号直接定址表 中位移出错
assume cs:code,ss:zhanzhan 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 是不是如果不进行安装的话 call word ptr gnh_a 编译器计算的位移是从这里开始算的。
如果是安装后的话 gnh_a dw zxc1,zxc2,zxc3,zxc4 编译器计算的位移是从这开始算的。
页:
[1]