Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Linux內核系列—10.操作系統開發之內核HelloWorld,linuxhelloworld

Linux內核系列—10.操作系統開發之內核HelloWorld,linuxhelloworld

編輯:關於android開發

Linux內核系列—10.操作系統開發之內核HelloWorld,linuxhelloworld


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代碼之間自由來去。

 

一個碼農的日常 

源碼

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved