我想模拟ARM代码。例如,我想运行这样的代码:
MOV R0, #5
ADD R0, R0, #1
//somehow output R0
它会在我的Ubuntu上的某些软件上输出6。有可能吗?
答案 0 :(得分:10)
如果将其构建为实际的可执行文件,则可以使用QEMU的ARM模拟器来运行它。
答案 1 :(得分:10)
Keil MDK可用于模拟ARM代码。它提供了Simulate/Debug透视图,可用于探测ARM寄存器集,存储器内容等......
MDK-Lite评估版可免费获得,最大代码大小为32KB。
Linux版的MDK不可用。但是Keil MDK在Ubuntu中完全优于WINE。
第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
第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源文件)
第4步:构建源文件
在Keil UVision工具栏中选择 Project - >构建目标或按 F7 编译源文件。
第5步:模拟/调试应用
在Keil UVision工具栏中选择 Debug - >启动/停止调试会话或按 Ctrl + F5 。
调试透视图打开,左侧是“注册”视图,中间是“代码视图”,右下方是“内存”视图等。
使用调试键执行代码:
在程序执行结束时观察注册视图:
在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-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/