通过前几篇文章,我们逐步建立了学习汇编语言之前需要的基础知识。接下来,在这篇文章中,我们开始编写我们的第一个汇编程序了。

编辑器,汇编器与链接器

工欲善其事,必先利其器。我们编写汇编语言,至少需要编辑器、汇编器和链接器。编辑器,就是提供语法高亮、智能缩进、自动补全等功能的文本编辑软件,汇编器与链接器则是汇编语言需要的核心装备,其功能我会在接下来的几篇文章中提到。我使用的编辑器是Visual Studio Code, 汇编器是自带的as, 链接器也是自带的ld.

第一个程序

我们在编辑器中输入如下语句,并在自己的目录下保存为exit.s.

# exit.s    .section    __TEXT,__text.globl  _main
_main:movq    $0, %raxretq

然后在终端下进入该目录,键入如下命令:

as exit.s -o exit.o

然后再键入

ld exit.o -o exit -lSystem

此时该目录下应该会有一个叫exit的可执行文件,我们在终端下运行它:

./exit

然后,什么都没有发生,程序自动退出了。大功告成!

关于这个程序的解释,我决定下篇文章再讲。这篇文章接下来的篇幅,我打算谈一谈汇编器与汇编语法。

汇编语法

汇编语言是机器码的human-readable版本。虽说如此,汇编语法现在的主流也有两大阵营:Intel语法与GAS语法。其最显著的区别就在于,Intel语法的组成是「指令+目的+源」,而GAS语法的组成是「指令+源+目的」。就比如说,同样的意思,Intel语法是“给小明一个粉笔”,而GAS语法则是“把一个粉笔给小明”。这两种语法并没有优劣,在这一系列文章中,我主要介绍的是GAS语法。

Intel语法是在Windows上进行汇编语言编程时主要使用的,而GAS语法,又称为AT&T语法,则主要是在Linux和类Unix上进行汇编语言时会用到。这里并不是说在不同操作系统上必须用不同的语法,在类Unix的macOS上也能用Intel语法,只不过是大家都偏好这么用罢了。

GCC与LLVM

我们知道,对于一门编程语言来说,它有对应的编译器和调试器。对于编译器来说,在类Unix系统上主要有两大阵营:GCC和LLVM. GCC包括C编译器gcc、调试器gdb等,LLVM项目包括C编译器clang、调试器lldb等。对于编译器,GCC的思路是对于每一个CPU架构、每一种操作系统,都开发一个对应的编译器,将代码直接编译成对应的可执行文件;而LLVM项目的思路则是将编译过程分为前端和后端,无论是在什么平台、什么CPU架构下,编译器前端都是相同的,将源代码编译成llvm中间码(IR). 而后端则是将IR再翻译成对应操作系统中对应CPU架构下的可执行文件。因此,如果有a种语言,b个操作系统和c个CPU架构,那么GCC一共需要abc种编译器,而LLVM项目则一共需要a种前端和bc种后端,最终效果是只需要a+bc种编译器代码。

对于高级编程语言,GCC与LLVM的竞争主要在于编译的优化、效率等,但是对于汇编语言,由于其可以直译机器码,所以并不存在汇编器优化,因此,在机器码层面,GCC和LLVM是等效的。在这一系列文章中我使用的汇编器as是"Mac OS X Mach-O GNU-based assemblers", 调试器是LLVM的lldb.

GCC套件是GNU操作系统的一个部分,GNU是开源的、社区驱动的。而LLVM项目也是开源的,现在主要是Apple在投资运行。因此,既然在macOS上,我就主要用的是LLVM系的工具。

可以在哪看到这系列文章

我在我的GitHub上,知乎专栏上和CSDN上同步更新。

上一篇文章:macOS上的汇编入门(四)——操作系统基础

下一篇文章:macOS上的汇编入门(六)——汇编语言初识

macOS上的汇编入门(五)——第一个汇编程序相关推荐

  1. macOS上的汇编入门(四)——操作系统基础

    当我们学习汇编的时候,除了数学基础以及硬件基础以外,操作系统的基础也是一个至关重要的环节.汇编语言本质上就是机器码的human-readable的版本,而硬件相同,则同一个程序的机器码一定相同.那么我 ...

  2. 使用了未赋值的局部变量_macOS上的汇编入门(七)——字面量与局部变量

    在上一篇文章中,我们分析了第一个汇编程序. # exit.s .section __TEXT,__text.globl _main _main:movq $0, %raxretq 这个汇编程序是我们所 ...

  3. 汇编 编程实现从键盘输入三位以内的十进制负数_macOS上的汇编入门(二)——数学基础...

    在正式介绍汇编语言之前,我会先用几篇文章讲一些数学基础和硬件基础.如果读者已经具备了一定的知识基础,可以直接跳过这些文章去汇编语言部分. 二进制,八进制与十六进制 在计算机底层的软件层面,我们通常采用 ...

  4. 编写你的第一个汇编程序

    文章目录 前言 第一个汇编程序 新建工程 配置芯片 编辑汇编程序 完成程序烧录 LED闪烁 总结 前言 本篇文章能帮助一个汇编的新手小白编写第一个汇编程序,本篇文章一步一步教你完成第一个汇编程序,并给 ...

  5. macos自带java_在 MacOS 上安装 Java - Java 入门教程

    本小节我们将介绍如何在 MacOS 平台安装 Java . 如果你想在其他平台安装 Java,请查看对应平台的安装教程: 1. 下载安装包 我们首先打开 Oracle 官网的 JDK 下载地址,找到 ...

  6. 在Mac上写汇编!(一)helloworld nasm on macos

    参考和感谢: https://blog.csdn.net/s793223706/article/details/82469971 教你在Mac上写汇编 https://stackoverflow.co ...

  7. macos上的ios虚拟机_如何将中级帖子转换为可在iOS和macOS上运行的SwiftUI应用

    macos上的ios虚拟机 I recently turned one of my posts into a SwiftUI app, and the process is very easy. My ...

  8. [ R ] 如何在iPadOS、iOS和MacOS上优雅的跑R —— 使用腾讯云搭建RStudio server的懒人包

    引言 如何在iPadOS/iOS/MacOS等多个平台优雅的连贯的高效的跑R?这是一个有关于使用腾讯云搭建RStudio Server的懒人包 Outline: What: 什么是RStudio Se ...

  9. macos 全局快捷键 打开 iterm_在 macOS 上实用的十大软件!你get了吗?

    在 macOS 里面有什么实用的软件?在这里分享一下我在我的 MacBook Pro上日常使用特别多的软件. MacBook型号:MacBook Pro 2018 款 15 英寸 系统版本:macOS ...

最新文章

  1. android从放弃到精通 第一天 重拾项目开发
  2. Android之使用HTTP协议的Get/Post方式向服务器提交数据
  3. ANDROID开发之SQLite详解
  4. java 画图保存图片_将绘图保存到图像文件,而不是使用Matplotlib显示它
  5. 安装alien,DEB与RPM互换
  6. 056、macvlan网络结构分析(2019-03-25 周一)
  7. python各种数据类型的常用方法_Python之数据类型的常用方法
  8. HyperLogLog 算法原理及其在 Redis 中的实现
  9. mysql 创建聚集索引_索引为什么会加快Mysql的查询速度?
  10. 模板题——质数、素数、约数
  11. 常见积分求导公式表--便于记忆
  12. 【综述】矩阵补全问题
  13. 纪录片推荐-造梦者:马云和他永远的“少年阿里”
  14. 包姓女孩清秀文雅的名字
  15. LintCode 两个数组的交集
  16. HTML网页图片使用技巧集锦
  17. 战疫之下的“大数据+网格化”管理,谁在颠覆“智能城市”的路径?
  18. [LabVIEW应用]Labview如何将PC机和仪器设备连接到一起
  19. 北美CS求学找工指南
  20. Excel2007中固定表头或列

热门文章

  1. 图解通信原理与案例分析-29:埃隆.马斯克的“星链”Starlink计划是卫星语音通信向卫星互联网的演进
  2. 百度地图商家标注,查询附近3000米内的商家并标到地图上
  3. 某鱼的兼职并不是那么好做,要钱也不是漫天要价
  4. 使用函数计算分段函数的值
  5. js实现操作成功之后自动跳转页面
  6. 2022年「博客之星」参赛博主:顽石九变
  7. visio设置页元素组
  8. 【已解决】VS code源代码控制器显示5k+的修改文件
  9. android图片模糊效果,Android下实现高效的模糊效果
  10. ppt怎么把图片做成翻书效果_如何用PPT实现翻书效果?