編輯:關於android開發
在上一篇中我們雖然成功進入了保護模式,但是並沒有體驗到保護模式帶給我們的便利。其實在保護模式下尋址空間可以達到4GB,實模式下1MB的尋址能力差得太遠了。那麼下面,我們就把程序稍作修改,體驗一下它對超過1MB內存的訪問能力。
我們來試驗一下讀寫大地址內存。在前面程序的基礎上,新建一個段,這個段以5MB為基址,遠遠超出實模式下1MB的界限。我們先讀出開始處8字節的內容,然後寫入一個字符串,再從中讀出8字節,如下所示:
call TestRead call TestWrite call TestRead
如果讀寫成功的話,兩次讀出的內容應該是不同的,而且第二次讀出的內容應該是我們寫進的字符串。字符串是保存在數據段中的,也是新增加的。增加的兩個段如下所示:
LABEL_DESC_DATA: Descriptor 0, DataLen-1, DA_DRW ; Data LABEL_DESC_TEST: Descriptor 0500000h, 0ffffh, DA_DRW SelectorData equ LABEL_DESC_DATA - LABEL_GDT SelectorTest equ LABEL_DESC_TEST - LABEL_GDT [SECTION .data1] ; 數據段 ALIGN 32 [BITS 32] LABEL_DATA: BootMessage: db "Joey, I'm in protected mode!" OffsetPMMessage equ BootMessage - $$ ;表示字符串BootMessage相對於本節的開始處(LABEL_DATA)的偏移 StrTest: db "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0 OffsetStrTest equ StrTest - $$ DataLen equ $ - LABEL_DATA ; END of [SECTION .data1]
段[SECTION .s32]這個段的開頭初始化了ds、es和gs,讓ds指向新增的數據段,es指向新增的5MB內存的段,gs指向顯存。如下所示:
LABEL_SEG_CODE32: mov ax, SelectorData mov ds, ax ; 數據段選擇子 mov ax, SelectorTest mov es, ax ; 測試段選擇子 mov ax, SelectorVideo mov gs, ax ; 視頻段選擇子(目的)
數據段的基址便是LABEL_DATA的物理地址。於是OffsetStrTest既是字符串相對於LABEL_DATA的偏移,也是其在數據段中的偏移。我們在保護模式下需要用到的正是這個偏移,而不再是實模式下的地址。section的一點妙用指的便是這裡的$$。
; 初始化數據段描述符 xor eax, eax mov ax, ds shl eax, 4 add eax, LABEL_DATA mov word [LABEL_DESC_DATA + 2], ax shr eax, 16 mov byte [LABEL_DESC_DATA + 4], al mov byte [LABEL_DESC_DATA + 7], ah
運行如下所示:
第一次執行call TestRead時顯示8個空字符,第二次執行call TestRead時顯示ABCDEFGH。因為TestRead的段寄存器指向的是5MB內存地址處的內容,一開始是沒有任何數據。
TestRead: xor esi, esi mov ecx, 8 .loop: mov al, [es:esi] call DispAL inc esi loop .loop ret
然後第190行向這個5MB內存地址處依次寫入8字節數據。
【源碼及軟盤映像】
畫畫板--第三方開源--DrawableView,畫板--drawableview Android上的第三方開源DrawableView支持手
Android5.0之Toobar的使用 總體上來說,Toolbar的使用可以分為兩個方面,一方面是將ToolBar當作ActionBar來用,另一方面就是將Toolba
本節講解使用SurfaceView組件繪制動畫的方法。SurfaceView類
安卓7.0首批截圖公布:驚現漢堡菜單,安卓漢堡今天谷歌在開發者頁面公布了首批Android N(安卓7.0)截圖,從截圖中能夠了解到的一點是安卓7.0設置界面中會添加漢堡