80x86系列CPU的寄存器大全(带注释)
8086CPU和80386CPU的寄存器大全(带注释)
808680386
8086
8086 CPU是一款由英特尔公司推出的16位微处理器,它具有14个寄存器,其中8个通用寄存器、4个段寄存器和2个指针寄存器。下面对这些寄存器进行详细解释:
1. 通用寄存器
- AX(Accumulator Register):累加寄存器,主要用于算术运算和数据传输。
- BX(Base Register):基址寄存器,主要用于保存内存地址。
- CX(Counter Register):计数寄存器,主要用于循环控制和移位操作。
- DX(Data Register):数据寄存器,主要用于输入输出和乘除法运算。
- SI(Source Index Register):源索引寄存器,主要用于字符串操作。
- DI(Destination Index Register):目标索引寄存器,主要用于字符串操作。
- BP(Base Pointer Register):基址指针寄存器,用于存储堆栈的基地址。
- SP(Stack Pointer Register):栈指针寄存器,用于指向当前堆栈的栈顶。
2. 段寄存器
- CS(Code Segment Register):代码段寄存器,用于存储代码段的基地址。
- DS(Data Segment Register):数据段寄存器,用于存储数据段的基地址。
- SS(Stack Segment Register):堆栈段寄存器,用于存储堆栈段的基地址。
- ES(Extra Segment Register):附加段寄存器,可用于存储其他数据段的基地址。
3. 指针寄存器
- IP(Instruction Pointer):指令指针寄存器,用于存储下一条要执行的指令地址。
- FLAGS(Flags Register):标志寄存器,用于存储某些条件码和状态信息,如进位标志、零标志、符号标志等。
80386
80386 CPU是一款由英特尔推出的32位微处理器,相比于8086 CPU,它拥有更多的寄存器。下面是80386 CPU中的寄存器及其详细解释:
通用寄存器
EAX(Extended Accumulator Register):扩展累加寄存器,主要用于存储函数返回值、系统调用号、错误代码和整数值。
EAX 寄存器在汇编语言中常用于以下几个方面:
1. 存储函数返回值
EAX 寄存器通常被用来存储函数的返回值。例如,在调用一个返回整数值的函数时,可以将该函数的返回值存储到 EAX 寄存器中。
2. 存储系统调用号
在进行系统调用时,EAX 寄存器通常被用来存储系统调用号。例如,在进行 sys_read 和 sys_write 系统调用时,需要将相应的系统调用号存储到 EAX 寄存器中,以告诉内核要执行哪种操作。
Linux x86系统调用号是通过软中断指令(int 0x80)来触发的。每个系统调用都有一个唯一的系统调用号(syscall number),用于标识要执行的操作。这些系统调用号存储在 EAX 寄存器中,并作为参数传递给内核。下面是一些常见的Linux x86系统调用号及其功能的详细说明:
sys_exit (1): 退出当前进程。
sys_fork (2): 创建一个子进程。
sys_read (3): 从文件描述符中读取数据。
sys_write (4): 将数据写入文件描述符。
sys_open (5): 打开一个文件。
sys_close (6): 关闭文件描述符。
sys_waitpid (7): 等待一个子进程退出。
sys_creat (8): 创建一个新文件。
sys_link (9): 创建一个硬链接。
sys_unlink (10): 删除一个文件。
sys_execve (11): 在当前进程中执行一个新的程序。
sys_chdir (12): 改变当前工作目录。
sys_time (13): 获取系统时间。
sys_mknod (14): 创建一个设备节点。
sys_chmod (15): 改变文件权限。
sys_lchown (16): 改变文件所有权。
sys_stat (18): 获取文件状态信息。
sys_lseek (19): 移动文件指针。
sys_getpid (20): 获取当前进程ID。
sys_mount (21): 挂载文件系统。
此外,Linux 内核还支持许多其他的系统调用,如文件操作、进程管理、网络通信等。可以通过查看系统头文件的定义或使用 man 命令查看帮助文档来了解更多系统调用及其用法。
总之,系统调用号是标识 Linux 系统中不同系统调用的整数编号,每个系统调用都有一个唯一的系统调用号。在使用系统调用时,根据需要将相应的系统调用号存储到 EAX 寄存器中,并向内核发出相应的请求。
3. 存储错误代码
当某个系统调用发生错误时,EAX 寄存器可以用于存储错误代码。例如,在 sys_read 或 sys_write 调用失败时,内核会将错误代码存储到 EAX 寄存器中,并返回到用户空间,以便程序处理错误。
4. 存储整数值
EAX 寄存器可以用来存储 32 位整数值。例如,在进行加法或乘法运算时,可以将操作数存储到 EAX 寄存器中。
5. 存储商
EAX 寄存器可以用来存储 DIV运算的结果中的商。
EBX(Extended Base Register):扩展基址寄存器,主要用于存储基地址、文件描述符、函数返回值和指针地址。
EBX 寄存器在汇编语言中常用于以下几个方面:
1. 存储基地址
EBX 寄存器通常被用来存储数组或结构体的基地址。例如,在进行数组访问时,需要将数组的基地址存储到 EBX 寄存器中,然后加上偏移量以访问特定元素。
2. 存储文件描述符
在进行系统调用时,EBX 寄存器通常被用来存储文件描述符。例如,在进行 sys_read 和 sys_write 系统调用时,需要将文件描述符存储到 EBX 寄存器中,以指示要读取或写入的文件。
在 POSIX 标准中,定义了许多文件描述符(File Descriptor),它们用于向不同类型的文件进行 I/O 操作。以下是一些常用的文件描述符:
stdin(0):标准输入流文件描述符,对应于键盘或者其他输入设备。
stdout(1):标准输出流文件描述符,通常对应于终端或控制台窗口。
stderr(2):标准错误输出流文件描述符,通常也对应于终端或控制台窗口,但与 stdout(1) 不同的是,它主要用于输出程序执行过程中的错误信息和警告信息等。
除了上述三个标准文件描述符之外,还有一些其他的文件描述符可以在程序中使用,例如:
socket() 返回的文件描述符:用于进行网络编程中的套接字操作。
open() 返回的文件描述符:用于打开和创建文件,并进行读写操作。
pipe() 返回的文件描述符:用于进程间通信,实现管道操作等。
3. 存储函数返回值
在进行函数调用时,EBX 寄存器通常被用来存储函数的返回值。例如,在调用一个返回整数值的函数时,可以将该函数的返回值存储到 EBX 寄存器中。
4. 存储指针
EBX 寄存器还可以用于存储指针地址。在某些寻址方式中,EBX 寄存器可以存储指向数据或代码段的指针。
ECX(Extended Counter Register):扩展计数寄存器,主要用于存储循环计数器、字符串地址、对象地址和指针地址操作。
ECX 是 x86 架构 CPU 中的通用寄存器之一,它是 32 位寄存器,可用于存储数据、地址和指针等。
ECX 寄存器在汇编语言中常用于以下几个方面:
1. 存储循环计数器
ECX 寄存器通常被用来作为循环计数器。例如,在使用 LOOP 指令进行循环时,ECX 寄存器需要提前初始化为循环次数,并在每次循环迭代时递减,直到循环结束。
2. 存储字符串地址
在进行字符串操作时,ECX 寄存器通常被用来存储字符串的地址。例如,在使用 REP 指令进行字符串复制或比较时,需要将源字符串地址存储到 ECX 寄存器中。
3. 存储对象地址
在进行面向对象编程时,ECX 寄存器通常被用来存储对象的地址。例如,在调用对象方法时,需要将该对象的地址存储到 ECX 寄存器中。
4. 存储指针
ECX 寄存器还可以用于存储指针地址。在某些寻址方式中,ECX 寄存器可以存储指向数据或代码段的指针。
EDX(Extended Data Register):扩展数据寄存器,主要用于存储整数值、字符串长度、高位结果和指针地址等。
EDX 寄存器在汇编语言中常用于以下几个方面:
1. 存储整数值
EDX 寄存器可以用来存储 32 位整数值。例如,在一些寻址模式中,EDX 寄存器可能会存储数组或结构体元素的偏移量。
2. 存储字符串长度
EDX 寄存器通常被用来存储字符串的长度。在进行系统调用 sys_write 输出字符串时,需要将字符串长度存储到 EDX 寄存器中,以便告诉内核需要输出多少个字符。
3. 存储高位结果
在进行较大的乘法或除法运算时,产生的结果可能超出了 32 位寄存器的表示范围。此时可以使用 EDX 和 EAX 共同存储这个扩展的结果,其中 EAX 存储低位结果,EDX 则存储高位结果。
4. 存储指针
EDX 寄存器可以用于存储指针地址。在某些寻址方式中,EDX 寄存器可以存储指向数据或代码段的指针。
5. 存储余数
EDX 寄存器还可以用于存储DIV运算中的余数。
ESI(Extended Source Index Register):扩展源索引寄存器,主要用于字符串操作。EDI(Extended Destination Index Register):扩展目标索引寄存器,主要用于字符串操作。EBP(Extended Base Pointer Register):扩展基址指针寄存器,用于存储堆栈的基地址。ESP(Extended Stack Pointer Register):扩展栈指针寄存器,用于指向当前堆栈的栈顶。
段寄存器
CS(Code Segment Register):代码段寄存器,用于存储代码段的基地址。DS(Data Segment Register):数据段寄存器,用于存储数据段的基地址。SS(Stack Segment Register):堆栈段寄存器,用于存储堆栈段的基地址。ES(Extra Segment Register):附加段寄存器,可用于存储其他数据段的基地址。FS(F Segment Register):F段寄存器,用于存储操作系统定义的数据段的基地址。GS(G Segment Register):G段寄存器,用于存储操作系统定义的数据段的基地址。
3.指针寄存器
EIP(Extended Instruction Pointer):指令指针寄存器,用于指向CPU即将执行的下一条指令的地址。 它是一个32位的寄存器,用于存储当前代码段中的偏移地址。当CPU执行完一条指令后,会自动从EIP中读取下一条指令的地址,并将其送入指令缓冲器中等待执行。 在实模式下,EIP中存储的地址为16位,在保护模式下,EIP中存储的地址为32位。同时,在跳转、子程序调用或中断处理等过程中,EIP寄存器需要不断地更新。EFLAGS(Extended Flags Register):标志寄存器,主要用于存储CPU的状态信息和运算结果。它包含了一些条件码(Conditional Flags)和状态位(Status Flags),用于记录CPU当前的操作状态。 条件码是根据上一次运算结果而设置的标志位,用于判断条件语句是否成立。标志位则是根据CPU当前的运算状态而设置的标志位,用于记录CPU的运算结果和状态。常见的条件码和状态位有以下几种:
CF(Carry Flag):进位标志,记录最高位的进位情况。PF(Parity Flag):奇偶标志,记录运算结果中1的个数的奇偶性。AF(Auxiliary Carry Flag):辅助进位标志,记录低4位的进位情况。ZF(Zero Flag):零标志,记录运算结果是否为0。SF(Sign Flag):符号标志,记录运算结果的符号。OF(Overflow Flag):溢出标志,记录有符号数运算是否发生溢出。 除了以上常见的标志位外,EFLAGS还包含了其他一些特殊的标志位,如TF(Trap Flag)、IF(Interrupt Flag)和DF(Direction Flag)等。
控制寄存器
CR0(Control Register 0):控制寄存器0,用于控制系统的操作模式和保护模式。CR1-CR3(Control Register 1-3):控制寄存器1-3,用于存储一些辅助信息,如分页机制相关信息和虚拟地址映射的信息。CR4(Control Register 4):控制寄存器4,用于控制系统的一些扩展特性,如调试、保护模式等。
Debug寄存器
DR0-DR7(Debug Register 0-7):调试寄存器0-7,用于存储调试信息,如断点地址、读写访问类型等。
Test寄存器
TR6(Test Register 6):测试寄存器6,用于存储任务切换时的状态信息。