鱼C论坛

 找回密码
 立即注册
查看: 6022|回复: 11

[争议讨论] 寄存器长度和段的理解

[复制链接]
发表于 2012-6-29 09:04:03 | 显示全部楼层 |阅读模式

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

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

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

忘赐教。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-29 13:49:45 | 显示全部楼层
首先你已经打错而特错了。。。80386里面段寄存器是96位的,不是16位,线性地址是
段寄存器是个结构体,里面有一项是base,    例如 mov eax,ds:[0x12345678] ,这里的0x12345678是有效地址,ds.base + 0x12345678 才是线性地址, 80386里面ds.base的值被初始化为0,所以一直省略不写的。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-29 13:51:53 | 显示全部楼层
若是楼主无法理解我说的段寄存器是96位的话,还是不要纠结了。。。程序员里面懂段的人没有几个。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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=1  b. OFFSET=12345678h若此时GDT第.四个描述符中描述的段基址(Base)为11111111h,则线性地址=11111111.h.+12345.678h=23456789h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-6-29 21:59:08 | 显示全部楼层
看来选择子是16位。 深入问下,选择子不是用段寄存器表示吗?

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

GDT、LDT应该是48位吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-6-29 22:00:36 | 显示全部楼层

这部分的转化是硬件做的,还是用软件做的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-30 00:43:35 | 显示全部楼层
gemini_gg 发表于 2012-6-29 21:59
看来选择子是16位。 深入问下,选择子不是用段寄存器表示吗?

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

例如:mov es,ax段寄存器是96位,只是CPU没有提供为96位寄存器赋值的指令,所以提供了GDTR寄存器,又缔造了GDT表,通过ax的值低三位清0,作为索引,GDTR.BASE 作为基质,在这个表里面用8个字节扩展为80位,再加上ax里面的16位,扩充成96位,赋值给es。  这个赋值过程特别复杂,要经过重重判断。。。重重检查。。。LZ还是不要去纠结了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-30 09:37:54 | 显示全部楼层
[quote]Tzdner_C 发表于 2012-6-29 13:49 http://hi.baidu.com/lovetolinux/blog/item/e000411a88f9e9178618bfaf.html

自从段寄存器不用在寻址上,而用在指向描述符表后!这个好像就变大了 !我没记错的话 好像是64位! 好像 没你说的这么大!希望你能 纠正一下你的答案 !最好百度下!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-30 10:21:06 | 显示全部楼层
hy19970612 发表于 2012-6-30 09:37
[quote]Tzdner_C 发表于 2012-6-29 13:49 http://hi.baidu.com/lovetolinux/blog/item/e000411a88f9e917861 ...

还好像没我说的这么大。。。我没百度过,但是段寄存器里面的结构,我能一一列举出来,我不是说了吗,懂段的人没几个,所以不跟你们扯了。。。。扯了也白扯。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-30 15:11:08 | 显示全部楼层
gemini_gg 发表于 2012-6-29 22:00
这部分的转化是硬件做的,还是用软件做的?

这是属于windows的分段保护机制 是windows系统完成的,不是硬件做的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-6-30 21:36:11 | 显示全部楼层
刚才写了个程序,研究下段的问题
  #include <stdio.h>
  int temp[1024*1024];
  int main()
  {
    int i;
    int m;
    int str[1024*1024];
    i=0;
    m=10;
    for (i=0;i++;i<1024*1024)
    str[i]=i;
    for (i=0;i++;i<1024*1024)
    temp[i]=i;
    printf("%d\n",str[0]);
    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 off  Algn
  0 .interp       0000001c  0000000000400200  0000000000400200  00000200  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .note.ABI-tag 00000020  000000000040021c  000000000040021c  0000021c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .gnu.hash     0000001c  0000000000400240  0000000000400240  00000240  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .dynsym       00000060  0000000000400260  0000000000400260  00000260  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .dynstr       0000003f  00000000004002c0  00000000004002c0  000002c0  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .gnu.version  00000008  0000000000400300  0000000000400300  00000300  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 .gnu.version_r 00000020  0000000000400308  0000000000400308  00000308  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 .rela.dyn     00000018  0000000000400328  0000000000400328  00000328  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  8 .rela.plt     00000030  0000000000400340  0000000000400340  00000340  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  9 .init         00000018  0000000000400370  0000000000400370  00000370  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
10 .plt          00000030  0000000000400388  0000000000400388  00000388  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
11 .text         00000238  00000000004003c0  00000000004003c0  000003c0  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .fini         0000000e  00000000004005f8  00000000004005f8  000005f8  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .rodata       00000014  0000000000400608  0000000000400608  00000608  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
14 .eh_frame_hdr 00000024  000000000040061c  000000000040061c  0000061c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
15 .eh_frame     00000094  0000000000400640  0000000000400640  00000640  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
16 .ctors        00000010  00000000006006d8  00000000006006d8  000006d8  2**3
                  CONTENTS, ALLOC, LOAD, DATA
17 .dtors        00000010  00000000006006e8  00000000006006e8  000006e8  2**3
                  CONTENTS, ALLOC, LOAD, DATA
18 .jcr          00000008  00000000006006f8  00000000006006f8  000006f8  2**3
                  CONTENTS, ALLOC, LOAD, DATA
19 .dynamic      00000190  0000000000600700  0000000000600700  00000700  2**3
                  CONTENTS, ALLOC, LOAD, DATA
20 .got          00000008  0000000000600890  0000000000600890  00000890  2**3
                  CONTENTS, ALLOC, LOAD, DATA
21 .got.plt      00000028  0000000000600898  0000000000600898  00000898  2**3
                  CONTENTS, ALLOC, LOAD, DATA
22 .data         00000004  00000000006008c0  00000000006008c0  000008c0  2**2
                  CONTENTS, ALLOC, LOAD, DATA
23 .bss          00400020  00000000006008e0  00000000006008e0  000008c4  2**5
                  ALLOC
24 .comment      00000114  0000000000000000  0000000000000000  000008c4  2**0
                  CONTENTS, READONLY

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

前面也提到文件是1aae个字节,可是从objdump中,只看到从8c4的偏移。那剩下的字节是属于什么的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-20 09:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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