自己动手写操作系统第二章 pmtest1.asm分析

2023-05-16

"pm.inc"

;描述符
;Usage:Descrptor Base,Limit,Attr
;   Base :dd
;      Limit:dd (Low 20 bits available)
;      Attr:dw (lower 4 bits of higher byte are always 0)


DA_C EQU 98h ; 存在的只执行代码段属性值
DA_DRW EQU 92h ; 存在的可读写数据段属性值
DA_32 EQU 4000h ; 32 位段


%macro Descriptor 3
dw %2 &0FFFFh ;段界限1
dw %1 & 0FFFFh  ;段基址1
db (%1 >> 16) & 0FFh;段基址2
dw ((%2 >> 8) & 0F00h) |(%3 & 0F0FFh)
;属性1+段界限2+属性2
db (%1 >> 24) & 0FFh;段基址3 
%endmacro ;共8字节


%include "pm.inc"
org 0100h
;ORG 0100h的实际含义
;PSP程序段前缀
;要了解ORG 0100h,就必须先了解程序段前缀PSP(Program Segment Prefix)
;程序段前缀是一个操作系统(DOS)概念。当输入一个外部命令或通过EXEC子功能
;(系统功能调用INT21h,子功能号为4Bh)加载一个程序时,COMMAND确定当前可用内存的最低端
;作为程序段的起点,也就是程序被加载到内存空间的起点。在程序所占用内存的前256(0100h)个
;字节中,DOS会为程序创建前缀(PSP)数据区。PSP结构与CP/M中的“控制区域”概念十分接近,
;这是因为DOS就是从CP/M演变而来的。
;DOS利用PSP与被加载的程序进行通信。PSP中有程序的返回地址、程序文件名等信息。
;16位DOS中,内存的物理地址=段地址*16 + 偏移量,比如段地址0xC0h,偏移量0x50h,
;则最后的物理地址是0xC0h * 16 + 0x50h = 0xC50h
;ORG用来告诉汇编器,程序加载到内存时的初始偏移量为0x100h,用于跳过PSP。
;比如你有一个标号Test的偏移地址是0x0Bh,当编译器看见ORG 0x100h后,就会给
;这个偏移加上0x100h,编译完成的.com文件中,这个偏移就变成了0x10Bh。
;如果你没有加ORG 0100h,则偏移仍然是0x0Bh,则访问该标号时,就跑到PSP里了,
;因为程序段的前0100h个字节,都是PSP的数据,而不是用户数据。
;同理,你写ORG 0x200h,则该标号的偏移地址在编译的.com文件中,会变成0x20Bh。
    jmp LABEL_BEGIN


[SECTION .gdt]
;GDT 定义了一个叫做GDT的数据结构
LABEL_GDT: Descriptor 0,0,0;空描述符
LABEL_DESC_CODE32: Descriptor 0,SegCode32Len-1,DA_C+DA_32;代码段,32位
LABEL_DESC_VIDEO: Descriptor 0B8000h,0ffffh,DA_DRW ;显存首地址
;GDT结束


GdtLen  equ $-LABEL_GDT ;GDT长度
GdtPtr  dw GdtLen ;GDT界限
        dd 0 ;GDT基地址 在16位代码段中被重新设置


;GDT选择子
SelectorCode32  equ LABEL_DESC_CODE32-LABEL_GDT
SelectorVideo  equ LABEL_DESC_VIDEO-LABEL_GDT
;END OF [SECTION .gdt]

;定义26位代码 进行与GDT有关的操作
[SECTION .s16]
[BITS 16]
LABEL_BEGIN:
    mov ax,cs
    mov ds,ax
mov es,ax
mov ss,ax
mov sp,0100h

;初始化32位代码段描述符
xor eax,eax
mov ax,cs
shl eax,4
add eax,LABEL_SEG_CODE32
mov word [LABEL_DESC_CODE32+2],ax
shr eax,16
mov byte [LABEL_DESC_CODE32+4],al
mov byte [LABEL_DESC_CODE32+7],ah

;mov ax,cs

;shl eax,4

;将cs的值(16bit 实模式下即为当前代码段的基地址) 

;左移4bit即得到当前代码段的物理基地址

;add eax,LABEL_SEF_CODE32

;此时eax即为实模式下LABEL_SEF_CODE32的物理地址

;然后再用此地址分为三部分去初始化LABEL_DESC_CODE32



;为加载gdtr做准备
xor eax,eax
mov ax,ds
shl eax,4
add eax,LABEL_GDT ;eax <-- gdt基地址
mov dword [GdtPtr+2],eax ;[GdtPtr+2] <-- gdt基地址

;加载gdtr
lgdt [GdtPtr]

;关中断
cli

;打开地址线A20
in al,92h
or al,00000010b
out 92h,al

;准备切换到保护模式
mov eax,cr0
or eax,1
mov cr0,eax

;真正进入保护模式
jmp dword SelectorCode32:0
;执行这一句会把SelectorCode32
;装入cs,并转到SelectorCode32:0处

[SECTION .S32] ;32位代码,由实模式跳入
[BITS 32]

LABEL_SEG_CODE32:
   mov ax,SelectorVideo
mov gs,ax ;视频段选择子

mov edi,(80*10+0)*2 ;屏幕第10行 第0列
mov ah,0ch ;0000:黑底 1100:红字
mov al,'P'
mov [gs:edi],ax

;到此停止

jmp $
SegCode32Len equ $-LABEL_SEG_CODE32

;END of [SECTION .S32]































本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自己动手写操作系统第二章 pmtest1.asm分析 的相关文章

  • 自己动手写操作系统第二章 pmtest1.asm分析

    34 pm inc 34 描述符 Usage Descrptor Base Limit Attr Base dd Limit dd Low 20 bits available Attr dw lower 4 bits of higher b
  • __asm void MSR_MSP(uint32_t addr) 提示:error:expected '(' after 'asm'

    SYSTEM sys sys c 33 7 error expected 39 39 before 39 void 39 ASM void MSR MSP u32 addr 在STM32中的sys c文件编译报出这个错误时 xff1a AS
  • KEIL ARM 6.12 compiler 编译__ASM 错误的解决方法

    1 问题 KEIL compiler 设置为 use default compiler version 5 可以正确编译以下汇编和C混合代码 xff0c 更改编译器为V6 12后不识别 ASM关键字 xff0c 并对汇编语法报错 替换为 A
  • 关于make zImage时出现include/asm/timex.h:15:28: asm/arch/timex.h: No such file or directory

    root 64 localhost linux cd linux 2 6 18 root 64 localhost linux 2 6 18 make zImage CHK include linux version h SYMLINK i
  • ASM汇编常用跳转指令-极速查

    作者 xff1a 逆向驿站 微信公众号 xff1a 逆向驿站 知乎 xff1a 逆向驿站 若不是老鸟 xff0c 是不是经常为各种JXX汇编跳转指令查资料 xff1f 影响效率 xff0c 更影响潜意识整体分析的 34 灵光一现 34 本公
  • vs 出现chkstk.asm问题的解决方式

    程序编译成功无报错 xff0c 执行debug时 xff0c 突然系统跳chkstk asm 报了堆栈错误 定位问题 我们到堆栈最后执行的地方 xff0c 发现是一个线程创建 这里肯定没有问题 xff0c 那么问题肯定出现在线程的初始化里
  • Gradle 插件 + ASM 实战 - JVM 虚拟机加载 Class 原理

    开篇就提到效能优化涉及的范围会很广 xff0c 考虑后面需要经常用到 asm 字节码插桩 xff0c 我们首先从 Gradle 插件 43 ASM 实战 开始讲 xff0c 但又希望大家能知其然也知其所以然 xff0c 因此我们首先得讲下
  • 2 如何用ASM进行插桩

    假如我们现在有这样一个文件 代码如下 public class Hello public String name hello public static void main String args System out println He
  • 汇编寄存器介绍

    1 通用寄存器 名称 全称 32位 16位 8位 编号 功能 rax 累加器 Accumulator eax ax ah al 0 0000 返回值 rcx 计数器 Count Register ecx cx ch cl 1 0001 第二
  • AOP的底层实现--ASM

    在ASM的核心组件中 Opcodes接口定义了一些常量 尤其是版本号 访问标识符 字节码等信息 ClassReader用于读取Class文件 它的作用时进行Class文件的解析 并可以接受一个ClassVisitor ClassReader
  • asm常用命令汇总

    在Oracle 环境下 使用grid帐号执行 运行asmcmd进入asm命令模式 如 grid oradb node1 asmcmd ASMCMD gt ASMCMD gt du 显示指定的ASM目录下ASM文件占用的所有磁盘空间 ASMC
  • 汇编语言中各种寄存器的总结

    汇编语言中各种寄存器的总结 1 通用寄存器 数据寄存器 AX BX CX DX 指针寄存器 SP BP 变址寄存器 SI DI 2 控制寄存器 IP FLAG 3 段寄存器 CS 代码段寄存器 基本概念解释 start作用 DS 数据段寄存
  • 【8086汇编】字符串逆序的实现,附代码

    目录 引言 题目 程序思想 程序例程 程序结果 改进思路 引言 之前有本科的同学需要做一个汇编程序 简单补了补发现自己会嘻嘻嘻 题目 题目 从键盘输入任一字符串 字符数 gt 1 在下一行以相反的次序显示出来 如 输入字符串123abc 在
  • Linux系统调用指南

    Linux系统调用指南 文章是转载 但是我在后面的案例加了不少注解并debug了 如有疑问 留言交流 其实我也不懂 原文链接 blog packagecloud io https zcfy cc article the definitive
  • Java Agent与ASM字节码介绍

    Java Agent Java Agent是jdk1 5以后引入的 也叫做Java代理 javaAgent是运行方法之前的拦截器 我们利用javaAgent和ASM字节码技术 在JVM加载class二进制文件的时候 利用ASM动态的修改加载
  • 使用ASM编写 打印方法运行的时间 代码分析

    请先简单阅读下原文代码 https blog csdn net weixin 44618248 article details 107086410 可以对照源代码在阅读本文同时可以看得更清晰一些 注 以下属于个人学习 理解 如果偏颇过深 非
  • asm:常用语法

    常用语法 1 循环 1 1 使用条件跳转指令实现循环 1 2 使用LOOP指令实现循环 2 字符串 2 1 指定字符串的长度 2 2 字符串指令 2 3 重复前缀 3 数组 4 递归 5 宏 6 文件操作 7 内存管理 1 循环 1 1 使
  • asm:常见指令大全

    常见指令大全 算数指令 INC 指令 DEC 指令 ADD 指令 SUB指令 MUL指令 IMUL指令 DIV指令 IDIV指令 逻辑指令 AND指令 OR指令 XOR 指令 TEST指令 NOT指令 交换指令 xchg 比较指令 CMP指
  • 【asm基础】nasm和masm的一些区别

    差异点说明 1 nasm是区分大小写的 2 nasm中访问内存需要使用 将内存地址括起来 例如 bar equ 2 mov rax bar mov rax bar 这个才是存储地址中内容的操作 3 nasm不存储类型信息 所以也不能使用MO
  • 用汇编语言实现结构体的输入和保存

    COUNT EQU 1 ALL INPUT MACRO STRING NUM FUNCTION MOV DX OFFSET STRING MOV AH 9H INT 21H MOV DI OFFSET INFO NUM MOV AX SIZ

随机推荐

  • python List中元素两两组合

    aa span class token operator 61 span span class token punctuation span span class token string 39 a 39 span span class t
  • JRE not compatible with project .class file compatibility: 1.7

    电脑上刚装了jdk1 7 xff0c 运行一般程序的时候没有出现什么问题 xff0c 由于内存不够用 xff0c 在设置虚拟内存时却出现问题 xff0c 如下 xff1a 还好找到了解决办法 xff0c 错误的原因是JRE库配置与Java
  • BufferedWriter 的 flush() 方法

    package com corpus import java io import java util List import edu stanford nlp ling HasWord import edu stanford nlp lin
  • 正则表达式匹配连续多个空格或tab空格

    Pattern p 61 Pattern compile 34 s 2 t 34 Matcher m 61 p matcher str String strNoBlank 61 m replaceAll 34 34 System out p
  • LaTex中插入花体字母

    特别要注意的是 xff1a 在LaTeX中 xff0c 别把希腊字母和英文的花体字母搞混哦 xff0c 哈哈 举个例子 xff1a 后面显示的 X 不是希腊字母 西 即 也就是说不能通过 Chi 的方式插入这个特殊符号 xff0c 正确的花
  • 气哭了的C++调试,cmake 找不到 eigen

    这才刚刚开头 xff0c 可是就是不知道错误在哪里 xff1f 百度了问题后 xff0c 打开了很多很多相关的解答 xff0c 从昨天上午遇到这个问题 xff0c 历经昨天下午和晚上 xff0c 还是错误 xff0c 终于在今天上午圆满解决
  • 对ORACLE SCN的理解

    1 SCN数值实际来源于系统的timestamp xff0c 这个实际可以证明 select current scn from v database select timestamp to scn sysdate from dual 这两个
  • Ubuntu 下 终端界面转图形界面

    在运行程序的时候 xff0c 错误的使用了快捷键 ctrl 43 alt 43 F10 然后 unbuntu就黑屏了 xff0c 整个界面只剩下左上角有一个白色的字符在闪 xff0c 然后 Ctrl 43 alt 43 F2时跳出终端的登录
  • python错误:TypeError: 'module' object is not callable

    TrainCorpusStructure py 文件中的代码如下 xff1a class TrainCorpusStructure inputs 61 Demo py中的代码如下 xff1a from corpusProcess impor
  • python 除法保留两位小数点

    span class hljs operator a span 61 span class hljs number 1 span b 61 span class hljs number 3 span print span class hlj
  • pytorch中contiguous()

    contiguous xff1a view只能用在contiguous的variable上 如果在view之前用了transpose permute等 xff0c 需要用contiguous 来返回一个contiguous copy 一种可
  • tensorflow中control_flow_ops.while_loop

    self h0 61 tf zeros self batch size self hidden dim self h0 61 tf stack self h0 self h0 相当于 h0和C0 generator on initial r
  • k8s基础

    目录 一 基本介绍 二 组件介绍 1 master组件 2 node组件 三 核心概念 1 Pod 2 controller 3 service 四 单master搭建集群 1 系统初始化 2 安装k8s核心组件 3 容器化安装其他插件 4
  • 论文解读:Tips and Tricks for Visual Question Answering: Learnings from the 2017 Challenge

    这是关于VQA问题的第十二篇系列文章 这篇论文具有很强的指导意义 xff0c 本篇文章将介绍论文 xff1a 主要思想 xff1b 模型方法 xff1b 试验细节 有兴趣可以查看原文 xff1a Tips and Tricks for Vi
  • 总结2014——迷茫以及迷茫过后的坚持

    首先 xff0c 借用一句话和大家共勉 xff1a 少一些功利主义的追求 xff0c 多一些不为什么的坚持 xff01 xff01 不知不觉15年也快过了1个月了 xff0c 还是想着要为14年做一下总结 xff1a 记录一下自己的历程 今
  • 在faster rcnn中使用soft nms,faster rcnn的改进(一)

    1 背景介绍 我的项目是利用faster rcnn检测kiiti数据集 xff0c 用原始nms xff0c iters 61 10000的情况下 xff0c 得到的mAP 61 0 586 在改用soft nms后 xff0c 其他参数均
  • 建立DATAGUARD最大保护模式-测试手记

    建立DATAGUARD 最大保护模式 xff08 自写 xff09 xff08 备注 xff1a 本文档符合最大保护模式 xff0c 所有参数均为最大保护模式下适用 xff0c 其他模式不适用 xff09 1 主库 xff0c 启动归档 x
  • docker中安装ping | vim | nginx镜像

    docker安装nginx镜像并常见nginx容器 docker pull nginx latest docker run detach publish 9999 80 name nginxSer restart unless stoppe
  • 从操作系统内核解释电脑死机原理

    关于电脑死机的原因或者说原理 xff0c 即电脑为什么会死机 xff0c 电脑死机时计算机底层都发生了什么 一直不太明白 xff0c 在网上也查过相关的资料 xff0c 但是都没有找到自己想要的 网上谈的都是外部导致电脑死机的原因 xff0
  • 自己动手写操作系统第二章 pmtest1.asm分析

    34 pm inc 34 描述符 Usage Descrptor Base Limit Attr Base dd Limit dd Low 20 bits available Attr dw lower 4 bits of higher b