请选择 进入手机版 | 继续访问电脑版

4Ameta

 找回密码
 立即注册
搜索
查看: 61|回复: 0

Learn x86 protected mode assembly language-c11_mbr.asm

[复制链接]

26

主题

26

帖子

119

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119
发表于 2022-9-12 20:19:15 | 显示全部楼层 |阅读模式
  1.          ;代码清单11-1
  2.          ;文件名:c11_mbr.asm
  3.          ;文件说明:硬盘主引导扇区代码
  4.          ;创建日期:2011-5-16 19:54

  5.          ;设置堆栈段和栈指针
  6.          mov ax,cs      
  7.          mov ss,ax
  8.          mov sp,0x7c00
  9.       
  10.          ;计算GDT所在的逻辑段地址
  11.          mov ax,[cs:gdt_base+0x7c00]        ;低16位
  12.          mov dx,[cs:gdt_base+0x7c00+0x02]   ;高16位
  13.          mov bx,16        
  14.          div bx            
  15.          mov ds,ax                          ;令DS指向该段以进行操作
  16.          mov bx,dx                          ;段内起始偏移地址
  17.       
  18.          ;创建0#描述符,它是空描述符,这是处理器的要求
  19.          mov dword [bx+0x00],0x00
  20.          mov dword [bx+0x04],0x00  

  21.          ;创建#1描述符,保护模式下的代码段描述符
  22.          mov dword [bx+0x08],0x7c0001ff     
  23.          mov dword [bx+0x0c],0x00409800     

  24.          ;创建#2描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区)
  25.          mov dword [bx+0x10],0x8000ffff     
  26.          mov dword [bx+0x14],0x0040920b     

  27.          ;创建#3描述符,保护模式下的堆栈段描述符
  28.          mov dword [bx+0x18],0x00007a00
  29.          mov dword [bx+0x1c],0x00409600

  30.          ;初始化描述符表寄存器GDTR
  31.          mov word [cs: gdt_size+0x7c00],31  ;描述符表的界限(总字节数减一)   
  32.                                              
  33.          lgdt [cs: gdt_size+0x7c00]
  34.       
  35.          in al,0x92                         ;南桥芯片内的端口
  36.          or al,0000_0010B
  37.          out 0x92,al                        ;打开A20

  38.          cli                                ;保护模式下中断机制尚未建立,应
  39.                                             ;禁止中断
  40.          mov eax,cr0
  41.          or eax,1
  42.          mov cr0,eax                        ;设置PE位
  43.       
  44.          ;以下进入保护模式... ...
  45.          jmp dword 0x0008:flush             ;16位的描述符选择子:32位偏移
  46.                                             ;清流水线并串行化处理器
  47.          [bits 32]

  48.     flush:
  49.          mov cx,00000000000_10_000B         ;加载数据段选择子(0x10)
  50.          mov ds,cx

  51.          ;以下在屏幕上显示"Protect mode OK."
  52.          mov byte [0x00],'P'  
  53.          mov byte [0x02],'r'
  54.          mov byte [0x04],'o'
  55.          mov byte [0x06],'t'
  56.          mov byte [0x08],'e'
  57.          mov byte [0x0a],'c'
  58.          mov byte [0x0c],'t'
  59.          mov byte [0x0e],' '
  60.          mov byte [0x10],'m'
  61.          mov byte [0x12],'o'
  62.          mov byte [0x14],'d'
  63.          mov byte [0x16],'e'
  64.          mov byte [0x18],' '
  65.          mov byte [0x1a],'O'
  66.          mov byte [0x1c],'K'

  67.          ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作
  68.          mov cx,00000000000_11_000B         ;加载堆栈段选择子
  69.          mov ss,cx
  70.          mov esp,0x7c00

  71.          mov ebp,esp                        ;保存堆栈指针
  72.          push byte '.'                      ;压入立即数(字节)
  73.          
  74.          sub ebp,4
  75.          cmp ebp,esp                        ;判断压入立即数时,ESP是否减4
  76.          jnz ghalt                          
  77.          pop eax
  78.          mov [0x1e],al                      ;显示句点
  79.       
  80.   ghalt:     
  81.          hlt                                ;已经禁止中断,将不会被唤醒

  82. ;-------------------------------------------------------------------------------
  83.      
  84.          gdt_size         dw 0
  85.          gdt_base         dd 0x00007e00     ;GDT的物理地址
  86.                              
  87.          times 510-($-$$) db 0
  88.                           db 0x55,0xaa
复制代码


  1.      1                                           ;代码清单11-1
  2.      2                                           ;文件名:c11_mbr.asm
  3.      3                                           ;文件说明:硬盘主引导扇区代码
  4.      4                                           ;创建日期:2011-5-16 19:54
  5.      5                                 
  6.      6                                           ;设置堆栈段和栈指针
  7.      7 00000000 8CC8                             mov ax,cs      
  8.      8 00000002 8ED0                             mov ss,ax
  9.      9 00000004 BC007C                           mov sp,0x7c00
  10.     10                                       
  11.     11                                           ;计算GDT所在的逻辑段地址
  12.     12 00000007 2EA1[117D]                       mov ax,[cs:gdt_base+0x7c00]        ;低16位
  13.     13 0000000B 2E8B16[137D]                     mov dx,[cs:gdt_base+0x7c00+0x02]   ;高16位
  14.     14 00000010 BB1000                           mov bx,16        
  15.     15 00000013 F7F3                             div bx            
  16.     16 00000015 8ED8                             mov ds,ax                          ;令DS指向该段以进行操作
  17.     17 00000017 89D3                             mov bx,dx                          ;段内起始偏移地址
  18.     18                                       
  19.     19                                           ;创建0#描述符,它是空描述符,这是处理器的要求
  20.     20 00000019 66C70700000000                   mov dword [bx+0x00],0x00
  21.     21 00000020 66C7470400000000                 mov dword [bx+0x04],0x00  
  22.     22                                 
  23.     23                                           ;创建#1描述符,保护模式下的代码段描述符
  24.     24 00000028 66C74708FF01007C                 mov dword [bx+0x08],0x7c0001ff     
  25.     25 00000030 66C7470C00984000                 mov dword [bx+0x0c],0x00409800     
  26.     26                                 
  27.     27                                           ;创建#2描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区)
  28.     28 00000038 66C74710FFFF0080                 mov dword [bx+0x10],0x8000ffff     
  29.     29 00000040 66C747140B924000                 mov dword [bx+0x14],0x0040920b     
  30.     30                                 
  31.     31                                           ;创建#3描述符,保护模式下的堆栈段描述符
  32.     32 00000048 66C74718007A0000                 mov dword [bx+0x18],0x00007a00
  33.     33 00000050 66C7471C00964000                 mov dword [bx+0x1c],0x00409600
  34.     34                                 
  35.     35                                           ;初始化描述符表寄存器GDTR
  36.     36 00000058 2EC706[0F7D]1F00                 mov word [cs: gdt_size+0x7c00],31  ;描述符表的界限(总字节数减一)   
  37.     37                                                                              
  38.     38 0000005F 2E0F0116[0F7D]                   lgdt [cs: gdt_size+0x7c00]
  39.     39                                       
  40.     40 00000065 E492                             in al,0x92                         ;南桥芯片内的端口
  41.     41 00000067 0C02                             or al,0000_0010B
  42.     42 00000069 E692                             out 0x92,al                        ;打开A20
  43.     43                                 
  44.     44 0000006B FA                               cli                                ;保护模式下中断机制尚未建立,应
  45.     45                                                                              ;禁止中断
  46.     46 0000006C 0F20C0                           mov eax,cr0
  47.     47 0000006F 660D01000000                     or eax,1
  48.     48 00000075 0F22C0                           mov cr0,eax                        ;设置PE位
  49.     49                                       
  50.     50                                           ;以下进入保护模式... ...
  51.     51 00000078 66EA[80000000]0800               jmp dword 0x0008:flush             ;16位的描述符选择子:32位偏移
  52.     52                                                                              ;清流水线并串行化处理器
  53.     53                                           [bits 32]
  54.     54                                 
  55.     55                                      flush:
  56.     56 00000080 66B91000                         mov cx,00000000000_10_000B         ;加载数据段选择子(0x10)
  57.     57 00000084 8ED9                             mov ds,cx
  58.     58                                 
  59.     59                                           ;以下在屏幕上显示"Protect mode OK."
  60.     60 00000086 C6050000000050                   mov byte [0x00],'P'  
  61.     61 0000008D C6050200000072                   mov byte [0x02],'r'
  62.     62 00000094 C605040000006F                   mov byte [0x04],'o'
  63.     63 0000009B C6050600000074                   mov byte [0x06],'t'
  64.     64 000000A2 C6050800000065                   mov byte [0x08],'e'
  65.     65 000000A9 C6050A00000063                   mov byte [0x0a],'c'
  66.     66 000000B0 C6050C00000074                   mov byte [0x0c],'t'
  67.     67 000000B7 C6050E00000020                   mov byte [0x0e],' '
  68.     68 000000BE C605100000006D                   mov byte [0x10],'m'
  69.     69 000000C5 C605120000006F                   mov byte [0x12],'o'
  70.     70 000000CC C6051400000064                   mov byte [0x14],'d'
  71.     71 000000D3 C6051600000065                   mov byte [0x16],'e'
  72.     72 000000DA C6051800000020                   mov byte [0x18],' '
  73.     73 000000E1 C6051A0000004F                   mov byte [0x1a],'O'
  74.     74 000000E8 C6051C0000004B                   mov byte [0x1c],'K'
  75.     75                                 
  76.     76                                           ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作
  77.     77 000000EF 66B91800                         mov cx,00000000000_11_000B         ;加载堆栈段选择子
  78.     78 000000F3 8ED1                             mov ss,cx
  79.     79 000000F5 BC007C0000                       mov esp,0x7c00
  80.     80                                 
  81.     81 000000FA 89E5                             mov ebp,esp                        ;保存堆栈指针
  82.     82 000000FC 6A2E                             push byte '.'                      ;压入立即数(字节)
  83.     83                                          
  84.     84 000000FE 81ED04000000                     sub ebp,4
  85.     85 00000104 39E5                             cmp ebp,esp                        ;判断压入立即数时,ESP是否减4
  86.     86 00000106 7506                             jnz ghalt                          
  87.     87 00000108 58                               pop eax
  88.     88 00000109 A21E000000                       mov [0x1e],al                      ;显示句点
  89.     89                                       
  90.     90                                    ghalt:     
  91.     91 0000010E F4                               hlt                                ;已经禁止中断,将不会被唤醒
  92.     92                                 
  93.     93                                  ;-------------------------------------------------------------------------------
  94.     94                                       
  95.     95 0000010F 0000                             gdt_size         dw 0
  96.     96 00000111 007E0000                         gdt_base         dd 0x00007e00     ;GDT的物理地址
  97.     97                                                               
  98.     98 00000115 00<rept>                         times 510-($-$$) db 0
  99.     99 000001FE 55AA                                              db 0x55,0xaa

复制代码


  1.          ;代码清单11-1
  2.          ;文件名:c11_mbr.asm
  3.          ;文件说明:硬盘主引导扇区代码
  4.          ;创建日期:2011-5-16 19:54

  5.          ;设置堆栈段和栈指针
  6.          mov ax,cs      
  7.          mov ss,ax
  8.          mov sp,0x7c00
  9.       
  10.          ;计算GDT所在的逻辑段地址
  11.          mov ax,[cs:gdt_base+0x7c00]        ;低16位
  12.          mov dx,[cs:gdt_base+0x7c00+0x02]   ;高16位
  13.          mov bx,16        
  14.          div bx            
  15.          mov ds,ax                          ;令DS指向该段以进行操作
  16.          mov bx,dx                          ;段内起始偏移地址
  17.       
  18.          ;创建0#描述符,它是空描述符,这是处理器的要求
  19.          mov dword [bx+0x00],0x00
  20.          mov dword [bx+0x04],0x00  

  21.          ;创建#1描述符,保护模式下的代码段描述符
  22.          mov dword [bx+0x08],0x7c0001ff     
  23.          mov dword [bx+0x0c],0x00409800     

  24.          ;创建#2描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区)
  25.          mov dword [bx+0x10],0x8000ffff     
  26.          mov dword [bx+0x14],0x0040920b     

  27.          ;创建#3描述符,保护模式下的堆栈段描述符
  28.          mov dword [bx+0x18],0x00007a00
  29.          mov dword [bx+0x1c],0x00409600

  30.          ;初始化描述符表寄存器GDTR
  31.          mov word [cs: gdt_size+0x7c00],31  ;描述符表的界限(总字节数减一)   
  32.                                              
  33.          lgdt [cs: gdt_size+0x7c00]
  34.       
  35.          in al,0x92                         ;南桥芯片内的端口
  36.          or al,0000_0010B
  37.          out 0x92,al                        ;打开A20

  38.          cli                                ;保护模式下中断机制尚未建立,应
  39.                                             ;禁止中断
  40.          mov eax,cr0
  41.          or eax,1
  42.          mov cr0,eax                        ;设置PE位
  43.       
  44.          ;以下进入保护模式... ...
  45.          jmp dword 0x0008:flush             ;16位的描述符选择子:32位偏移
  46.                                             ;清流水线并串行化处理器
  47.          [bits 32]

  48.     flush:
  49.          mov cx,00000000000_10_000B         ;加载数据段选择子(0x10)
  50.          mov ds,cx

  51.          ;以下在屏幕上显示"Protect mode OK."
  52.          mov byte [0x00],'P'  
  53.          mov byte [0x02],'r'
  54.          mov byte [0x04],'o'
  55.          mov byte [0x06],'t'
  56.          mov byte [0x08],'e'
  57.          mov byte [0x0a],'c'
  58.          mov byte [0x0c],'t'
  59.          mov byte [0x0e],' '
  60.          mov byte [0x10],'m'
  61.          mov byte [0x12],'o'
  62.          mov byte [0x14],'d'
  63.          mov byte [0x16],'e'
  64.          mov byte [0x18],' '
  65.          mov byte [0x1a],'O'
  66.          mov byte [0x1c],'K'

  67.          ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作
  68.          mov cx,00000000000_11_000B         ;加载堆栈段选择子
  69.          mov ss,cx
  70.          mov esp,0x7c00

  71.          mov ebp,esp                        ;保存堆栈指针
  72.          push byte '.'                      ;压入立即数(字节)
  73.          
  74.          sub ebp,4
  75.          cmp ebp,esp                        ;判断压入立即数时,ESP是否减4
  76.          jnz ghalt                          
  77.          pop eax
  78.          mov [0x1e],al                      ;显示句点
  79.       
  80.   ghalt:     
  81.          hlt                                ;已经禁止中断,将不会被唤醒

  82. ;-------------------------------------------------------------------------------
  83.      
  84.          gdt_size         dw 0
  85.          gdt_base         dd 0x00007e00     ;GDT的物理地址
  86.                              
  87.          times 510-($-$$) db 0
  88.                           db 0x55,0xaa
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|4ameta

GMT+8, 2022-10-2 23:50 , Processed in 0.034318 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表