用机器码写hello world
相对论万岁2015/01/18软件综合 IP:湖北
本文最早发布于我的博客 XXXXXXXXXXXXXXXXXX/?p=281,采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可,转载需声明。与原文有改动
[hr]闲的蛋疼,于是就有了这个无聊的想法
用汇编写程序就已经看起来很高大上了,那么直接用机器码呢?
其实机器码并没有想象中的那么困难,
机器码和汇编语言是一一对应的,因此知道了汇编语言,再学会转换的方法,就可以直接用机器码写程序了
本文将会分为两个部分,介绍如何用机器码写hello world
一、基础知识
  • 写一个怎样的程序
  • 计算机引导
  • mbr
  • x86
  • 实模式与保护模式
  • 逻辑地址
  • 显存与内存映射
二、写程序
  • 使用diskgenius写机器码
  • 运行程序

[hr]废话不多说,让我们先从写一个怎样的程序开始
【你这不是废话吗,标题都写了是hello world!】
不不不,没那么简单,写完了程序在哪儿运行也是一个值得思考的问题
【这有啥子好思考的?双击运行呗!】
NO,没有那么简单。要知道cpu只能从内存中执行我们的程序,想让计算机运行程序,就需要先将程序放入内存。当你在windows里双击一个可执行文件时,操作系统会帮助我们将程序放入内存,再由计算机执行
但是若想要操作系统听你的话,你就必须按照操作系统指定的格式来编写程序。如果你不按照系统的要求来,他只会弹出来一个框,告诉你“xxx不是win32应用程序”
然后你就只有瞄着屏幕哈气了(我们数学老师的口头禅)
我们的目标是在屏幕上显示出一行hello world,考虑这些会大大增加实现的难度。
为了更加方便编(zhuang)程(B),扔掉该死的操作系统就好了
不过抛弃了操作系统,上面的问题还是没有解决:如何将程序放入内存?
要解决这个问题,我们必须从计算机的引导过程说起.
你可能已经知道,引导的英文是是“boot”,如果你比较冲动的去查了一下,你会发现它本来的意思是靴子。。。没错,就是靴子
原来,这里的boot是bootstrap(鞋带)的缩写,它来自一句谚语:
“pull oneself up by one’s bootstraps”,意思是拽着鞋带把自己拉起来,这句话牛顿爷爷听了肯定很不高兴。
在计算机刚刚发明的时候,工程师是灰常纠结的,为什么呢?要知道,计算机是从RAM里头执行程序的,工程师纠结的问题和我们差不多,如何把程序放入RAM。
这可以由一个程序完成,但是这样就意味着:必须先运行一段程序计算机才能启动,计算机要运行程序,又必须启动……于是就死循环了。。。
工程师需要想尽办法,把程序装入RAM,计算机才能启动,而这个过程他们叫做“拉鞋带”,久而久之就叫“boot”了。
之后,人们发明了ROM,人们将开机程序存在ROM里,这样每次开机,计算机就自动从ROM里执行这段开机程序。
这块芯片里的程序叫做”基本输出输入系统”(Basic Input/Output System),简称为BIOS。BIOS程序会将引导程序放入内存,然后让cpu执行引导程序,自己就去睡觉了
我们只需要将我们的hello world当做引导程序,其他的交给BIOS就行了。
BIOS实际上是将硬盘(严格的说是储存介质,包括光盘)上的第一个扇区(共512字节)放入内存,这个扇区叫做MBR( Master Boot Record,主引导记录 )
MBR分为三个部分,分别是
  • 466字节的引导程序
  • 64字节的分区表
  • 2字节的校验位
引导扇区是用来放引导程序的(有引导的需要的话),我们这个程序没有什么需要引导的,因此直接将hello world放入这里就行了。466字节看起来很少,实际上对于显示hello world是绰绰有余的(我们仅是用了几十字节)
分区表没什么好说的,用来硬盘的分区信息。因为只有64字节,因此保存的数据是很有限的,这也是为什么一块硬盘上最多只能有四个主分区的原因——第五个主分区放不下…
最后的校验位很重要,正确的值是55aa(不然说明这个不是MBR)。
BIOS程序是很负责的,它在把这个扇区的内容复制到内存中后,会检查这两个字节,当它为55AA的时候,BIOS才会放心的睡大觉(不然说明这不是引导信息,BIOS会继续按照你设置的引导顺序检查别的驱动器,比如光驱)
x86
1978年6月8日,Intel发布了新款16位微处理器“8086”,也同时开创了一个新时代:x86架构诞生了。
这是一个复杂指令集(于此相对有“精简指令集”)
尽管过了这么多年,但直到今天,为了保证电脑能继续运行以往开发的各类应用程序,Intel公司所生产的所有CPU仍然继续使用(兼容)X86指令集。
(由于x86的效率实在是太低,inter早就想扔掉x86。但是在2003年,竞争对手AMD首先推出了64位cpu,x86-64,也就是传说中的x64,兼容x86。inter没有办法,只好也与2004年推出了兼容x86的64位cpu)
上面都扯远了,现在再说一说实模式与保护模式
保护模式与实模式相对应。在80286以前,CPU只有实时模式,在286之后增加了保护模式。保护模式下有保护机制,可以防止程序在运行的时候胡乱修改内存(比如数组越界,如果在实模式下,系统就可能崩溃)
但为了保证兼容(又是讨厌的兼容),80286及以后的CPU会首先进入实模式,然后通过切换机制再进入到保护模式。
在实模式下面,所有寄存器都是16位的(哪怕是64位的cpu也一样),在切换到保护模式下后,才会变成32(64)位。
我们只不过想显示一行hello world,就用实模式足够了,简单才是王道嘛!
加载全文
来自:计算机科学 / 软件综合
32
 
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
相对论万岁
进士 学者 机友 笔友
文章
49
回复
1322
学术分
1
2012/03/18注册,5个月24天前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}