|
主题 : : 关于标号的一些我的认识 [已解决] |
回复[ 3次 ]
点击[ 550次 ] | |
荣誉值:6
信誉值:11
注册日期:2008-11-28 16:49 |
实验16在我还没有做的时候觉得这不就是把前面的代码打一次吗,结果我打了一次发现我错了。。。,书上的题目不会搞个这么无聊的事情。
这个实验主要是标号问题,数据标号有段属性和偏移属性,当程序段被转移,段被改变(table在code段中table的cs被改变为20),但他在原程序的相对于段的偏移没有改变(程序段移动之后table数据标号为cs:002a,和所希望的
cs:0002不相同,table不能被随便引用,故我的程序不能用call word ptr table[bx])。
但是我想标号的引用可以在被转移的程序段中使用,是因为跳转都是用的相对位移
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset s0
mov ax,0
mov es,ax
mov di,200h
mov cx,offset s0end-offset s0
cld
rep movsb
mov word ptr es:[7ch*4],0
mov word ptr es:[7ch*4+2],20h
mov ax,4c00h
int 21h
s0:
jmp short s00
table dw offset g0-offset s0,offset g1-offset s0,offset g2-offset s0,offset g3-offset s0 ;相对s0的位移
s00:
push bx
cmp ah,3
ja ok
mov bl,ah
mov bh,0
add bx,bx
call word ptr cs:2h[bx] ;就是这里害我好惨
ok:
pop bx
iret
g0:
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
g01:
mov byte ptr es:[bx],' '
add bx,2
loop g01
pop es
pop cx
pop bx
ret
g1:
push bx
push es
push cx
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
g11:
and byte ptr es:[bx],11111000b
or es:[bx],al
add bx,2
loop g11
pop cx
pop es
pop bx
ret
g2:
push bx
push es
push cx
mov bx,0b800h
mov es,bx
mov bx,1
and byte ptr es:[bx],10001111b
shl al,1
shl al,1
shl al,1
shl al,1
mov cx,2000
g21:
or es:[bx],al
add bx,2
loop g21
pop cx
pop es
pop bx
ret
g3:
push si
push es
push ds
push cx
mov si,0b800h
mov es,si
mov ds,si
mov di,0
mov si,160
mov cx,24
g31:
push cx
mov cx,160
g32:
rep movsb
inc di
inc si
loop g32
pop cx
loop g31
mov cx,80
mov si,0
g33:
mov byte ptr [160*240+si],' '
add si,2
loop g33
pop cx
pop ds
pop es
pop si
ret
s0end:
nop
code ends
end start | | |