3.1 as86汇编器
在开始讲述as86汇编器前,这本书引用内核中bootsect.s框架程序汇编代码来解释,记录下这一小段代码中不理解的地方,下面是这段实例代码:
.globl begtext, begdata, begbss, endtext, enddata, endbss
.text !正文段
begtext: !标号
.data !数据段
begdata: !标号
.bss !未初始化数据段
begbss: !标号 .text !正文段
BOOTSEG = 0X07C0
!BIOS加载bootsect代码的原始段地址 entry start
start:
jmpi go,BOOTSEG
go:
mov ax,cs
mov ds,ax
mov es,ax
mov [msg1+],ah
mov cx,#
mov dx,#0x1004
mov bx,#0x000c
mov bp,#msg1
mov ax,#0x1301
int 0x10 !BIOS中断调用0x10,功能0x13,子功能01
loop1:
jmp loop1 !死循环
msg1: .ascii "Loading system..." !调用BIOS中断显示的信息,共20个ASCII码字符
.byte ,
.org !表示以后语句从地址510(0x1FE)开始存放
.word 0xAA55 !有效引导扇区标志,供BIOS加载引导扇区使用
.text
endtext:
.data
enddata:
.bss
endbss:
问题1:书中说“ entry是保留关键字,用于迫使ld86链接器在生成可执行文件中包括进其后指定的标号'start'”,又说“在我们的示例中以及Linux内核boot/bootsect.s和boot/setup.s汇编程 序中完全可以忽略这个关键词,因为我们不希望在生成的纯二进制文件中包含任何符号信息”。以前学汇编的时候,把entry理解为定义程序的入口,如果在二进制可执行文件中没有这 个入口start,那程序从哪里开始执行是怎么确定的呢?
问题2:jmpi go,BOOTSEG,“这是一个段间远跳转语句。BIOS把程序加载到0X7C00并跳转到该处时,所有段寄存器的值均为0,这个跳转语句是为了给CS赋值0X7C0,即此时 CS:IP=0X07C0:0X0005.“,为什么要把程序默认加载到0X7C00,为什么IP的值是0X0005?
问题3:.word 0XAA55,”在此处放置有效扇区引导标志字0XAA55“,什么是有效扇区引导标志字?
3.1 as86汇编器的更多相关文章
- 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码
不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 ...
- Linux内核完全注释之编程语言和环境(一)
as86汇编器 1.来源与对于linux的用途 as86来源minix-386开发的intel 8086.80386汇编编译程序和链接程序,他主要为linux创建16位的启动引导扇区程序boot/bo ...
- linux0.12 编译过程
感谢这篇文章的作者: http://www.cnblogs.com/strugglesometimes/p/4231359.html 编译是个很蛋疼的事情,本想把linux0.12在bochs上 ...
- 3.2 GUN as汇编(本文内容大部分引用原文,非原创)
as86汇编仅仅用于编译内核中的boot/bootsect.s引导扇区程序和实模式下的设置程序boot/setup.s.内核中其余所有汇编语言程序(包括C语言产生的汇编程序)均使用gas来编译,并与C ...
- [Operating System Labs] 我对Linux0.00中 head.s 的理解和注释
?21,# head.s contains the 32-bit startup code.# head.s 是32位的启动代码 # Two L3 task multitasking. The ...
- 实现一个简单的boot
1.汇编语言.分别汇编器和链接as86和ld86.码如下面: .globl begtext,begdata,begbss,endtext,enddata,endbss .text begtext: . ...
- Linux 桌面玩家指南:08. 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- <摘录>Linux 环境下编译 0.11版本内核 kernel
系统环境:Fedora 13 + gcc-4.4.5 最近在看<linux内核0.11完全注释>一书,由于书中涉及汇编语言的地方众多,本人在大学时汇编语言学得一塌糊涂,所以实在看不下去了, ...
- CSAPP读书随笔之一:为什么汇编器会将call指令中的引用的初始值设置为-4
CSAPP,即<深入理解计算机系统:程序员视角>第三版,是一本好书,但读起来确需要具备相当的基本功.而且,有的表述(中译文)还不太直白. 比如,第463页提到,(对于32位系统)为什么汇编 ...
随机推荐
- delphi 句柄
句柄Handle顾名思义就是把柄,把手的意思 ,得到了某对象的句柄可以任意控制此对象 .句柄是一种指向指针的指针.不是每个组件都有句柄,只有窗口控件等(*.模块(module)*.任务(task)*. ...
- i++ ++i的原子性
http://bbs.chinaunix.net/thread-1794304-1-1.html http://blog.csdn.net/sapair/article/details/4243974 ...
- poj 2246 (zoj 1094)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1094 ZOJ Problem Set - 1094 Matrix Chai ...
- Unity中OnGUI绘制贪吃蛇
Square.cs : public class Square : MonoBehaviour { public int row, col; public Rect rect; public Text ...
- 标准简单SP模板(sql server)
CREATE Procedure eSP_ChangeStart --eSP_ChangeStart 64 @ID int, Output As Declare ), @ID_Max int Begi ...
- Reachability下载地址
https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html
- 一个Nodejs的简单计算測试程序
測试目的: 1 測试二维数组的使用 2 输出函数的使用 代码: var util = require('util'); a = 3; b = 4; c = a + b; a = []; for(i = ...
- 通过分析 JDK 源代码研究 Hash 存储机制--转载
通过 HashMap.HashSet 的源代码分析其 Hash 存储机制 集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java 对象放入数组中,只是把对象 ...
- [转] thrift的使用介绍
http://gemantic.iteye.com/blog/1199214 一.About thrift 二.什么是thrift,怎么工作? 三.Thrift IDL 四.Thrift ...
- 人工智能2:智能Agent
一.Agent基本定义 基于理性行为的Agent是本书人工智能方法的核心.Agent由传感器.执行器两个重要元件组成,具有与环境交互的能力,其能力是通过分析感知序列,经过Agent函数映射到相应的行动 ...