弄了三天了,终于弄好了,先说结果,就是作者在网站上放了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. go语言操作kafka

    go语言操作kafka Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能.持久化.多副本备份.横向扩展等特点.本文介绍了如何使用Go语言发送和 ...

  2. Go语言操作NoSql

    NSQ平台 NSQ是目前比较流行的一个分布式的消息队列,本文主要介绍了NSQ及Go语言如何操作NSQ. NSQ NSQ介绍 NSQ是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异. N ...

  3. 怎样创建一个canvas画布环境

    1. 由于canvas画布在网页中, 所以需要在html中添加canvas标签: <!DOCTYPE html> <html lang="en"> < ...

  4. OneinStack – 一键PHP/JAVA安装工具

    https://oneinstack.com/ OneinStack包含以下组合:lnmp(Linux + Nginx+ MySQL+ PHP) lamp(Linux + Apache+ MySQL+ ...

  5. SVG学习之stroke-dasharray 和 stroke-dashoffset 详解

    本文适合对SVG已经有所了解,但是对stoke-dasharray和stroke-dashoffset用法有疑问的童鞋 第一:概念解释 1. stroke意思是:画短线于,在...上划线 2. str ...

  6. 安卓开发之Toolbar返回键

    本文前三步演示了为Toolbar添加返回键并实现返回的步骤,第四步给出了设置返回键颜色的方法. 1.在xml布局中引用toolbar: <android.support.design.widge ...

  7. 行级安全(Row

    通过授予和拒绝(Grant/Deny)命令控制用户的权限,只能控制用户对数据库对象的访问权限,这意味着,用户访问的粒度是对象整体,可以是一个数据表,或视图等,用户要么能够访问数据库对象,要么没有权限访 ...

  8. 【Distributed】大型网站高并发和高可用

    一.DNS域名解析 二.大型网站系统应有的特点 三.网站架构演变过程 3.1 传统架构 3.2 分布式架构 3.3 SOA架构 3.4 微服务架构 四.高并发设计原则 4.1 拆分系统 4.2 服务化 ...

  9. 第一章、前端之html

    目录 第一章.前端之html 一. html介绍 第一章.前端之html 一. html介绍 web服务本质 import socket sk = socket.socket() sk.bind((& ...

  10. RobHess的SIFT代码解析步骤三

    平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 主要参考:1.代码:RobHess的SIFT源码 2.书:王永明 ...