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

4Ameta

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

Learn x86 protected mode assembly language-c12_mbr.asm

[复制链接]

26

主题

26

帖子

119

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119
发表于 2022-9-12 21:06:14 | 显示全部楼层 |阅读模式
  1.   ;代码清单12-1
  2.          ;文件名:c12_mbr.asm
  3.          ;文件说明:硬盘主引导扇区代码
  4.          ;创建日期:2011-10-27 22:52

  5.          ;设置堆栈段和栈指针
  6.          mov eax,cs      
  7.          mov ss,eax
  8.          mov sp,0x7c00
  9.       
  10.          ;计算GDT所在的逻辑段地址
  11.          mov eax,[cs:pgdt+0x7c00+0x02]      ;GDT的32位线性基地址
  12.          xor edx,edx
  13.          mov ebx,16
  14.          div ebx                            ;分解成16位逻辑地址

  15.          mov ds,eax                         ;令DS指向该段以进行操作
  16.          mov ebx,edx                        ;段内起始偏移地址

  17.          ;创建0#描述符,它是空描述符,这是处理器的要求
  18.          mov dword [ebx+0x00],0x00000000
  19.          mov dword [ebx+0x04],0x00000000  

  20.          ;创建1#描述符,这是一个数据段,对应0~4GB的线性地址空间
  21.          mov dword [ebx+0x08],0x0000ffff    ;基地址为0,段界限为0xfffff
  22.          mov dword [ebx+0x0c],0x00cf9200    ;粒度为4KB,存储器段描述符

  23.          ;创建保护模式下初始代码段描述符
  24.          mov dword [ebx+0x10],0x7c0001ff    ;基地址为0x00007c00,512字节
  25.          mov dword [ebx+0x14],0x00409800    ;粒度为1个字节,代码段描述符

  26.          ;创建以上代码段的别名描述符
  27.          mov dword [ebx+0x18],0x7c0001ff    ;基地址为0x00007c00,512字节
  28.          mov dword [ebx+0x1c],0x00409200    ;粒度为1个字节,数据段描述符

  29.          mov dword [ebx+0x20],0x7c00fffe
  30.          mov dword [ebx+0x24],0x00cf9600
  31.          
  32.          ;初始化描述符表寄存器GDTR
  33.          mov word [cs: pgdt+0x7c00],39      ;描述符表的界限   

  34.          lgdt [cs: pgdt+0x7c00]
  35.       
  36.          in al,0x92                         ;南桥芯片内的端口
  37.          or al,0000_0010B
  38.          out 0x92,al                        ;打开A20

  39.          cli                                ;中断机制尚未工作

  40.          mov eax,cr0
  41.          or eax,1
  42.          mov cr0,eax                        ;设置PE位
  43.       
  44.          ;以下进入保护模式... ...
  45.          jmp dword 0x0010:flush             ;16位的描述符选择子:32位偏移
  46.                                              
  47.          [bits 32]                          
  48.   flush:                                    
  49.          mov eax,0x0018                     
  50.          mov ds,eax
  51.       
  52.          mov eax,0x0008                     ;加载数据段(0..4GB)选择子
  53.          mov es,eax
  54.          mov fs,eax
  55.          mov gs,eax
  56.       
  57.          mov eax,0x0020                     ;0000 0000 0010 0000
  58.          mov ss,eax
  59.          xor esp,esp                        ;ESP <- 0
  60.       
  61.          mov dword [es:0x0b8000],0x072e0750 ;字符'P'、'.'及其显示属性
  62.          mov dword [es:0x0b8004],0x072e074d ;字符'M'、'.'及其显示属性
  63.          mov dword [es:0x0b8008],0x07200720 ;两个空白字符及其显示属性
  64.          mov dword [es:0x0b800c],0x076b076f ;字符'o'、'k'及其显示属性

  65.          ;开始冒泡排序
  66.          mov ecx,pgdt-string-1              ;遍历次数=串长度-1
  67.   @@1:
  68.          push ecx                           ;32位模式下的loop使用ecx
  69.          xor bx,bx                          ;32位模式下,偏移量可以是16位,也可以
  70.   @@2:                                      ;是后面的32位
  71.          mov ax,[string+bx]
  72.          cmp ah,al                          ;ah中存放的是源字的高字节
  73.          jge @@3
  74.          xchg al,ah
  75.          mov [string+bx],ax
  76.   @@3:
  77.          inc bx
  78.          loop @@2
  79.          pop ecx
  80.          loop @@1
  81.       
  82.          mov ecx,pgdt-string
  83.          xor ebx,ebx                        ;偏移地址是32位的情况
  84.   @@4:                                      ;32位的偏移具有更大的灵活性
  85.          mov ah,0x07
  86.          mov al,[string+ebx]
  87.          mov [es:0xb80a0+ebx*2],ax          ;演示0~4GB寻址。
  88.          inc ebx
  89.          loop @@4
  90.       
  91.          hlt

  92. ;-------------------------------------------------------------------------------
  93.      string           db 's0ke4or92xap3fv8giuzjcy5l1m7hd6bnqtw.'
  94. ;-------------------------------------------------------------------------------
  95.      pgdt             dw 0
  96.                       dd 0x00007e00      ;GDT的物理地址
  97. ;-------------------------------------------------------------------------------                             
  98.      times 510-($-$$) db 0
  99.                       db 0x55,0xaa
复制代码



  1.          ;代码清单12-1
  2.          ;文件名:c12_mbr.asm
  3.          ;文件说明:硬盘主引导扇区代码
  4.          ;创建日期:2011-10-27 22:52

  5.          ;设置堆栈段和栈指针
  6.          mov eax,cs      
  7.          mov ss,eax
  8.          mov sp,0x7c00
  9.       
  10.          ;计算GDT所在的逻辑段地址
  11.          mov eax,[cs:pgdt+0x7c00+0x02]      ;GDT的32位线性基地址
  12.          xor edx,edx
  13.          mov ebx,16
  14.          div ebx                            ;分解成16位逻辑地址

  15.          mov ds,eax                         ;令DS指向该段以进行操作
  16.          mov ebx,edx                        ;段内起始偏移地址

  17.          ;创建0#描述符,它是空描述符,这是处理器的要求
  18.          mov dword [ebx+0x00],0x00000000
  19.          mov dword [ebx+0x04],0x00000000  

  20.          ;创建1#描述符,这是一个数据段,对应0~4GB的线性地址空间
  21.          mov dword [ebx+0x08],0x0000ffff    ;基地址为0,段界限为0xfffff
  22.          mov dword [ebx+0x0c],0x00cf9200    ;粒度为4KB,存储器段描述符

  23.          ;创建保护模式下初始代码段描述符
  24.          mov dword [ebx+0x10],0x7c0001ff    ;基地址为0x00007c00,512字节
  25.          mov dword [ebx+0x14],0x00409800    ;粒度为1个字节,代码段描述符

  26.          ;创建以上代码段的别名描述符
  27.          mov dword [ebx+0x18],0x7c0001ff    ;基地址为0x00007c00,512字节
  28.          mov dword [ebx+0x1c],0x00409200    ;粒度为1个字节,数据段描述符

  29.          mov dword [ebx+0x20],0x7c00fffe
  30.          mov dword [ebx+0x24],0x00cf9600
  31.          
  32.          ;初始化描述符表寄存器GDTR
  33.          mov word [cs: pgdt+0x7c00],39      ;描述符表的界限   

  34.          lgdt [cs: pgdt+0x7c00]
  35.       
  36.          in al,0x92                         ;南桥芯片内的端口
  37.          or al,0000_0010B
  38.          out 0x92,al                        ;打开A20

  39.          cli                                ;中断机制尚未工作

  40.          mov eax,cr0
  41.          or eax,1
  42.          mov cr0,eax                        ;设置PE位
  43.       
  44.          ;以下进入保护模式... ...
  45.          jmp dword 0x0010:flush             ;16位的描述符选择子:32位偏移
  46.                                              
  47.          [bits 32]                          
  48.   flush:                                    
  49.          mov eax,0x0018                     
  50.          mov ds,eax
  51.       
  52.          mov eax,0x0008                     ;加载数据段(0..4GB)选择子
  53.          mov es,eax
  54.          mov fs,eax
  55.          mov gs,eax
  56.       
  57.          mov eax,0x0020                     ;0000 0000 0010 0000
  58.          mov ss,eax
  59.          xor esp,esp                        ;ESP <- 0
  60.       
  61.          mov dword [es:0x0b8000],0x072e0750 ;字符'P'、'.'及其显示属性
  62.          mov dword [es:0x0b8004],0x072e074d ;字符'M'、'.'及其显示属性
  63.          mov dword [es:0x0b8008],0x07200720 ;两个空白字符及其显示属性
  64.          mov dword [es:0x0b800c],0x076b076f ;字符'o'、'k'及其显示属性

  65.          ;开始冒泡排序
  66.          mov ecx,pgdt-string-1              ;遍历次数=串长度-1
  67.   @@1:
  68.          push ecx                           ;32位模式下的loop使用ecx
  69.          xor bx,bx                          ;32位模式下,偏移量可以是16位,也可以
  70.   @@2:                                      ;是后面的32位
  71.          mov ax,[string+bx]
  72.          cmp ah,al                          ;ah中存放的是源字的高字节
  73.          jge @@3
  74.          xchg al,ah
  75.          mov [string+bx],ax
  76.   @@3:
  77.          inc bx
  78.          loop @@2
  79.          pop ecx
  80.          loop @@1
  81.       
  82.          mov ecx,pgdt-string
  83.          xor ebx,ebx                        ;偏移地址是32位的情况
  84.   @@4:                                      ;32位的偏移具有更大的灵活性
  85.          mov ah,0x07
  86.          mov al,[string+ebx]
  87.          mov [es:0xb80a0+ebx*2],ax          ;演示0~4GB寻址。
  88.          inc ebx
  89.          loop @@4
  90.       
  91.          hlt

  92. ;-------------------------------------------------------------------------------
  93.      string           db 's0ke4or92xap3fv8giuzjcy5l1m7hd6bnqtw.'
  94. ;-------------------------------------------------------------------------------
  95.      pgdt             dw 0
  96.                       dd 0x00007e00      ;GDT的物理地址
  97. ;-------------------------------------------------------------------------------                             
  98.      times 510-($-$$) db 0
  99.                       db 0x55,0xaa
复制代码


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-10-3 00:22 , Processed in 0.037724 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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