Assembly 在汇编中跟踪简单程序
我创建了一个简单的c程序来添加两个数字:Assembly 在汇编中跟踪简单程序,assembly,arm,Assembly,Arm,我创建了一个简单的c程序来添加两个数字: void main(){ int a = 4; int b = 5; int c = a+b; } 并将其命名为test.c 我使用“armlinuxgcc-stest.c”创建test.S(汇编代码) 现在,我想在每个汇编指令之后查看16个寄存器中每个寄存器的值。 我该怎么办? 我没有任何汇编方面的经验,而且我对linux比较陌生,所以我 我不太了解所使用的工具。 请帮忙! 提前谢谢 objdump应该能够反汇编您的AR
void main(){
int a = 4;
int b = 5;
int c = a+b;
}
并将其命名为test.c
我使用“armlinuxgcc-stest.c”创建test.S(汇编代码)
现在,我想在每个汇编指令之后查看16个寄存器中每个寄存器的值。
我该怎么办?
我没有任何汇编方面的经验,而且我对linux比较陌生,所以我
我不太了解所使用的工具。
请帮忙!
提前谢谢 objdump应该能够反汇编您的ARM汇编代码。另一个选项可能是gdb,但我不确定它是否支持ARM。objdump应该能够反汇编ARM汇编代码。另一个选择可能是gdb,但我不确定它是否支持ARM。好吧,你说的是两件不同的事情。如果你想看到寄存器的内容,你需要执行程序,所以你需要制作一个二进制文件。针对一个系统,然后单步通过它。是的,如果正确的gdb指向正确的系统,gdb将工作。您还可以使用jtag调试器,单步执行,然后转储寄存器 这与汇编语言没有什么关系,当单步执行时,您会希望看到汇编语言级别的指令,当然,但您需要编译成二进制文件才能运行它 因为你的程序没有做任何你需要小心不要优化的事情,即使是a-O1优化也会删除你的代码 这里有一些东西可以试试。我有一个thumb指令集模拟器,thumb是ARM的16位子集(仍然在ARM系列中,与ARM指令的一对一关系)。转到github并下载它。在thumbulator.c中更改此循环:
int run ( void )
{
unsigned int ra;
reset();
while(1)
{
printf("-- 0x%08X --\n",reg_norm[15]-3);
if(execute()) break;
for(ra=0;ra< 8;ra++) printf("r%u 0x%08X ",ra,reg_norm[ra]); printf("\n");
for( ;ra<16;ra++) printf("r%u 0x%08X ",ra,reg_norm[ra]); printf("\n");
}
dump_counters();
return(0);
}
编辑Makefile
更改此行以使用编译器(我在构建过程中添加了-gcc)
ARMGNU=armlinux
从该管路上拆下-O2:
COPS=-Wall-mthumb-nostlib-nostartfiles-ffreserving
并将其更改为只构建gnu/gcc二进制文件,而不是llvm二进制文件
全部:gnotmain.bin
现在建造它
查看文件gnotmain.list,您将看到类似的内容,但不一定是这样,这取决于您的gcc
00000074 <notmain>:
74: b580 push {r7, lr}
76: b084 sub sp, #16
78: af00 add r7, sp, #0
7a: 2304 movs r3, #4
7c: 60fb str r3, [r7, #12]
7e: 2305 movs r3, #5
80: 60bb str r3, [r7, #8]
82: 68fa ldr r2, [r7, #12]
84: 68bb ldr r3, [r7, #8]
86: 18d3 adds r3, r2, r3
88: 607b str r3, [r7, #4]
8a: 2300 movs r3, #0
8c: 1c18 adds r0, r3, #0
8e: 46bd mov sp, r7
90: b004 add sp, #16
92: bd80 pop {r7, pc}
节目的主要内容
如果您想查看您正在尝试执行的优化代码,请在单独的.C文件中输入以下代码:
int xfun ( int a, int b )
{
return(a+b);
}
将其添加到项目中(单独编译到它自己的.o文件中)
把notmain改成这个
int xfun ( int, int );
int notmain ( void )
{
return(xfun(4,5));
}
现在你看到了你可能感兴趣的东西
00000080 <xfun>:
80: 1808 adds r0, r1, r0
82: 4770 bx lr
给予
当你深入研究它的本质时,会进行尾部优化。xfun的返回值与notmain的返回值相同,因此它不修改r14,让xfun返回给任何一个调用notmain的人
另一个文件:
arm-linux-gcc -S -O2 xbox.c
给予
由于ARM指令可以选择修改标志或不修改标志,因此您看不到mov和add,您可以看到mov和add,因为代码没有执行与这些指令相关的任何条件,因此它们没有生成s版本
我在几个GIDHub项目的中间,当我键入这个。mbed_样本是基于ARM cortex-m3(仅限thumb/thumb2指令)的微控制器板。我写了类似的长篇大论,讲述了引导和使用这些工具来构建和执行二进制文件(不久你就会想做的事情)。前几天我还刚刚发布了lsasim,不是ARM,与ARM无关,但其中包含LEARNASM.txt,这可能对第一次学习ASM很有用。C编译器的后端非常粗糙,我不会对它做太多的修改,请仔细阅读LEARNASM.txt教程。然后转到左侧目录下的ARMs网站,单击展开ARM架构,然后单击参考手册,查看可用的参考手册。在右侧,它将向您展示ARMv5 ARM(架构参考手册),在有这么多不同的内核之前,它曾被称为ARM。这将列出您正在构建的传统ARM 32位指令集。它还具有thumb指令集,该指令集在当前大多数ARM核上运行。Thumb2仅在一些内核上,您可能希望cortex-m3采用类似ARMv7-M的ARM,这将取代嵌入式微控制器的ARM7(ARM7是ARMv4T,我知道数字可能会混淆)。QEMU可以运行ARM、thumb和thumb2指令,但要让一些程序在您能够了解情况的地方运行,需要花费相当长的时间。gdb中有ARMulator,这是ARM出于各种原因长期使用的东西,我对gdb没有任何用处,所以我只知道那里有一个ARM模拟器(它有thumb,如果这很重要的话,可能还有thumb2)。这可能是运行一些东西和转储寄存器(基于arm的gdb)的最快途径。也许codesourcery附带了一个,如果不是寻找emdebian或者只是构建自己的。thumbulator也是一个选项,但我严格限制了它的拇指指令,它像cortex-m3一样引导,而不是手臂(如果你想的话,很容易改变)。mame有一个arm-it,但是要在mame之外的任何地方编译它并为它提供程序,可能比gdb中的armulator源代码要复杂得多
另一种完全不同的方法是从sparkfun.com上获得类似olimex sam7-h64板的产品,他们将以每块16美元左右的价格出售,过去是这一价格的两倍或三倍。它是ARM7,将运行ARM指令。买一个olimex wiggler或者我更喜欢amontek jtag tiny。然后,您可以使用jtag将程序加载到ram中,并在需要时通过它们一步转储任何或所有寄存器或内存。我不能马上想到我所知道的任何一块板,如果它运行ARM指令,但是在板上内置了jtag,那么今天用ftdi芯片做起来就微不足道了,取而代之的是基于cortex-m的微控制器正以这种方式出现
int xfun ( int a, int b )
{
return(a+b);
}
int xfun ( int, int );
int notmain ( void )
{
return(xfun(4,5));
}
00000080 <xfun>:
80: 1808 adds r0, r1, r0
82: 4770 bx lr
00000074 <notmain>:
74: b508 push {r3, lr}
76: 2004 movs r0, #4
78: 2105 movs r1, #5
7a: f000 f801 bl 80 <xfun>
7e: bd08 pop {r3, pc}
00000080 <xfun>:
80: 1808 adds r0, r1, r0
82: 4770 bx lr
arm-linux-gcc -S -O2 notmain.c
mov r0, #4
mov r1, #5
b xfun
arm-linux-gcc -S -O2 xbox.c
add r0, r1, r0
bx lr