LINUX中,如何查看CPU有哪些寄存器,其长度为多少?

LINUX中,如何查看CPU有哪些寄存器,其长度为多少?,第1张

这很难说,

CPU的16位、32位以及64位技术,指的是CPU一次性能处理的最大数据位。具体的,比较直观的,主要体现在CPU的主要寄存器的长度上。也就是从8086/8088那时候开始的AX,BX,CX,DX等等。

CPU的寄存器的长度,可以说,它代表了CPU一次性能处理的最大数值的能力。如果你了解二进制,这个就比较好理解:

两个64位的二进制数如果用32位的CPU做加法,是一件比较麻烦的事情,需要多条指令才能完成。

而对于64位的CPU来说,它计算64位的加法,只要一条指令。

所以,理论上说,64位的CPU的处理能力要强于32位的CPU。

但是,硬件的使用,需要相应的软件配合。如果64位的CPU上运行的是32位的代码,那么,该CPU的优势并不能发挥出来。

就如同一个高中生和一个初中生都计算1+1等于几的问题。

答案都可以算出来,速度都很快。但高中生的强项你是看不到的。

我们目前的 *** 作系统,除了LINUX/UNIX外,主要还是32位。

不是说没有64位的WINDOWS系统。像WINDOWS XP和WINDOWS VISTA都有64位的,但个人感觉用的人比较少。主要是因为64位的 *** 作系统,还需要64位的应用软件才能发挥出64位的优势。

而64位的软件的产生,目前来说,主要取决编译系统是否能生成64位代码。想想看,现在的大学,普遍都还在研究98年的VC6.0等编译系统,所以,64位的应用,现在只能说是起步。

以上说的是CPU的常规寄存器。事实上,CPU的其它某些专用寄存器,都有128位的了。

总的来说,64位CPU是目前的主流,32位在以后的10多年中会逐步淘汰---就如同当年的386出生后,16位的逐步淘汰。

具体参数及讲解如下:print命令的格式是:print xxxp xxx 1. print *** 作符@是一个和数组有关的 *** 作符,在后面会有更详细的说明。::指定一个在文件或是一个函数中的变量。{}表示一个指向内存地址的类型为type的一个对象。 2. 察看内容全局变量(所有文件可见的)静态全局变量(当前文件可见的)局部变量(当前Scope可见的) 如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量。如果此时你想查看全局变量的值时,你可以使用“::” *** 作符:file::variablefunction::variableeg:查看文件f2.c中的全局变量x的值:gdb) p 'f2.c'::x 注:如果你的程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。对付这种情况时,需要在编译程序时关闭编译优化。GCC,你可以使用“-gstabs” 选项来解决这个问题。3. 察看数组(1)动态数组:p *array@len array:数组的首地址,len:数据的长度eg:(gdb) p *array@len$1 = {2, 4, 6, 8, 10}(2)静态数组可以直接用print数组名,就可以显示数组中所有数据的内容了。4. 输出格式x 按十六进制格式显示变量。d 按十进制格式显示变量。u 按十六进制格式显示无符号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变量。c 按字符格式显示变量。f 按浮点数格式显示变量。eg:(gdb) p i$21 = 101(gdb) p/a i$22 = 0x65(gdb) p/c i$23 = 101 'e'5. 察看内存使用examine(简写x)来查看内存地址中的值。语法:x/n、f、u是可选的参数。(1)n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。(2)f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。(3)u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。eg:x/3uh 0x54320 :从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。6. 察看寄存器(1)要查看寄存器的值,很简单,可以使用如下命令:info registers(2)查看寄存器的情况。(除了浮点寄存器)info all-registers(3)查看所有寄存器的情况。(包括浮点寄存器)info registers(4)查看所指定的寄存器的情况。寄存器中放置了程序运行时的数据,比如程序当前运行的指令地址(ip),程序的当前堆栈地址(sp)等等。你同样可以使用print命令来访问寄存器的情况,只需要在寄存器名字前加一个$符号就可以了。如:p $eip。7. display自动显示的变量(1)格式:display[/i|s] [expression | addr]eg:display/i $pc$pc是GDB的环境变量,表示着指令的地址,/i则表示输出格式为机器指令码,也就是汇编。于是当程序停下后,就会出现源代码和机器指令码相对应的情形,这是一个很有意思的功能。(2)其他undisplaydelete display删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)disable displayenable displaydisable和enalbe不删除自动显示的设置,而只是让其失效和恢复。info display查看display设置的自动显示的信息。GDB会打出一张表格,向你报告当然调试中设置了多少个自动显示设置,其中包括,设置的编号,表达式,是否enable。8. 设置(1)set print addressset print address on打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。(2)set print arrayset print array on 打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。(3)set print elements这个选项主要是设置数组的,如果你的数组太大了,那么就可以指定一个来指定数据显示的最大长度,当到达这个长度时,GDB就不再往下显示了。如果设置为0,则表示不限制。(4)set print null-stop如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off。(5)set print pretty on如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮。如:$1 = {next = 0x0,flags = {sweet = 1,sour = 1},meat = 0x54 "Pork"}(6)set print union设置显示结构体时,是否显式其内的联合体数据。(7)set print object在C++中,如果一个对象指针指向其派生类,如果打开这个选项,GDB会自动按照虚方法调用的规则显示输出,如果关闭这个选项的话,GDB就不管虚函数表了。

不是很明白你的意思。寄存器是个硬件的结构,存在CPU中,比如EAX,EBX,ECX,EDX这些通用寄存器。硬件设备也会有寄存器,用来给软件提供控制的方法。比如显卡肯定有个寄存器来启用或者禁用。读写寄存器标准的使用IN,OUT指令(IA架构)。当然也会有把寄存器映射到内存空间,想读写内存一样读写寄存器。用户态程序一般是无法访问寄存器的,除非驱动程序把寄存器映射到用户进程空间


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/5919146.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-08
下一篇2023-03-08

发表评论

登录后才能评论

评论列表(0条)

    保存