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

在前面已经可以编写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 .data message: .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.S arm-linux-androideabi-ld -o hello hello.o adb push hello /data/local/tmp

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

root@android:/data/local/tmp # ./hello ./hello Hello, 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:00009098 abs:000090A8 ; =========================================================================== abs:000090A8 abs:000090A8 ; Segment type: Absolute symbols abs:000090A8 len = 0xF abs:000090AC _edata = 0x90A7 abs:000090B0 __bss_start = 0x90A7 abs:000090B4 _end = 0x90A7 abs:000090B4 abs:000090B4 END

从上面的代码可以看出,语句基本没有改变,只是简单增加了一个文件属性,一些常量被直接优化了,其它和代码一模一样
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值