鱼C论坛

 找回密码
 立即注册
查看: 2342|回复: 0

[技术交流] 关于cs代码段的误解,希望对大家有用

[复制链接]
发表于 2013-6-21 11:15:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 07:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表