编译asm形式的helloworld在android下运行

来源:互联网 发布:股票量化交易软件 编辑:程序博客网 时间:2024/06/05 04:29
在前面已经可以编写c语言格式的helloworld,这次写一个asm格式的helloworld.
同样需要建立NDK开发环境,根据需要,要将交叉编译程序放到环境变量中,这样方便使用。
set path=%path%;H:\gp\Android\android-ndk-r9\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin
set path=%path%;H:\gp\Android\android-studio\sdk\platform-tools
然后编写代码
hello.S

.syntax unified.datamessage: .ascii "Hello, world.\n"len = . - message.text .global _start_start: /* syscall write(int fd, const void *buf, size_t count) */ mov %r0, $1 /* fd -> stdout */ ldr %r1, =message /* buf -> message */ ldr %r2, =len /* count -> len(message) */ mov %r7, $4 /* write is syscall #4 */ swi $0 /* invoke syscall */ /* syscall exit(int status) */ mov %r0, $0 /* status -> 0 */ mov %r7, $1 /* exit is syscall #1 */ swi $0 /* invoke syscall */

这样就是一个最简单的asm程序,因为内容很简单,看代码即可
具体的编译命令为

arm-linux-androideabi-as -o hello.o hello.Sarm-linux-androideabi-ld -o hello hello.oadb push hello /data/local/tmp

注意,手机环境同前面说的一样。将程序上传到手机里面
然后登录手机
adb shell
su
cd /data/local/tmp
chmod 751 hello
./hello
运行效果

root@android:/data/local/tmp # ./hello./helloHello, world.root@android:/data/local/tmp #

这样,一个简单的helloworld完成
为了了解这个简单的程序究竟最后编译成什么样子,用反编译程序看一下

.text:00008074 ; ---------------------------------------------------------------------------.text:00008074 ; File Name : H:\work\android\ptrace\jni\hello.text:00008074 ; Format : ELF for ARM (Executable).text:00008074 ; Imagebase : 8000.text:00008074 ;.text:00008074 ; EABI version: 5.text:00008074 ;.text:00008074.text:00008074 ; Processor : ARM.text:00008074 ; Target assembler: Generic assembler for ARM.text:00008074 ; Byte sex : Little endian.text:00008074.text:00008074 ; ===========================================================================.text:00008074.text:00008074 ; Segment type: Pure code.text:00008074 AREA .text, CODE.text:00008074 ; ORG 0x8074.text:00008074 CODE32.text:00008074.text:00008074 EXPORT _start.text:00008074 _start.text:00008074 MOV R0, #1.text:00008078 LDR R1, =message ; "Hello, world.\n".text:0000807C MOV R2, #0xF.text:00008080 MOV R7, #4.text:00008084 SVC 0.text:00008088 MOV R0, #0.text:0000808C MOV R7, #1.text:00008090 SVC 0.text:00008090 ; ---------------------------------------------------------------------------.text:00008094 off_8094 DCD message ; DATA XREF: .text:00008078r.text:00008094 ; .text ends ; "Hello, world.\n".text:00008094.data:00009098 ; ===========================================================================.data:00009098.data:00009098 ; Segment type: Pure data.data:00009098 AREA .data, DATA, ALIGN=0.data:00009098 ; ORG 0x9098.data:00009098 message DCB "Hello, world.",0xA,0 ; DATA XREF: .text:00008078o.data:00009098 ; .text:off_8094o.data:00009098 ; .data ends.data:00009098abs:000090A8 ; ===========================================================================abs:000090A8abs:000090A8 ; Segment type: Absolute symbolsabs:000090A8 len = 0xFabs:000090AC _edata = 0x90A7abs:000090B0 __bss_start = 0x90A7abs:000090B4 _end = 0x90A7abs:000090B4abs:000090B4 END

从上面的代码可以看出,语句基本没有改变,只是简单增加了一个文件属性,一些常量被直接优化了,其它和代码一模一样
0 0
原创粉丝点击