生活随笔
收集整理的這篇文章主要介紹了
C11代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
c11_mbr.asm
;代碼清單11-1
;文件名:c11_mbr.asm
;文件說明:硬盤主引導扇區代碼
;創建日期:2011-5-16
19:54
;設置堆棧段和棧指針 mov ax,cs mov ss,axmov sp,0x7c00
;計算GDT所在的邏輯段地址 mov ax,
[cs:gdt_base+0x7c00
] ;低16位 mov dx,
[cs:gdt_base+0x7c00+0x02
] ;高16位 mov bx,16 div bx
;段地址存在ax中 mov ds,ax
;令DS指向該段以進行操作mov bx,dx
;段內起始偏移地址傳送到基值寄存器bx
;創建0mov dword
[bx+0x00
],0x00mov dword
[bx+0x04
],0x00
;創建mov dword
[bx+0x08
],0x7c0001ff mov dword
[bx+0x0c
],0x00409800
;創建mov dword
[bx+0x10
],0x8000ffff mov dword
[bx+0x14
],0x0040920b
;創建mov dword
[bx+0x18
],0x00007a00mov dword
[bx+0x1c
],0x00409600
;初始化描述符表寄存器GDTRmov word
[cs: gdt_size+0x7c00
],31
;描述符表的界限(總字節數減一) lgdt
[cs: gdt_size+0x7c00
]in al,0x92
;南橋芯片內的端口 or al,0000_0010Bout 0x92,al
;打開A20cli
;保護模式下中斷機制尚未建立,應
;禁止中斷 mov eax,cr0or eax,1mov cr0,eax
;設置PE位
;以下進入保護模式
...
...jmp dword 0x0008:flush
;16位的描述符選擇子:32位偏移
;清流水線并串行化處理器
[bits
32] flush:mov cx,00000000000_10_000B
;加載數據段選擇子
(0x10
)mov ds,cx
;以下在屏幕上顯示
"Protect mode OK." mov byte
[0x00
],
'P' mov byte
[0x02
],
'r'mov byte
[0x04
],
'o'mov byte
[0x06
],
't'mov byte
[0x08
],
'e'mov byte
[0x0a
],
'c'mov byte
[0x0c
],
't'mov byte
[0x0e
],
' 'mov byte
[0x10
],
'm'mov byte
[0x12
],
'o'mov byte
[0x14
],
'd'mov byte
[0x16
],
'e'mov byte
[0x18
],
' 'mov byte
[0x1a
],
'O'mov byte
[0x1c
],
'K';以下用簡單的示例來幫助闡述32位保護模式下的堆棧操作 mov cx,00000000000_11_000B
;加載堆棧段選擇子mov ss,cxmov esp,0x7c00mov ebp,esp
;保存堆棧指針 push byte
'.' ;壓入立即數(字節)sub ebp,4
cmp ebp,esp
;判斷壓入立即數時,ESP是否減4 jnz ghalt pop eaxmov
[0x1e
],al
;顯示句點 ghalt: hlt
;已經禁止中斷,將不會被喚醒
;-------------------------------------------------------------------------------gdt_size dw
0gdt_base
dd 0x00007e00
;GDT的物理地址
times 510-
($-
$$) db
0db 0x55,0xaa
總結
以上是生活随笔為你收集整理的C11代码的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。