Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在汇编中跟踪简单程序_Assembly_Arm - Fatal编程技术网

Assembly 在汇编中跟踪简单程序

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

我创建了一个简单的c程序来添加两个数字:

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