我是新手,这就是我想做的事情 -
有人可以指出我如何使用免费提供的工具做到这一点?
谢谢!
答案 0 :(得分:1)
我想知道你在这里想要实现什么 - 是否要学习ARM汇编程序的开发?你想写iOS应用程序吗?
这些天没有理智的人在汇编程序中编写完整的应用程序 - 他们使用高级语言 - 并且在一些限制情况下优化汇编程序。这是一项非常专业和有用的技能。
使用完整的C程序作为代理主机是一个好的开始方式。在C中创建一个简单的Hello world程序,它调用一个(几乎)空函数。
您可以(大部分)使用XCode使其工作(您需要安装可选的命令行工具)。除了ARM的最终链接阶段之外,所有工作都使用clang
。这显然只是MacOSX。
这种实验的一个更好的选择是ARM Linux系统,你不会在iOS的锁定环境中作战。 Raspberry Pi非常适合这项工作。你需要一个针对ARMv7的交叉编译工具链 - 其中有很多。如果使用Ubuntu,可以使用预先构建的软件包。
Main.c
#include<stdio.h>
extern void func();
int main()
{
printf("Hello World\n");
func();
}
和func.c
#include <stdio.h>
void func()
{
printf("In func()\n");
}
为您的主机环境编译并运行它以查看它的工作原理:
gcc main.c func.c
`./a.out'
现在为您的目标环境进行编译。交叉编译工具的确切名称取决于您安装的内容(我的arm-angstrom-linux-gnueabi-gcc
)
arm-angstrom-linux-gnueabi-gcc main.c func.c
复制到您的目标,并证明它有效。
现在你可以开始编写一些汇编程序了。获取gcc
为受害者文件func.c
生成ARM汇编程序 - 这会生成文件func.s
arm-angstrom-linux-gnueabi-gcc func.c -s
.cpu arm7tdmi-s
.fpu softvfp
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 18, 4
.file "func.c"
.section .rodata
.align 2
.LC0:
.ascii "In func()\000"
.text
.align 2
.global func
.type func, %function
func:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 1, uses_anonymous_args = 0
stmfd sp!, {fp, lr}
add fp, sp, #4
ldr r0, .L2
bl puts
sub sp, fp, #4
ldmfd sp!, {fp, lr}
bx lr
.L3:
.align 2
.L2:
.word .LC0
.size func, .-func
.ident "GCC: (GNU) 4.5.4 20120305 (prerelease)"
.section .note.GNU-stack,"",%progbits
您可以在此处看到标签func:
和.L3
之间是func()
的业务结束 - 而且它几乎都是功能序言和结语。您需要查看ARM Procedure Call Standard以了解这些内容以及有关使用哪些寄存器的指导。
完成编辑后,使用GCC再次编译整个内容
arm-angstrom-linux-gnueabi-gcc main.c func.s
...并测试它。