在gdb中查看汇编代码,可以使用display
命令或x
命令。
以下是一个示例程序,我们以它为例来演示如何在gdb中查看汇编代码。
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
int c = a + b;
printf("c = %d\n", c);
return 0;
}
我们使用gcc编译生成可执行文件。
gcc -g -o program program.c
然后,我们使用gdb启动程序。
gdb program
在gdb中,我们可以使用display命令查看汇编代码。以下是一个示例命令序列:
break main
run
display /i $pc
解释一下:
-
break main
:在main函数入口处设置一个断点,以便我们可以在这里开始执行程序。 -
run
:启动程序并运行到断点处。 -
display /i $pc
:显示当前指令的汇编代码。其中,/i
表示以汇编代码格式显示,$pc
表示当前程序的计数器的值,也就是当前指令的地址。
在gdb中,可以使用x
命令查看内存内容。以下是一个示例命令序列:
break *0x400510
run
x/x $pc
解释一下:
-
break *0x400510
:在地址0x400510处设置一个断点,以便我们可以在这里开始执行程序。这个地址是main函数的入口地址。 -
run
:启动程序并运行到断点处。 -
x/x $pc
:使用x
命令查看当前指令的地址和汇编代码。其中,/x
表示以十六进制格式显示,$pc
表示当前程序计数器的值,也就是当前指令的地址。
LDRSH
是ARM汇编语言中的一个指令,它的全称是"Load Register Signed Halfword"。这个指令从内存中加载一个16位的半字(halfword),并将其存储到目标寄存器中。如果内存中的值是负数,那么该值会被加载为补码形式。
这里是一个简单的示例:
LDRSH R0, [R1, #4] ; 从R1地址开始,偏移4个字节的位置加载一个16位的半字到R0寄存器
在这个示例中,LDRSH R0, [R1, #4]
会从R1
的地址开始,偏移4个字节的位置加载一个16位的半字到R0
寄存器。请注意,这是基于ARM的汇编语言,不同架构的处理器可能会有所不同。
嵌入式汇编中的LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。这个指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
例如,以下是一些LDR指令的使用示例
-
LDR R0, [R1]
:将存储器地址为R1的字数据读入寄存器R0 -
LDR R0, [R1, R2]
:将存储器地址为R1+R2的字数据读入寄存器R0 -
LDR R0, [R1, #8]
:将存储器地址为R1+8的字数据读入寄存器R0 -
LDR R0, [R1, R2]!
:将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1 -
LDR R0, [R1, #8]!
:将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1 -
LDR R0, [R1], R2
:将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1 -
LDR R0, [R1, R2, LSL#2]!
:将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1 -
LDR R0, [R1], R2, LSL#2
:将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1
嵌入式汇编中的STR指令用于将源寄存器中的一个32位的字数据传送到存储器中。这个指令通常用于将通用寄存器中的32位的字数据写入到存储器,然后对数据进行处理。文章来源:https://www.toymoban.com/news/detail-624386.html
例如,以下是一些STR指令的使用示例文章来源地址https://www.toymoban.com/news/detail-624386.html
-
STR R0, [R1]
:将R0中的字数据写入以R1为地址的存储器中 -
STR R0, [R1, #8]
:将R0中的字数据写入以R1+8为地址的存储器中 -
STR R0, [R1], #8
:将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1
到了这里,关于gdb调试时查看汇编代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!