honeypot 发表于 2022-9-12 20:19:15

Learn x86 protected mode assembly language-c11_mbr.asm

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

         ;设置堆栈段和栈指针
         mov ax,cs      
         mov ss,ax
         mov sp,0x7c00
      
         ;计算GDT所在的逻辑段地址
         mov ax,      ;低16位
         mov dx,   ;高16位
         mov bx,16      
         div bx            
         mov ds,ax                        ;令DS指向该段以进行操作
         mov bx,dx                        ;段内起始偏移地址
      
         ;创建0#描述符,它是空描述符,这是处理器的要求
         mov dword ,0x00
         mov dword ,0x00

         ;创建#1描述符,保护模式下的代码段描述符
         mov dword ,0x7c0001ff   
         mov dword ,0x00409800   

         ;创建#2描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区)
         mov dword ,0x8000ffff   
         mov dword ,0x0040920b   

         ;创建#3描述符,保护模式下的堆栈段描述符
         mov dword ,0x00007a00
         mov dword ,0x00409600

         ;初始化描述符表寄存器GDTR
         mov word ,31;描述符表的界限(总字节数减一)   
                                             
         lgdt
      
         in al,0x92                         ;南桥芯片内的端口
         or al,0000_0010B
         out 0x92,al                        ;打开A20

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

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

         ;以下在屏幕上显示"Protect mode OK."
         mov byte ,'P'
         mov byte ,'r'
         mov byte ,'o'
         mov byte ,'t'
         mov byte ,'e'
         mov byte ,'c'
         mov byte ,'t'
         mov byte ,' '
         mov byte ,'m'
         mov byte ,'o'
         mov byte ,'d'
         mov byte ,'e'
         mov byte ,' '
         mov byte ,'O'
         mov byte ,'K'

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

         mov ebp,esp                        ;保存堆栈指针
         push byte '.'                      ;压入立即数(字节)
         
         sub ebp,4
         cmp ebp,esp                        ;判断压入立即数时,ESP是否减4
         jnz ghalt                        
         pop eax
         mov ,al                      ;显示句点
      
ghalt:   
         hlt                              ;已经禁止中断,将不会被唤醒

;-------------------------------------------------------------------------------
   
         gdt_size         dw 0
         gdt_base         dd 0x00007e00   ;GDT的物理地址
                           
         times 510-($-$$) db 0
                        db 0x55,0xaa


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




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

         ;设置堆栈段和栈指针
         mov ax,cs      
         mov ss,ax
         mov sp,0x7c00
      
         ;计算GDT所在的逻辑段地址
         mov ax,      ;低16位
         mov dx,   ;高16位
         mov bx,16      
         div bx            
         mov ds,ax                        ;令DS指向该段以进行操作
         mov bx,dx                        ;段内起始偏移地址
      
         ;创建0#描述符,它是空描述符,这是处理器的要求
         mov dword ,0x00
         mov dword ,0x00

         ;创建#1描述符,保护模式下的代码段描述符
         mov dword ,0x7c0001ff   
         mov dword ,0x00409800   

         ;创建#2描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区)
         mov dword ,0x8000ffff   
         mov dword ,0x0040920b   

         ;创建#3描述符,保护模式下的堆栈段描述符
         mov dword ,0x00007a00
         mov dword ,0x00409600

         ;初始化描述符表寄存器GDTR
         mov word ,31;描述符表的界限(总字节数减一)   
                                             
         lgdt
      
         in al,0x92                         ;南桥芯片内的端口
         or al,0000_0010B
         out 0x92,al                        ;打开A20

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

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

         ;以下在屏幕上显示"Protect mode OK."
         mov byte ,'P'
         mov byte ,'r'
         mov byte ,'o'
         mov byte ,'t'
         mov byte ,'e'
         mov byte ,'c'
         mov byte ,'t'
         mov byte ,' '
         mov byte ,'m'
         mov byte ,'o'
         mov byte ,'d'
         mov byte ,'e'
         mov byte ,' '
         mov byte ,'O'
         mov byte ,'K'

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

         mov ebp,esp                        ;保存堆栈指针
         push byte '.'                      ;压入立即数(字节)
         
         sub ebp,4
         cmp ebp,esp                        ;判断压入立即数时,ESP是否减4
         jnz ghalt                        
         pop eax
         mov ,al                      ;显示句点
      
ghalt:   
         hlt                              ;已经禁止中断,将不会被唤醒

;-------------------------------------------------------------------------------
   
         gdt_size         dw 0
         gdt_base         dd 0x00007e00   ;GDT的物理地址
                           
         times 510-($-$$) db 0
                        db 0x55,0xaa


页: [1]
查看完整版本: Learn x86 protected mode assembly language-c11_mbr.asm