模拟ARM代码

时间:2013-01-26 17:54:15

标签: c linux ubuntu arm

我想模拟ARM代码。例如,我想运行这样的代码:

MOV    R0, #5
ADD    R0, R0, #1
//somehow output R0

它会在我的Ubuntu上的某些软件上输出6。有可能吗?

10 个答案:

答案 0 :(得分:10)

如果将其构建为实际的可执行文件,则可以使用QEMU的ARM模拟器来运行它。

答案 1 :(得分:10)

Keil MDK可用于模拟ARM代码。它提供了Simulate/Debug透视图,可用于探测ARM寄存器集,存储器内容等......

MDK-Lite评估版可免费获得,最大代码大小为32KB。

Linux版的MDK不可用。但是Keil MDK在Ubuntu中完全优于WINE


在WINE上安装Keil uVision MDK:

第1步:在Ubuntu上安装wine

打开终端并输入:

sudo apt-get install wine

第2步:下载Keil MDK

第3步:安装MDK

右键单击 MDK 可执行文件,然后选择“使用Wine Windows程序加载器打开”选项。

第4步:在Ubuntu上调用Keil uVision MDK

打开终端并输入:

wine ~/.wine/drive_c/Keil/UV4/Uv4.exe

第5步:安装Flash Magic(可选)

Flash Magic是一种用于下载Keil板软件的工具。下载Flash Magic Software并将其安装在葡萄酒上(参见前面的步骤)。

创建指向串行端口的COM1链接。打开终端并输入:

ln -s /dev/ttyS0 ~/.wine/dosdevices/COM1

Keil uVision MDK项目创建和调试:

第1步:为ARM7目标创建Keil UVision项目。

在Keil UVision工具栏中选择 Project - >新项目

导航到您要创建此项目的位置。

输入项目名称,然后单击保存

选择 ARM - > ARM7(Little Endian)作为Target的设备。单击“确定”。

第2步:为目标创建汇编源文件

在Keil UVision工具栏中选择文件 - >新。将以下代码添加到新创建的文件中:

    AREA text, code, readonly
    ENTRY

    MOV    R0, #5
    ADD    R0, R0, #1

    END

在每个汇编语句之前提供制表符空间,如上所述。使用'。s'扩展名保存文件。

第3步:将源文件添加到项目

在项目窗口(位于UVision的左侧),右键单击 Source Group 1 并选择“将文件添加到组源组1 ”选项。

选择 test.s ,然后点击'添加'。 (选择文件类型为 ASM源文件

enter image description here

第4步:构建源文件

在Keil UVision工具栏中选择 Project - >构建目标或按 F7 编译源文件。

第5步:模拟/调试应用

在Keil UVision工具栏中选择 Debug - >启动/停止调试会话或按 Ctrl + F5

调试透视图打开,左侧是“注册”视图,中间是“代码视图”,右下方是“内存”视图等。

enter image description here

使用调试键执行代码:

enter image description here

在程序执行结束时观察注册视图:

enter image description here

在Keil UVision工具栏中选择 Debug - >启动/停止调试会话或按 Ctrl + F5 退出调试透视图。

答案 2 :(得分:3)

你可以通过作为模拟器的QEMU运行arm代码,但我不认为你可以直接输出到另一个软件,因为QEMU也是一个软件但是你可以使用像共享内存甚至文件这样的东西(警告并发)访问文件可能需要互斥锁将结果从模拟器传递到主机软件并返回,即使它可能有点慢

答案 3 :(得分:3)

本文逐步介绍如何使用QEMU模拟裸金属ARM代码: http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/

当然,你不需要处理C的东西,可以直接将你的组件放在startup.s。

答案 4 :(得分:2)

我猜你所追求的是从{C}程序到printf ARM汇编函数返回的值的方法。您可以使用 arm-elf-gcc 工具链中提供的命令行模拟器arm-elf-run来完成此操作。您可以从http://www.gnuarm.com/bu-2.16.1_gcc-4.0.2-c-c++_nl-1.14.0_gi-6.4_x86-64.tar.bz2下载工具链。 (只需将存档解压缩到某个文件夹中,并可选择将<path>/gunarm-4.0.2/bin/附加到系统的PATH变量中)

首先,您需要将ARM代码排列到程序集(.s)文件中的汇编函数中,例如myasm.s。现在你需要用C语言编写一个测试代码(例如test.c)来调用汇编函数,并使用熟悉的printf()打印返回的值。您可以在下面找到源代码:

myasm.s:

                .align
                .global myasmfunc       @ Required, so that this func can be 
                                        @ accessed from main() in test.c

                                        @ A sample asm function that 
                                        @ returns the value 6
myasmfunc:      MOV     R0, #5
                ADD     R0, R0, #1      @ Now R0 contains 6.
                                        @ By the default ARM calling convention, 
                                        @ R0 will be used to pass return values
                                        @ to the calling function

                MOV     PC, LR          @ Return from myasmfunc()

test.c的:

#include <stdio.h>

int myasmfunc(void);

int main()
{
    int retval = myasmfunc();           // The value that was in R0 now 
                                        // gets copied into retval

    printf("retval = %d\n", retval);    // And print it..

    return 0;
}

两个文件准备就绪后,您可以使用arm-elf-gcc

将它们构建为ARM二进制文件
arm-elf-gcc -Wall test.c myasm.s -o test.out

然后使用arm-elf-run

运行二进制文件
arm-elf-run ./test.out

这将在您的Ubuntu终端上打印retval = 6:)

答案 5 :(得分:1)

您可以使用此git存储库中的代码作为起点:

https://github.iu.edu/geobrown/c335-assembly-examples

正如其他人所说,您首先需要安装QEMU来模拟ARM硬件,您需要有一些方法来编译代码(我推荐CodeSourcery Lite Edition Toolchain)。然后编辑TOOLROOT文件中的Makefile.common条目以指向工具链的安装位置,并在编写汇编代码并将其汇总到C测试后运行命令make test文件。

此存储库中的代码提供了一系列示例,您可以根据自己的需要进行调整,C测试文件将允许您调用汇编代码并将结果输出到Ubuntu中的终端。 :)

答案 6 :(得分:1)

我总是使用小型qemu ARM VM来测试ARM程序。

您可以从debian下载,然后运行:{more infos

qemu-system-arm  -localtime -m 256 -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile -hda debian_squeeze_armel_standard.qcow2 -append "root=/dev/sda1" $@

由于它模拟了一个完整的臂系统,你可以在上面编写程序(例如用vim + gcc),然后在那里测试它们。

答案 7 :(得分:0)

安装qemu,交叉编译为arm,然后使用

qemu-system-arm ./a.out
终端上的

答案 8 :(得分:0)

不确定为什么还没人提到它,但你可以通过 {{3}获得一个 “真实”且价格合理的手臂平台 进行试验}

默认情况下,它没有附带Ubuntu Raspberry pi

对于该平台的支持,有to my knowledge it come's with a Debian remix called Raspbian (but can also run Fedora, Arch or Debian plain),它甚至有books

答案 9 :(得分:0)

如果您计划在C中编写ARM仿真器,则可以使用此存储库中的代码作为起点。 https://github.com/omufeed/ARMAssemblyEmulatorWithC 它有一个大小为4的管道。实现了数据处理指令,它处理溢出和进位标志。还实现了分支和中断。 它接受汇编指令作为输入,并在指令完成后模拟最终的存储器状态。 添加了一些示例输入作为代码注释。 阅读更多http://www.omidmufeed.com/arm-assembler-emulator-with-c/