寄存器长度和段的理解
在8086中,寄存器ax,bx是16位,al ah是8位。并且最大的位数是16位。但是在80386中,寄存器ax, bx是32位,另外还有48,32, 16位的寄存器。比如段描述符是48,
为啥段寄存器是16位,是为了和8086兼容吗?
在80386中,段的概念已经改变了。不在用cs,ds这些表示段了。而是程序的标号会放到不同的段,这里的段对应着线性地址。(这句话理解的对不?)
忘赐教。
首先你已经打错而特错了。。。80386里面段寄存器是96位的,不是16位,线性地址是
段寄存器是个结构体,里面有一项是base, 例如 mov eax,ds: ,这里的0x12345678是有效地址,ds.base + 0x12345678 才是线性地址, 80386里面ds.base的值被初始化为0,所以一直省略不写的。。。
若是楼主无法理解我说的段寄存器是96位的话,还是不要纠结了。。。程序员里面懂段的人没有几个。。。 例如给出逻辑地址:21h:12345678h转换为线性地址a. 选择子.SEL=21h=000000000.0100 0 01b. .他代表的意思是:选择子的index=4即100b选择GDT中的第4个描述符;TI=0代表选择子是在GDT选择;左后的01b代表特权级RPL=1学习 例如给出逻辑地址: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 看来选择子是16位。 深入问下,选择子不是用段寄存器表示吗?
段寄存器是个结构体>>> 楼上提到这个,我认为寄存器应该是个硬件,应该在CPU内部。 但其地址是可以看作是线性4G的一部分。 楼上提到是96位的,确实不知道。
GDT、LDT应该是48位吧。 今宵酒醒何处 发表于 2012-6-29 19:08 static/image/common/back.gif
例如给出逻辑地址:21h:12345678h转换为线性地址a. 选择子.SEL=21h=000000000.0100 0 01b. .他代表的意思 ...
这部分的转化是硬件做的,还是用软件做的? 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还是不要去纠结了。。。 Tzdner_C 发表于 2012-6-29 13:49 http://hi.baidu.com/lovetolinux/blog/item/e000411a88f9e9178618bfaf.html
自从段寄存器不用在寻址上,而用在指向描述符表后!这个好像就变大了 !我没记错的话 好像是64位! 好像 没你说的这么大!希望你能 纠正一下你的答案 !最好百度下! 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 ...
还好像没我说的这么大。。。我没百度过,但是段寄存器里面的结构,我能一一列举出来,我不是说了吗,懂段的人没几个,所以不跟你们扯了。。。。扯了也白扯。。。。。 gemini_gg 发表于 2012-6-29 22:00 static/image/common/back.gif
这部分的转化是硬件做的,还是用软件做的?
这是属于windows的分段保护机制 是windows系统完成的,不是硬件做的。 刚才写了个程序,研究下段的问题#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]