• 80386的各种寄存器一览


    注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早,分析的版本为2.4.16,故出现的一些概念可能跟最新版本内核不同。

    此书已经开源,阅读地址 http://www.kerneltravel.net


    1、通用寄存器(32位)


    • EAX:一般用作累加器
    • EBX:一般用作基址寄存器(Base)
    • ECX:一般用来计数(Count)
    • EDX:一般用来存放数据(Data)
    • ESP:一般用作堆栈指针(Stack Pointer)
    • EBP:一般用作基址指针(Base Pointer)
    • ESI:一般用作源变址(Source Index)
    • EDI:一般用作目标变址(Destinatin Index)

    2、段寄存器(16位)

    • CS:代码段寄存器
    • DS:数据段寄存器
    • SS:堆栈段寄存器
    • ES、FS 及GS:附加数据段寄存器

    这些段寄存器中存放的不再是某个段的基地址,而是某个段的选择符(Selector。因为16 位的寄存器无法存放32 位的段基地址,段基地址只好存放在段的描述符(Descriptor)中。


    3、标志和控制寄存器(32位)

    标志寄存器 EFLAGS
    指令指针 EIP
    机器状态字 CR0
    Intel 预留 CR1
    页故障地址 CR2
    页目录地址 CR3

    指令指针寄存器(EIP)中存放下一条将要执行指令的偏移量(offset ),这个偏移量是相对于目前正在运行的代码段寄存器(CS)而言的。偏移量加上当前代码段的基地址,就形成了下一条指令的地址。







    4、系统地址寄存器

    • 全局描述符表寄存器GDTR(Global Descriptor Table Register ),是48 位寄存器,用来保存全局描述符表(GDT)的32 位基地址和GDT 的大小(16位)。

    • 中断描述符表寄存器IDTR(Interrupt Descriptor Table Register),是48 位寄存器,用来保存中断描述符表(IDT)的32 位基地址和IDT 的大小(16位)。

    • 局部描述符表寄存器LDTR(Local Descriptor Table Register ),是16 位寄存器,保存局部描述符表LDT 段的选择符。

    • 任务状态寄存器TR(Task State Register)是16 位寄存器,用于保存任务状态段TSS 段的16 位选择符。



    5、调试寄存器和测试寄存器(32位)


    80386 有两个32 位的测试寄存器TR6 和TR7。TR6 是测试命令寄存器,其内存放测试控制命令。TR7 是数据寄存器,其内保存转换旁路缓冲器测试的数据。
  • 相关阅读:
    【转】Linux 用cp和rsync同步文件时跳过指定目录
    解决svn错误:postcommit hook failed (exit code 1) with output
    Linux下如何使cp命令不提示覆盖文件
    Linux tar压缩时排除某个目录或文件的参数
    ecshop中404错误页面 .
    Linux如何查看当前目录下文件的个数
    Meta Property=og标签在SEO中的应用
    mysql mysqldump只导出表结构或只导出数据的实现方法
    slaveskiperrors( 转)
    自定义404错误页面返回状态码分析
  • 原文地址:https://www.cnblogs.com/alantu2018/p/8471955.html
Copyright © 2020-2023  润新知