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位系统)为什么汇编 ...
随机推荐
- onCreateOptionsMenu与onCreateContextMenu差别
onCreateOptionsMenu只会在启动时调用一次,而onCreateContextMenu则每次都会调用,这是因为onCreateContextMenu需要为所有的View控件的上下文菜单服 ...
- 敏捷软件开发模型--SCRUM
敏捷软件开发模型--SCRUM 一 什么是Scrum?Scrum (英式橄榄球争球队), 软件开发模型是敏捷开发的一种,在最近的一两年内逐渐流行起来. Scrum的基本假设是: 开发软件就像开发新产品 ...
- 如何获取jqGrid中选择的行的数据
原文地址:http://hi.baidu.com/feifan3211/item/c5831f44158761a5df2a9fc1 如何获取jqGrid中选择的行的数据? 下面可以获取选择一行的id, ...
- puppet yum安装配置,简单证书维护
Puppet学习之puppet的安装和配置 一.Puppet简介 Puppet基于ruby语言开发的自动化系统配置工具,可以C/S模式或独立运行,支持对所有UNIX及类UNIX系统的配置管理,最新版本 ...
- php几个不起眼儿的小技巧
说是不起眼儿的小技巧,其实应该说是不常用的常规应用吧.很多事情就是这样,知道是一马事儿,会用是一马事儿,精习又是另外一马事儿.而成为高手更是需要扎实的基本功. str_repeat 重复输出字符串就靠 ...
- java遍历map方法
java 代码: import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class Map ...
- [Redux] Writing a Todo List Reducer (Adding a Todo)
Learn how to implement adding a todo in a todo list application reducer. let todo = (state = [], act ...
- WinSock IO模型 -- WSAEventSelect模型事件触发条件说明
FD_READ事件 l 调用WSAEventSelect函数时,如果当前有数据可读 l 有数据到达时,并且没有发送过FD_READ事件 l 调用recv/recvfrom函数后,仍然有数据可读时 ...
- MyEclipse设置默认的文档注释
- spring-qualifier解释
如果一个class有两个对应的beanId,在Autowired的时候,必须指定Qualifier("指定其中一个beanId"). org.springframework.bea ...