各个寄存器作用

本文详细介绍了不同体系下的寄存器名称(如rax、eax、ax等)以及它们在函数调用、数据存储和运算中的关键作用。涵盖了寄存器的结构、通用寄存器的拆分、内存地址和物理地址的概念,以及各类CPU寄存器如指令寄存器、程序计数器等的详细功能。同时,文章还提到了GDB命令和一些编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在此记录下寄存器的名称及作用,方便查看。

不同体系下寄存器名称:

|63…32|31…16|15-8|7-0|

|AH…AL…|

     |AX......|

|EAX…|

|RAX…|

不同寄存器作用:

rax 作为函数返回值使用

rsp 栈指针寄存器,指向栈顶

rdi,rsi,rdx,rcx,r8,r9 用作函数参数,依次对应第1参数,第2参数…

rbx,rbp,r12,r13,14,15 用作数据存储,遵循被调用者使用规则,简单说就是随便用,调用子函数之前要备份它,以防他被修改

r10,r11 用作数据存储,遵循调用者使用规则,简单说就是使用之前要先保存原值

参考:

https://msdn.microsoft.com/zh-cn/library/9z1stfyw.aspx

http://www.mouseos.com/x64/extend64.html

https://blog.csdn.net/lidonghat/article/details/70244288?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-2.highlightwordscore&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-2.highlightwordscore

另附上CSAPP实验里用到的GDB常用命令,方便查阅。

-objdump -d a.out>a.s 生成反汇编文档

gdb a.out 进入gbd

b *0x400000 设置断点

d 1 删除断点1

c 继续,跳过当前断点

info r 寄存器状态信息

info b 断点列表

p *0x400000 打印地址处双字(32bit)

p/x 16进制打印

p/s 0x400000 打印地址处字符串

p/s *(char *)($rax) 打印地址处字符

p/s (char *)($rax) 打印地址处字符串

CPU中的寄存器和地址概念

一般的CPU都是由以下部分组成:运算器、控制器和寄存器。

这些器件之间自然也要相互交换信息,所以他们也是有导线相连的,也就是总线了。但是这个总线是内部总线,而CPU和内存、显卡之类做信息交换的是外部总线。

他们的作用分别是:

运算器:信息处理

寄存器:信息储存

控制器:控制器件

好吧,从名字来看就很容易明白……

通用寄存器(8086CPU):

8086CPU寄存器都是16位的,可以存放两个字节,一个字节是八个二进制位哦。

它的通用寄存器有:AX,BX,CX,DX,话说就是ABCD嘛。

特殊的是这些寄存器都是可以拆成8位寄存器来使用,为了兼容。

AX可以拆分为AH和AL

BX可以拆分为BX和BL

CX可以拆分为CH和CL

DX可以拆分为DH和DL

H代表high的意思,L代表low的意思,这样是不是很好理解。

这个16位寄存器,说起来就是它里面可以存放0和1的小格子有16个。一个小格子就是一个二进制位。

来张图应该会很清晰,没网……以后补充吧……

说到这里,如果你看到这样的一个数字4E2C,不用慌张,它是一个16进制的数据。这种类型的数据,你只要死死记住,16禁止的一位,相当于二进制的四位,所以呢4E2C你要是换算成二进制,它是16个。

书上的例子是这样的:

4E20,这是一个16进制数,换算以后成二进制:0100111000100000,

4就是0100,E就是1110,2就是0010,0就是0000.怎么换算还不知道,请打你的计算机老师……

最后,有些时候我们不能一眼看出它是一个16进制数,或者说会有误解的时候,就会在十六进制数的后面加上一个H,这里的H不是high,而是Hex的意思。

二进制数呢,就会在后面加上B,也就是byte的意思,而十进制数就不用加了,毕竟都是小学都会的。

现在来使用寄存器吧!

首先呢,在写汇编代码的时候,你不用区分大小写。

比如:mov ax 22,这个是可以,他表示将22的数据送入AX寄存器

不仅可以把数据送进寄存器,还可以把其它寄存器的数据送过来,如:mov ax bx 它表示把BX中的数据送入AX,当然,BX的数据还在的哦。

如果你很高兴,mov AX 22 mov AX BX这种大写代码也是可以接受的……

这里说到了mov ax bx的情况,有时候如果说ax寄存器没有数据,那么一切ok,但是如果ax里面有数据会怎么样?这个时候把bx的数据送进来,那ax的数据还在吗?

答案是否定的,ax的数据将会被bx中传递过来的数据覆盖。

其实很好理解,这个ax这个容器很小,当你把别的数据是送进来,它只能以这种方式存储数据。

物理地址:

这里说的可不是你的MAC地址……

在内存当中,不管你的内存有多大,CPU在访问的时候都是把它当成一维的,这样确保了每个内存单元都有唯一的地址。嗯,不排除以后科技更牛逼……

这些内存单元的地址,就是它们的物理地址。

CPU会首先在内部安排好地址,然后再发出去。那么CPU是怎么发出地址的?自然是靠地址总线。

这里说的内存单元,绝不仅仅是内存条,还有显存之类的也属于内存单元。

在讨论CPU问题,其实涉及到的是计算机的工作原理,和本质,我们不应当将概念人为地局限为一个或者一种特殊器件。

原文链接:https://blog.csdn.net/xuancailinggan/article/details/50911290
**

CPU中的主要寄存器

**
在CPU中至少要有六类寄存器:指令寄存器(IR)、程序计数器(PC)、地址寄存器(AR)、数据寄存器(DR)、累加寄存器(AC)、程序状态字寄存器(PSW)。这些寄存器用来暂存一个计算机字,其数目可以根据需要进行扩充。

  1. 数据寄存器

数据寄存器(Data Register,DR)又称数据缓冲寄存器,其主要功能是作为CPU和主存、外设之间信息传输的中转站,用以弥补CPU和主存、外设之间操作速度上的差异。

数据寄存器用来暂时存放由主存储器读出的一条指令或一个数据字;反之,当向主存存入一条指令或一个数据字时,也将它们暂时存放在数据寄存器中。

数据寄存器的作用是 :

(1)作为CPU和主存、外围设备之间信息传送的中转站;

(2)弥补CPU和主存、外围设备之间在操作速度上的差异;

(3)在单累加器结构的运算器中,数据寄存器还可兼作操作数寄存器。

  1. 指令寄存器

指令寄存器(Instruction Register,IR)用来保存当前正在执行的一条指令。

当执行一条指令时,首先把该指令从主存读取到数据寄存器中,然后再传送至指令寄存器。

指令包括操作码和地址码两个字段,为了执行指令,必须对操作码进行测试,识别出所要求的操作,指令译码器(Instruction Decoder,ID)就是完成这项工作的。指令译码器对指令寄存器的操作码部分进行译码,以产生指令所要求操作的控制电位,并将其送到微操作控制线路上,在时序部件定时信号的作用下,产生具体的操作控制信号。

指令寄存器中操作码字段的输出就是指令译码器的输入。操作码一经译码,即可向操作控制器发出具体操作的特定信号。

  1. 程序计数器

程序计数器(Program Counter,PC)用来指出下一条指令在主存储器中的地址。

在程序执行之前,首先必须将程序的首地址,即程序第一条指令所在主存单元的地址送入PC,因此PC的内容即是从主存提取的第一条指令的地址。

当执行指令时,CPU能自动递增PC的内容,使其始终保存将要执行的下一条指令的主存地址,为取下一条指令做好准备。若为单字长指令,则(PC)+1àPC,若为双字长指令,则(PC)+2àPC,以此类推。

但是,当遇到转移指令时,下一条指令的地址将由转移指令的地址码字段来指定,而不是像通常的那样通过顺序递增PC的内容来取得。

因此,程序计数器的结构应当是具有寄存信息和计数两种功能的结构。

  1. 地址寄存器

地址寄存器(Address Register,AR)用来保存CPU当前所访问的主存单元的地址。

由于在主存和CPU之间存在操作速度上的差异,所以必须使用地址寄存器来暂时保存主存的地址信息,直到主存的存取操作完成为止。

当CPU和主存进行信息交换,即CPU向主存存入数据/指令或者从主存读出数据/指令时,都要使用地址寄存器和数据寄存器。

如果我们把外围设备与主存单元进行统一编址,那么,当CPU和外围设备交换信息时,我们同样要使用地址寄存器和数据寄存器。

  1. 累加寄存器

累加寄存器通常简称累加器(Accumulator,AC),是一个通用寄存器。

累加器的功能是:当运算器的算术逻辑单元ALU执行算术或逻辑运算时,为ALU提供一个工作区,可以为ALU暂时保存一个操作数或运算结果。

显然,运算器中至少要有一个累加寄存器。

  1. 程序状态字寄存器

程序状态字(Program Status Word,PSW)用来表征当前运算的状态及程序的工作方式。

程序状态字寄存器用来保存由算术/逻辑指令运行或测试的结果所建立起来的各种条件码内容,如运算结果进/借位标志(C)、运算结果溢出标志(O)、运算结果为零标志(Z)、运算结果为负标志(N)、运算结果符号标志(S)等,这些标志位通常用1位触发器来保存。

除此之外,程序状态字寄存器还用来保存中断和系统工作状态等信息,以便CPU和系统及时了解机器运行状态和程序运行状态。

因此,程序状态字寄存器是一个保存各种状态条件标志的寄存器。

原文链接:https://blog.csdn.net/kwame211/article/details/77773621

8086寄存器简介

https://blog.csdn.net/liukexiongjob2011/article/details/83945119?spm=1001.2101.3001.6650.8&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-8.highlightwordscore&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-8.highlightwordscore

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学无止境2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值