C 模拟ARM代码
我想模拟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也是一个软件,但您可以使用共享内存甚至文件之类的东西(警告:对文件的并发访问可能需要互斥)要将结果从仿
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仿真器,您可以使用此存储库中的代码作为起点。 它有一个圆周率