|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
关于cs代码段之前有些误解,这里贴出来,希望对大家有点帮助。
大家看书中的这段代码:
assume cs:codesg;
codesg segment
dw 0123H, 0456H, 0789H, 0ABCH, 0DEFH, 0FEDH, 0CBAH,0987H
dw 0, 0, 0, 0, 0, 0, 0, 0 ;用dw定义8个字型数据,在程序加载后将8个字的
;内存空间,存放这8个数据。我们在后面的程序中
;将这段空间当作栈来使用
start:
mov ax,cs ;问题出在这里
mov ss,ax
mov sp,32
mov bx,0
mov cx,8
pl:
push cs[bx]
add bx,2
loop pl
mov bx,0
mov cx,8
pol:
pop cs[bx]
add bx,2
loop pol
mov ax,4c00H
int 21H
codesg ends
end start
现在描述下问题误区。codesg 被定义为代码段。
在codesg段里面,定义了2 组长度为 8 的 '字' 型 数据。每组为大小16 ,2组就是32。
从代码中可以看出cs的地址就是codesg的地址。
但是代码运行是从start出开始,也就是codesg + 32的位置。那么cs应该是codesg+32才对。
我一直纠结为什么cs有2中可能的值。
后来debug测试发现,cs的地址实际上就是csdesg的地址无疑。否则程序也没办法访问到两个dw的数据组
start标号处确定是靠ip寄存器确定的。ip的值为20H
所以编译器实际上是把 assume cs:codesg;定义的codesg确定为cs寄存器的值。
而end start 标号的值确定为ip寄存器。
结果是,codesg:start 对应 cs:ip
|
|