C 模拟ARM代码

C 模拟ARM代码,c,linux,ubuntu,arm,C,Linux,Ubuntu,Arm,我想模拟ARM代码。例如,我想运行如下代码: MOV R0, #5 ADD R0, R0, #1 //somehow output R0 它会在我的Ubuntu上的一些软件上输出6。有可能吗?如果您将其构建到实际的可执行文件中,那么您可以使用的ARM emulator来运行它。您可以通过QEMU来运行ARM代码,QEMU是一个模拟器,但我认为您不能直接输出到另一个软件,因为QEMU也是一个软件,但您可以使用共享内存甚至文件之类的东西(警告:对文件的并发访问可能需要互斥)要将结果从仿

我想模拟ARM代码。例如,我想运行如下代码:

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

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

如果您将其构建到实际的可执行文件中,那么您可以使用的ARM emulator来运行它。

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

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

正如其他人所提到的,您首先需要安装QEMU来模拟ARM硬件,并且需要有某种编译代码的方法(我推荐)。然后编辑
Makefile.common
文件中的
TOOLROOT
条目,指向工具链的安装位置,在编写汇编代码并将其外部化到C测试文件后,只需运行命令
maketest

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

可用于模拟ARM代码。它提供了一个透视图,可用于探测ARM寄存器集、内存内容等

MDK Lite评估版免费提供,最大代码大小为32KB

Linux版本的MDK不可用。但是Keil MDK在Ubuntu中工作得非常好


Keil uVision MDK在葡萄酒上的安装: 步骤1:在Ubuntu上安装wine

打开终端并键入:

sudo apt-get install wine
wine ~/.wine/drive_c/Keil/UV4/Uv4.exe
ln -s /dev/ttyS0 ~/.wine/dosdevices/COM1
步骤2:下载。

步骤3:安装MDK

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

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

打开终端并键入:

sudo apt-get install wine
wine ~/.wine/drive_c/Keil/UV4/Uv4.exe
ln -s /dev/ttyS0 ~/.wine/dosdevices/COM1
步骤5:安装Flash Magic(可选)

Flash Magic是一种用于下载Keil板软件的工具。下载并安装到wine上(请参阅前面的步骤)

创建到串行端口的COM1链接。打开终端并键入:

sudo apt-get install wine
wine ~/.wine/drive_c/Keil/UV4/Uv4.exe
ln -s /dev/ttyS0 ~/.wine/dosdevices/COM1

Keil uVision MDK项目创建和调试: 步骤1:为ARM7目标创建Keil UVision项目。

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

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

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

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

步骤2:为目标创建程序集源文件

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

    AREA text, code, readonly
    ENTRY

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

    END
如上所述,在每个汇编语句之前提供选项卡空间。保存扩展名为“.s”的文件

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

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

选择test.s并单击“添加”。(选择文件类型作为ASM源文件)

步骤4:生成源文件

在Keil UVision工具栏中,选择项目-->生成目标或按F7编译源文件

步骤5:模拟/调试应用程序

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

调试透视图打开时,左边是寄存器视图,中间是代码视图,右下角是内存视图,等等

使用调试键执行代码:

在程序执行结束时观察寄存器视图:


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

本文逐步介绍如何使用QEMU模拟裸机ARM代码:


当然,您不需要使用C语言,可以直接将程序集放在启动程序中。s

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

qemu-system-arm ./a.out

在您的终端上

我想您想要的是一种从C程序中获取ARM汇编函数返回的值的方法。您可以使用arm elf gcc工具链提供的命令行模拟器
arm elf run
执行此操作。您可以从下载工具链。(只需将归档文件解包到某个文件夹中,并可选择将
/gunarm-4.0.2/bin/
附加到系统的
路径
变量中)

首先,您需要将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()
测试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 run运行二进制文件

arm-elf-run ./test.out

这将在你的Ubuntu终端上打印一个
retval=6
:)

不知道为什么还没有人提到它,但是你可以得到一个“真正的”并且价格合理的arm平台来进行试验,使用

默认情况下,它不随Ubuntu提供


当涉及到对该平台的支持时,有很多支持,甚至有。

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

您可以从下载它,然后使用()运行它


因为它模拟了一个完整的arm系统,所以您可以在它上面编写程序(例如,使用vim+gcc),然后在那里进行测试。

如果您计划用C编写arm仿真器,您可以使用此存储库中的代码作为起点。 它有一个圆周率