wjp 发表于 2017-12-7 22:49:17

代码段偏移地址的问题


因为在代码段的最开始所以偏移地址为0,这个怎么理解?
是不是说所有的代码段开始处偏移地址都是0开始吗,物理内存的计算方式是ds*16+ip
如果说一个物理地址是11111这样的话ip不可能等于0呀,是不是说代码段不能以这个地址开始
那么是不是说系统给每个段分配内存都是从11100或11110这样的内存处开始的吗?

qq1242009750 发表于 2017-12-7 23:29:34

有可能{:7_113:}要不我们写些代码试试吧

wjp 发表于 2017-12-7 23:52:54

qq1242009750 发表于 2017-12-7 23:29
有可能要不我们写些代码试试吧

所以这里不理解呀,为啥要这样做,如果段足够多是不是就没地址给它分配了。。。。。

wjp 发表于 2017-12-8 00:08:22

qq1242009750 发表于 2017-12-7 23:29
有可能要不我们写些代码试试吧

嗯嗯可以试试

兰陵月 发表于 2017-12-8 09:54:20

本帖最后由 兰陵月 于 2017-12-8 09:58 编辑

实模式下(就是王爽那本书全书学习所在环境):
1、程序中的偏移地址就是编译之后的偏移地址,偏移地址只是一个相对于段首位置的偏移量,所以当它被加载到物理内存之后,该偏移量也是不会发生变化的。
2、按MASM编译器来说,比如说一个段,它叫codeseg,那它的段的形式如下:
codeseg segment
   mov ax,0;本段第1行
。。。。
codeseg ends
在上面的段的结构中,mov ax,0在codeseg段中的偏移地址就0x00
如果你象书上的一样,在段内的第一行,定义数据,那最开始的那个数据的偏移地址就是0x00
3、段地址都是能够被16整除的。不能被16整除的就不能作为段地址。
4、你说的代码段的开始处是不是指运行起始处。运行起始处不一定是偏移地址0x00

wjp 发表于 2017-12-8 13:59:01

兰陵月 发表于 2017-12-8 09:54
实模式下(就是王爽那本书全书学习所在环境):
1、程序中的偏移地址就是编译之后的偏移地址,偏移地址只 ...

我知道偏移地址是段首位置的偏移量,我想知道的是段首位置在内存中实际的地址是怎么样的,书上说实际的物理地址=段地址*16+偏移地址得到那书上说段首位置的偏移量是0,那不是说实际的物理内存=段地址*16+0那是不是说每个段首位置的实际物理地址都能被16整除?反过来说不能被16整除的都不能当分配给段首地址

兰陵月 发表于 2017-12-8 18:06:21

wjp 发表于 2017-12-8 13:59
我知道偏移地址是段首位置的偏移量,我想知道的是段首位置在内存中实际的地址是怎么样的,书上说实际的物 ...

是的,16位实模式下就是这样的,段地址必须能被16整除,否则不能做段地址。

wjp 发表于 2017-12-9 10:34:04

兰陵月 发表于 2017-12-8 18:06
是的,16位实模式下就是这样的,段地址必须能被16整除,否则不能做段地址。

哦哦,懂了,谢谢了
页: [1]
查看完整版本: 代码段偏移地址的问题