quchuan 发表于 2013-6-21 11:15:06

关于cs代码段的误解,希望对大家有用

关于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
                add bx,2
                loop pl
               
                mov bx,0
                mov cx,8
        pol:
                pop cs
                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


页: [1]
查看完整版本: 关于cs代码段的误解,希望对大家有用