編輯:關於android開發
a.我們先來體驗一下在Linux下用匯編編程的感覺,見代碼
[section .data] ; 數據在此 strHello db "Hello, world!", 0Ah STRLEN equ $ - strHello [section .text] ; 代碼在此 global _start ; 我們必須導出 _start 這個入口,以便讓鏈接器識別 _start: mov edx, STRLEN mov ecx, strHello mov ebx, 1 mov eax, 4 ; sys_write int 0x80 ; 系統調用 mov ebx, 0 mov eax, 1 ; sys_exit int 0x80 ; 系統調用
編譯方法:
nasm -f elf hello.asm -o hello.o
ld -m elf_i386 -s -o hello hello.o
./hello
運行結果是打印出Hello, world!
入口點默認的是_start,我們不但要定義它,而且要通過global這個關鍵字將它導出,這樣鏈接程序才能找到它。兩個系統調用不用深究,因為在我們自己的OS中根本用不到Linux的系統調用。
b.匯編和C同步使用
; 編譯鏈接方法 ; (ld 的‘-s’選項意為“strip all”) ; ; $ nasm -f elf foo.asm -o foo.o ; $ gcc -c bar.c -o bar.o ; $ ld -s hello.o bar.o -o foobar ; $ ./foobar ; the 2nd one ; $ extern choose ; int choose(int a, int b); [section .data] ; 數據在此 num1st dd 3 num2nd dd 4 [section .text] ; 代碼在此 global _start ; 我們必須導出 _start 這個入口,以便讓鏈接器識別 global myprint ; 導出這個函數為了讓 bar.c 使用 _start: push dword [num2nd] ; `. push dword [num1st] ; | call choose ; | choose(num1st, num2nd); add esp, 8 ; / mov ebx, 0 mov eax, 1 ; sys_exit int 0x80 ; 系統調用 ; void myprint(char* msg, int len) myprint: mov edx, [esp + 8] ; len mov ecx, [esp + 4] ; msg mov ebx, 1 mov eax, 4 ; sys_write int 0x80 ; 系統調用 ret
1.由於在bar.c中用到函數myprint(),所以要用關鍵字global將其導出。
2.由於用到本文件外定義的函數choose(),所以要用關鍵字extern聲明。
3.不管是myprint()還是choose(),遵循的都是C調用約定,後面的參數先入棧,並由調用者清理堆棧。
void myprint(char* msg, int len); int choose(int a, int b) { if(a >= b){ myprint("the 1st one\n", 13); } else{ myprint("the 2nd one\n", 13); } return 0; }
編譯和執行的過程:
nasm -f elf -o foo.o foo.asm
gcc -m32 -c -o bar.o bar.c
ld -m elf_i386 -s -o foobar foo.o bar.o
./foobar
運行結果:the 2nd one
有了關鍵字global和extern就可以方便地在匯編和C代碼之間自由來去。
【源碼】
Android最新動畫框架完全解析(二)——Transitions Framework(Transitions 框架) 前面一篇文章講解了Android動畫Anima
Android屬性動畫 屬性動畫系統是一個健壯 的框架,它幾乎可以允許把任何對象變成動畫。可以根據時間的推移來改變任何對象的屬性來定義一個動畫,而不用關心該對象是否要繪制
android:Activity啟動模式之singleTask(一) 先看一下standard啟動模式的說明: 只有一個實例,在同一個應用程序中啟動他的時候,若不存在
GreenDao3.0新特性解析(配置、注解、加密),greendao3.0新特性Greendao3.0release與7月6日發布,其中最主要的三大改變就是:1.換包名