弄了三天了,终于弄好了,先说结果,就是作者在网站上放了os x的工具(hrb.osask.jp,也有linux下的工具,可以自己去下载),也就是说我白忙活了三天。。。

再说一下这几天都干啥了,主要是想把c语言和nasm汇编连在一起。这个很多人都做过,但在网上现有的资料很少有在os X上做的的,也或者做了大家都没人说。。。。先贴代码:

extern void swap(int *,int *);

void main(){
int a=1;
int b=2;
swap(&a,&b);
while(a==2)
; }

这是c代码,调用swap交换两个值,为了不调用标准库,我没写显示函数,而是用了一个死循环代替,如果程序停住了,说明运行成功,再贴下汇编,这是我第一次写汇编哦。。啦啦啦啦啦

GLOBAL _swap
[section .text]
_swap:
mov EDX,[ESP+4]
mov EAX,[ESP+8]
mov EBX,[EDX]
mov ECX,[EAX]
mov [EDX],ECX
mov [EAX],EBX
ret

代码很简单,但是和书上格式有些不同,作者说的他用的是nask是他自己改版的nasm所以有些关键字用不了。。。

然后是编译成obj文件,这个很纠结,一开始不会用gcc编译出32位obj后来发现要加:

-m32

就可以了。

编译过程如下图:

整个编译连接过程,最后光标停止,说明函数执行成功,如果nasm中写了什么中断或者什么其他系统不允许的可能会有总线错误(bus error)或者段错误(详情可以去看《c专家编程》,有相关说明)。

值得注意的是nasm -f 的参数:

valid output formats for -f are (`*' denotes default):

* bin       flat-form binary files (e.g. DOS .COM, .SYS)

aout      Linux a.out object files

aoutb     NetBSD/FreeBSD a.out object files

coff      COFF (i386) object files (e.g. DJGPP for DOS)

elf       ELF32 (i386) object files (e.g. Linux)

as86      Linux as86 (bin86 version 0.3) object files

obj       MS-DOS 16-bit/32-bit OMF object files

win32     Microsoft Win32 (i386) object files

rdf       Relocatable Dynamic Object File Format v2.0

ieee      IEEE-695 (LADsoft variant) object file format

macho     NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X object files

这个参数纠结了好久,最后还是看帮助搞定的,因为linux下都是elf,但是os x用elf参数最后ld会报错,说找不到xxx函数定义。。

ld的相关问题:

1:ld: symbol(s) not found for inferred architecture i386

2:ld: symbol(s) not found for inferred architecture x86_64

3:ld: warning: ignoring file xxxx.o, file was built for unsupported file format

1,2和3的问题原因都是-f参数选的不对,或者gcc编译出来的是64位obj,nasm只能编译出来32或者16位目标代码。

如果和系统可运行程序不对应,ld不会给你链接的哦。。

最后是objcopy,这个是GNU 的binutils的工具包的一部分。作用是操作二进制文件,可以任意改格式,具体参考说明,吧之前链接好的用objcopy 生成纯二进制文件后,和作者的比较发现,不一样,运行时qemu卡死,得到结论就是这两天又白忙活了。。。还好算是找到了工具,也有源代码,值得好好学习。

《30天自制操作系统》学习笔记--Mac环境搭建的更多相关文章

  1. 《30天自制操作系统》笔记(03)——使用Vmware

    <30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...

  2. 《30天自制操作系统》笔记3 --- (Day2 上节)完全解析文件系统

    Day2 汇编语言学习与Makefile入门 本文仅带着思路,研究源码里关于文件系统的参数 关于day2主程序部分及更多内容,请看<30天自制操作系统>笔记 导航 发现学习中的变化 源码差 ...

  3. 《30天自制操作系统》笔记(06)——CPU的32位模式

    <30天自制操作系统>笔记(06)——CPU的32位模式 进度回顾 上一篇中实现了启用鼠标.键盘的功能.屏幕上会显示出用户按键.点击鼠标的情况.这是通过设置硬件的中断函数实现的,可以说硬件 ...

  4. 《30天自制操作系统》笔记(02)——导入C语言

    <30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...

  5. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...

  6. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】

    转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...

  7. Android Studio 学习笔记(一)环境搭建、文件目录等相关说明

    Android Studio 学习笔记(一)环境搭建.文件目录等相关说明 引入 对APP开发而言,Android和iOS是两大主流开发平台,其中区别在于 Android用java语言,用Android ...

  8. 单字节的FIFO缓存(30天自制操作系统--读书笔记)

    从今天起,写一些读书笔记.最近几个月都在看<30天自制操作系统这本书>,书虽说看的是电子书,但可以花钱买的正版书,既然花费了金钱,就总得有些收获. 任何人都不能总是固步自封,想要进步就得学 ...

  9. cocos2d-x lua 学习笔记(1) -- 环境搭建

    Cocos2d-x 3.0以上版本的环境搭建和之前的Cocos2d-x 2.0 版差异较大的,同时从Cocos2d-x 3.0项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后, ...

随机推荐

  1. php商城秒杀活动

    今天在网上看到一篇思路+代码的商城秒杀实例,我觉得非常不错,借鉴一下分享给大家: 一.前言 双十一刚过不久,大家都知道在天猫.京东.苏宁等等电商网站上有很多秒杀活动,例如在某一个时刻抢购一个原价199 ...

  2. 文件 open 方法

    文件对象方法: 文件对象方法  执行操作 f.close()    关闭文件 f.read([size=-1]) 从文件读取size个字符,当未给定size或给定负值的时候, 读取剩余的所有字符,然后 ...

  3. linux下mysql部署

    mysql 1.拓扑结构 mysql集群有如下三层: 应用程序层:负责与mysql服务器通信的各种应用程序. Mysql服务器层:处理SQL命令,并与NDB存储引擎通信和Mysql服务器. NDB集群 ...

  4. Vector , list 和 deque的区别

     vector   表示一段连续的内存区域,每个元素被顺序存储在这段内存中,对vector   的随机访问效率很高,但对非末尾元素的插入和删除则效率非常低.  deque    也表示一段连续的内存区 ...

  5. 使用百度echarts仿雪球分时图(二)

    上一章简单的介绍了一下分时图的构成,其实就是折线图跟柱状图的组成.本来这章打算是把分时图做完,然后再写一章来进行美化和总结,但是仔细观察了一下,发现其实东西还是有点多的.分时图的图表做完后,还要去美化 ...

  6. sql 将英文句子中的单词首字母转换为大写

    create function dbo.pTitleCase(@StrIn nvarchar(max))returns nvarchar(max)as begin; declare @StrOut n ...

  7. oracle解锁oracle默认用户scott

    oracle中存在一个默认的用户scott,密码为tiger,当在安装oracle时,若未给该账户解锁,则登录该用户时, 会提示被锁定. 如何通过sqlplus命令为scott解锁: 1.C:> ...

  8. # 机器学习算法总结-第四天(SKlearn/数据处理and特征工程)

    总结: 量纲化(归一化,标准化) 缺失值处理(补0.均值.中值.众数.自定义) 编码/哑变量:忽略数字中自带数学性质(文字->数值类型) 连续特征离散化(二值化/分箱处理)

  9. vue.config.js基础配置

    const path = require('path') const UglifyPlugin = require('uglifyjs-webpack-plugin') module.exports ...

  10. dedecms:限制栏目列表生成的最大页数防止被采集

    dedecms:限制栏目列表生成的最大页数防止被采集 如果您的网站数据量较大,列表很多的话甚至达到上千页,生成列表时就特别耗费时间,这个缺点可以被优化掉:网站好不容易建起来,担心网站内容被采集走,如果 ...