gemini_gg 发表于 2012-6-29 09:04:03

寄存器长度和段的理解

在8086中,寄存器ax,bx是16位,al ah是8位。并且最大的位数是16位。
但是在80386中,寄存器ax, bx是32位,另外还有48,32, 16位的寄存器。比如段描述符是48,
为啥段寄存器是16位,是为了和8086兼容吗?
在80386中,段的概念已经改变了。不在用cs,ds这些表示段了。而是程序的标号会放到不同的段,这里的段对应着线性地址。(这句话理解的对不?)

忘赐教。

Tzdner_C 发表于 2012-6-29 13:49:45

首先你已经打错而特错了。。。80386里面段寄存器是96位的,不是16位,线性地址是
段寄存器是个结构体,里面有一项是base,    例如 mov eax,ds: ,这里的0x12345678是有效地址,ds.base + 0x12345678 才是线性地址, 80386里面ds.base的值被初始化为0,所以一直省略不写的。。。

Tzdner_C 发表于 2012-6-29 13:51:53

若是楼主无法理解我说的段寄存器是96位的话,还是不要纠结了。。。程序员里面懂段的人没有几个。。。

今宵酒醒何处 发表于 2012-6-29 19:03:48

例如给出逻辑地址:21h:12345678h转换为线性地址a. 选择子.SEL=21h=000000000.0100 0 01b. .他代表的意思是:选择子的index=4即100b选择GDT中的第4个描述符;TI=0代表选择子是在GDT选择;左后的01b代表特权级RPL=1学习

今宵酒醒何处 发表于 2012-6-29 19:08:50

例如给出逻辑地址:21h:12345678h转换为线性地址a. 选择子.SEL=21h=000000000.0100 0 01b. .他代表的意思是:选择子的index=4即100b选择GDT中的第4个描述符;TI=0代表选择子是在GDT选择;左后的01b代表特权级RPL=1b. OFFSET=12345678h若此时GDT第.四个描述符中描述的段基址(Base)为11111111h,则线性地址=11111111.h.+12345.678h=23456789h

gemini_gg 发表于 2012-6-29 21:59:08

看来选择子是16位。 深入问下,选择子不是用段寄存器表示吗?

段寄存器是个结构体>>> 楼上提到这个,我认为寄存器应该是个硬件,应该在CPU内部。 但其地址是可以看作是线性4G的一部分。 楼上提到是96位的,确实不知道。

GDT、LDT应该是48位吧。

gemini_gg 发表于 2012-6-29 22:00:36

今宵酒醒何处 发表于 2012-6-29 19:08 static/image/common/back.gif
例如给出逻辑地址:21h:12345678h转换为线性地址a. 选择子.SEL=21h=000000000.0100 0 01b. .他代表的意思 ...

这部分的转化是硬件做的,还是用软件做的?

Tzdner_C 发表于 2012-6-30 00:43:35

gemini_gg 发表于 2012-6-29 21:59 static/image/common/back.gif
看来选择子是16位。 深入问下,选择子不是用段寄存器表示吗?

段寄存器是个结构体>>> 楼上提到这个,我 ...

例如:mov es,ax段寄存器是96位,只是CPU没有提供为96位寄存器赋值的指令,所以提供了GDTR寄存器,又缔造了GDT表,通过ax的值低三位清0,作为索引,GDTR.BASE 作为基质,在这个表里面用8个字节扩展为80位,再加上ax里面的16位,扩充成96位,赋值给es。这个赋值过程特别复杂,要经过重重判断。。。重重检查。。。LZ还是不要去纠结了。。。

hy19970612 发表于 2012-6-30 09:37:54

Tzdner_C 发表于 2012-6-29 13:49 http://hi.baidu.com/lovetolinux/blog/item/e000411a88f9e9178618bfaf.html

自从段寄存器不用在寻址上,而用在指向描述符表后!这个好像就变大了 !我没记错的话 好像是64位! 好像 没你说的这么大!希望你能 纠正一下你的答案 !最好百度下!

Tzdner_C 发表于 2012-6-30 10:21:06

hy19970612 发表于 2012-6-30 09:37 static/image/common/back.gif
Tzdner_C 发表于 2012-6-29 13:49 http://hi.baidu.com/lovetolinux/blog/item/e000411a88f9e917861 ...

还好像没我说的这么大。。。我没百度过,但是段寄存器里面的结构,我能一一列举出来,我不是说了吗,懂段的人没几个,所以不跟你们扯了。。。。扯了也白扯。。。。。

今宵酒醒何处 发表于 2012-6-30 15:11:08

gemini_gg 发表于 2012-6-29 22:00 static/image/common/back.gif
这部分的转化是硬件做的,还是用软件做的?

这是属于windows的分段保护机制 是windows系统完成的,不是硬件做的。

gemini_gg 发表于 2012-6-30 21:36:11

刚才写了个程序,研究下段的问题#include <stdio.h>
int temp;
int main()
{
    int i;
    int m;
    int str;
    i=0;
    m=10;
    for (i=0;i++;i<1024*1024)
    str=i;
    for (i=0;i++;i<1024*1024)
    temp=i;
    printf("%d\n",str);
    return 0;
}
gcc -o 1 1.c

***
ls -l 1
-rwxr-xr-x 1 jianxueqd1 group20 6831 Jun 30 21:21 1
显示文件有6831个字节,用ultra edit 打开后,可以看到文件有1aae字节.
***

用objdump 分析文件的段
objdump -h 1

1:   file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File offAlgn
0 .interp       0000001c00000000004002000000000000400200000002002**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020000000000040021c000000000040021c0000021c2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .gnu.hash   0000001c00000000004002400000000000400240000002402**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .dynsym       0000006000000000004002600000000000400260000002602**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .dynstr       0000003f00000000004002c000000000004002c0000002c02**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .gnu.version0000000800000000004003000000000000400300000003002**1
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .gnu.version_r 0000002000000000004003080000000000400308000003082**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
7 .rela.dyn   0000001800000000004003280000000000400328000003282**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .rela.plt   0000003000000000004003400000000000400340000003402**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .init         0000001800000000004003700000000000400370000003702**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
10 .plt          0000003000000000004003880000000000400388000003882**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
11 .text         0000023800000000004003c000000000004003c0000003c02**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .fini         0000000e00000000004005f800000000004005f8000005f82**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .rodata       0000001400000000004006080000000000400608000006082**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
14 .eh_frame_hdr 00000024000000000040061c000000000040061c0000061c2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
15 .eh_frame   0000009400000000004006400000000000400640000006402**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
16 .ctors      0000001000000000006006d800000000006006d8000006d82**3
                  CONTENTS, ALLOC, LOAD, DATA
17 .dtors      0000001000000000006006e800000000006006e8000006e82**3
                  CONTENTS, ALLOC, LOAD, DATA
18 .jcr          0000000800000000006006f800000000006006f8000006f82**3
                  CONTENTS, ALLOC, LOAD, DATA
19 .dynamic      0000019000000000006007000000000000600700000007002**3
                  CONTENTS, ALLOC, LOAD, DATA
20 .got          0000000800000000006008900000000000600890000008902**3
                  CONTENTS, ALLOC, LOAD, DATA
21 .got.plt      0000002800000000006008980000000000600898000008982**3
                  CONTENTS, ALLOC, LOAD, DATA
22 .data         0000000400000000006008c000000000006008c0000008c02**2
                  CONTENTS, ALLOC, LOAD, DATA
23 .bss          0040002000000000006008e000000000006008e0000008c42**5
                  ALLOC
24 .comment      0000011400000000000000000000000000000000000008c42**0
                  CONTENTS, READONLY

***
里面的file off字段,说明了每个段在文件的位置。 如果与文件想对应的位置比较每个段的内容,大部分都能对起来。对于这个程序有以下地方与文件对应不起来。
1)23 .bss 段
按照它的提示是从文件偏移000008c4处 有00400020个字节是bss段。 但是这部分不知道如何用objdump出来。
24 .comment
这一段也不知道如何用objdump。 为啥它和.bss段的偏移地址一样。

前面也提到文件是1aae个字节,可是从objdump中,只看到从8c4的偏移。那剩下的字节是属于什么的
页: [1]
查看完整版本: 寄存器长度和段的理解