13-19保护模式编程

这些是汇编教程的最后一个部分了。第一次尝试利用思维导图的方式来做学习记录,有些许收货,比单纯只看教程来得深刻。

不过代码还是写得少,虽然知道了关于汇编的一些知识,但是要真正去写汇编代码,估计还有不少难度

7个章节都在讲解保护模式下的编程,因为兼容性原因,这里有很多很多的知识点。很难记忆。

另外这是一分入门的教程,所以当中还有不少知识点是可以更深入的挖掘的。

寒假的汇编了解到这里就算一个段落。明天最晚后天就会开一个新的内容来学习。应该会是对面线对象更深入的研究。

mindmap下载地址www.xmind.net/share/atskyline/protected-mode-programming-13-19/

Code:
  1. [BITS 16] ;用16位进行编译  
  2. org 07c00h;设置起始位置  
  3.   
  4. jmp main   
  5.   
  6. gdt_table_start: ;开始填充描述符表  
  7.     gdt_null: ;Inter规定段描述符表的第一个表项必须为0  
  8.         dd 0H  
  9.         dd 0H   
  10.     gdt_data_addr equ $-gdt_table_start ;数据段描述符开始位置  
  11.     gdt_data:  
  12.         dw 07FFH  
  13.         dw 0h  
  14.         db 0h  
  15.         db 10010010b  
  16.         db 11000000b  
  17.         db 0  
  18.     gdt_video_addr equ $-gdt_table_start;显存的段描述符  
  19.     gdt_video:  
  20.         dw 0FFH ;显存段界限为1M  
  21.         dw 8000H  
  22.         db 0Bh  
  23.         db 10010010b  
  24.         db 11000000b  
  25.         db 0  
  26.     gdt_code_addr equ $-gdt_table_start ;代码段描述符位置  
  27.     gdt_code:  
  28.         dw 07FFH  
  29.         dw 1H  
  30.         db 80h  
  31.         db 10011010b  
  32.         db 11000000b  
  33.         db 0  
  34. gdt_table_end:  
  35.   
  36. ;设置描述符表所在位置及大小  
  37. gdtr_addr:  
  38.     dw gdt_table_end-gdt_table_start-1;段描述符表长度  
  39.     dd gdt_table_start;段描述符表基地址  
  40.       
  41. main:  
  42.     ;初始化数据段描述符基地址  
  43.     xor eax,eax ;清空eax  
  44.     add eax,data_32  
  45.     mov word [gdt_data+2],ax  
  46.     shr eax,16 ;右移16位  
  47.     mov byte [gdt_data+4],al  
  48.     mov byte [gdt_data+7],ah  
  49.   
  50.     ;初始化代码段描述符基地址  
  51.     xor eax,eax  
  52.     add eax,code_32  
  53.     mov word [gdt_code+2],ax  
  54.     shr eax,16  
  55.     mov byte [gdt_code+4],al  
  56.     mov byte [gdt_code+7],ah      
  57.       
  58.     cli ;废除中断向量表  
  59.     lgdt [gdtr_addr] ;让cpu读取gdtr_addr所指向的内存内容保存到GDT寄存器  
  60.   
  61.     ;开启A20地址线  
  62.     enable_a20:  
  63.         in al,92h  
  64.         or al,00000010b  
  65.         out 92h,al  
  66.       
  67.     ;设置CR0寄存器第一位为1  
  68.     mov eax,cr0  
  69.     or eax,1  
  70.     mov cr0,eax  
  71.     ;跳转到保护模式  
  72.     jmp dword gdt_code_addr:0  
  73.   
  74.     [BITS 32] ;用32位进行编译  
  75.     data_32:  
  76.         db "hello world"  
  77.     code_32:  
  78.         mov ax,gdt_data_addr  
  79.         mov ds,ax  
  80.         mov ax,gdt_video_addr  
  81.         mov gs,ax  
  82.         mov cx,11  
  83.         mov edi,(80*10+12)*2  
  84.         mov bx,0  
  85.         mov ah,0ch  
  86.       s:mov al,[ds:bx]  
  87.         mov [gs:edi],al  
  88.         mov [gs:edi+1],ah  
  89.         inc bx  
  90.         add edi,2  
  91.         loop s  
  92.   
  93.         jmp $  
  94.         times 510-($-$$) db 0  
  95.         dw 0xAA55   
  96.       

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值