注册 登录
编程论坛 汇编论坛

新手求教:关于DS、CS和程序起始地址的问题?

szeeper 发布于 2012-07-14 00:02, 3358 次点击
问题来源:王爽老师《汇编语言》7.3部分有几句话理解不透彻

程序:
sassume: cs:code,ds:data
data segment
db 'unIX'
db 'foRK'
data ends
code segment
start: mov al,'a'
mov bl,'b'
mov ax,4c00h
int 21h
code ends
end start

书上原文说“用R命令分析一下data段的地址,因‘ds=0B2D’,所以程序从0B3DH段开始(此时CS=0B3EH),data段又是程序中的第一个段,它就在程序的起始处,所以它的段地址为0B3DH。”

我的疑问:
1.按书上的逻辑,为什么DS=0B2D,就知道程序从0B3DH开始呢?按我的理解,应该CS=0B3E才指向程序起始处啊!我在之前试验过,DS与程序的起始地址没有关系,只要有start标记;
2.若就认为在定义数据之后,紧接着是指令。那我只定义了8个字节的数据,即由DS=0B2D可推算出程序应该从0B2E开始啊,怎么会是0B3D开始呢?

初学,请前辈解答,谢谢!
24 回复
#2
lonmaor2012-07-14 09:06
虽然写的db,但字符串中每一个字符所占空间为1 word,也就是最大为FFh的空间,在debug中用d命令查看数据段即可。字符串在数据段中是明文存放的。
考虑下,如果把两个字符分别置于一个字的高位和地位,你还能看到明文不
记得前两天z版说过,写db不写dw是习惯需求。
#3
zklhp2012-07-14 11:59
但字符串中每一个字符所占空间为1 word

一个byte罢

2 bytes = 1 word
#4
szeeper2012-07-14 12:20
回复 2楼 lonmaor
谢谢!我又试了一下,总结一下,看看说说的对否:
当DEBUG 将程序载入内存中时,还没有开始执行指令,从低地址到高地址,寄存器内容含义如下:
1.DS里面存放的是13B8,也就是PSP的起始地址;
2.SS里面是13C8,是紧接着PSP(占256KB),存放的数据段的起始地址;
3.CS里面是13C9,紧接着数据段,存放的是指令的起始地址。
4.综上,在声明字符串开辟内存空间时,如果不用mov ax,data;mov ds,ax来定位数据段起始地址,是可以通过上面3点知道PSP、数据段、代码段的起始地址的。
求教,不知我的猜想是否正确?
#5
zklhp2012-07-14 12:25
分析的很好 不过 对不对我也不知道。。
#6
szeeper2012-07-14 12:27
回复 3楼 zklhp
请教Z版主,你所说的即使用“db”来声明字符串,每个字符都占1Byte。这个规律只是适用于8086CPU吗?还是说INTEL其它CPU也是这种情况呢?
#7
zklhp2012-07-14 12:32
db这个伪指令就是定义字节 define byte 我这么理解的
#8
zklhp2012-07-14 12:33
只要是支持这个伪指令 肯定是这个功能 这个错不了
#9
szeeper2012-07-14 12:47
回复 8楼 zklhp
谢谢!明白了:
1.db 11h,21h,31h这种往内存里直接指定二进制数的情况,就占1Byte;
2.db 'hello'这种以字符串形式往内存写ascci码的情况,1个字符就占1Word。
#10
zklhp2012-07-14 12:49
不是 我可没说1个字符占1个word

我认为一个字符占一个byte
#11
zklhp2012-07-14 12:51
如果是unicode 还得是utf-16 utf-32 这样的 一个英文字符才不占一个字节

貌似utf-8 也是占一个字节罢
#12
szeeper2012-07-14 12:55
以下是引用zklhp在2012-7-14 11:59:17的发言:

但字符串中每一个字符所占空间为1 word

一个byte罢

2 bytes = 1 word
搞糊涂了呢?
#13
zklhp2012-07-14 12:59
字节        字            双字

byte        word        double-word

两个字节是一个字 双字相当于两个字也就是四字节

这个没有什么疑问罢
#14
szeeper2012-07-14 13:10
回复 13楼 zklhp
恩,这个没有疑问的。我的疑问在于你在3楼的回复:

“但字符串中每一个字符所占空间为1 word

一个byte罢

2 bytes = 1 word”

刚刚不是说一个字符占1Byte吗?
#15
zklhp2012-07-14 13:13
你没发现我那条回复里面的第一句属于引用么 我没打标签罢了

看来标签很重要啊

#16
zklhp2012-07-14 13:15
以下是引用lonmaor在2012-7-14 09:06:05的发言:

虽然写的db,但字符串中每一个字符所占空间为1 word,也就是最大为FFh的空间,在debug中用d命令查看数据段即可。字符串在数据段中是明文存放的。
考虑下,如果把两个字符分别置于一个字的高位和地位,你还能看到明文不
记得前两天z版说过,写db不写dw是习惯需求。

但字符串中每一个字符所占空间为1 word
一个byte罢
2 bytes = 1 word


连起来看你应该能看懂
#17
lonmaor2012-07-14 13:28
data segment
    ; add your data here!
    pkey db "press any key...$"
ends

只有本站会员才能查看附件,请 登录

迷茫了,求搭救
#18
lonmaor2012-07-14 13:30
顺便说一句,猎豹浏览器居然不支持论坛发附件
#19
zklhp2012-07-14 13:38
这个截图里面 一个字符不是占了一个字节么 不就是一个byte么
#20
zklhp2012-07-14 13:39
猎豹 一个chromium加上一个外壳弄出来的浏览器
#21
lonmaor2012-07-14 13:42
以下是引用zklhp在2012-7-14 13:38:24的发言:

这个截图里面 一个字符不是占了一个字节么 不就是一个byte么
好像明白了一点,我把地址和数据搞混了
#22
szeeper2012-07-14 13:43
回复 20楼 zklhp
这下才真明白了,谢谢Z版主耐心解答!
#23
zklhp2012-07-14 13:47
别忘了结题
#24
寒寺2020-11-07 16:51
1.ds=0B2D,加载后首先存放PSP=256字节,之后才是程序,因此程序从0B3D开始。
2.程序段中依次是数据段 代码段,代码中数据共8字节,但由于8086CPU规定段是16字节对齐,因此即使数据段中只有8字节数据,该段长度也是16字节,这里可以从140页图7.1看出,-d显示不足16字节处补0。关于16字节对齐在135页习题(2)中的第四小问中也有体现。
#25
iwbtnoo2023-04-12 23:28
谢各位前辈赐教,救老命了
1