没有合适的资源?快使用搜索试试~ 我知道了~
MacOS汇编语言基础(第一版)
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 2 浏览量
2023-07-19
21:15:43
上传
评论
收藏 1.35MB PDF 举报
温馨提示
试读
60页
介绍MacOS汇编语言的基础使用,帮助大家了解链接装载以及汇编语言和C的映射关系。
资源推荐
资源详情
资源评论
目录
MacOS汇编语言基础 1
macOS上的汇编入门(一)——引言 2
macOS上的汇编入门(二)——数学基础 3
macOS上的汇编入门(三)——硬件基础 5
macOS上的汇编入门(四)——操作系统基础 8
macOS上的汇编入门(五)——第一个汇编程序 16
macOS上的汇编入门(六)——汇编语言初识 18
macOS上的汇编入门(七)——字面量与局部变量 22
macOS上的汇编入门(八)——寻址方式与全局变量 30
macOS上的汇编入门(九)——跳转与函数 35
macOS上的汇编入门(十)——再探函数 42
macOS上的汇编入门(十一)——系统调用 47
macOS上的汇编入门(十二)——调试 50
macOS上的汇编入门(十三)——从编译到执行 54
macOS上的汇编入门(一)——引言
我最近一个阶段都在学习汇编语言,但是,当我想使用我的Mac编写汇编语言的时候,发现了许多
问题。比如说,大多数实体的教材都采用的是32位甚至是16位的处理器,在如今仅支持64位架构
的macOS 10.15上根本不能原生运行;再者,基于XNU这种类Unix内核的macOS系统,汇编语言的部
分细节,如系统调用号等等与Linux不同,调用约定也与Windows不同。但现在网络上基于macOS来
入门汇编语言的文章非常少,涉及到macOS汇编的也基本上不是用来入门的文章。因此,我打算利
用这个暑假来写一写如何在macOS上入门汇编语言。
需要的背景知识
阅读我写的这一系列文章需要的背景知识并不多,包括:
能看懂C语言
一点点的计组知识
一点点的命令行知识(至少应当会在终端下进入指定的目录)
这系列文章究竟讲了什么
那么,我打算讲的是在macOS上利用GAS语法,也就是AT&T语法进行x86-64汇编的入门。
macOS上的汇编入门(一)——引言
第 1 页 /共
58 页
macOS上的汇编入门(二)——数学基础
在正式介绍汇编语言之前,我会先用几篇文章讲一些数学基础和硬件基础。如果读者已经具备了
一定的知识基础,可以直接跳过这些文章去汇编语言部分。
二进制,八进制与十六进制
在计算机底层的软件层面,我们通常采用二进制,八进制或十六进制来记录数字,其中最常用的
是十六进制。所谓 进制,就是从0开始数,逢 进1. 比如说二进制,就是从0开始数,到
1,然后到2的时候进1变成10. 八进制也是类似,但是到了十六进制就犯了难,我们的数字只有0
到9这十个,并不能表示出16个呀,于是,我们默认使用了a到f这六个字母来分别表示10到15这六
个数。也就是说,十进制数10对应的十六进制数是a, 十进制数26对应的十六进制数是1a. 在计算
机底层,通常用 0x 开头表示十六进制,用 0 开头表示八进制,而没有前缀来表示十进制。因
此,比如说以下的汇编代码(并不需要理解实际含义)
movq $0x1a, %rax
与
movq $26, %rax
相同。
十进制数与十六进制数的转化可以在搜索引擎上找到,这里不再赘述。而八进制,十六进制数与
二进制数的转换则十分简单。一个八进制数的一位代表一个二进制数的三位,比如说八进制数的
一位 5 就代表二进制数的三位 011 ; 同理,一个十六进制数的一位就代表二进制数的四位。因
此,十六进制数 0x2000001 就代表二进制数 0010000000000000000000000001 .
我们知道,之所以使用二进制数,是因为计算机底层采用高电平/低电平这种方法来表示数。那
么,我们为什么要使用八进制、十六进制呢?我们知道,如今的计算机大多采用64位系统,意思
是说,任何一个地址都是一个64位二进制数。那么,如果我们只采用二进制来表示一个地址,那
么得有64个 0 或者 1 , 这不仅让我们看花眼了,而且也极大的浪费了电脑的显示资源。而刚才
讲到的十六进制数则帮我们解决了这个问题。我们知道,十六进制数的一位对应二进制数的4位。
因此,一个 位二进制数,只需要 位十六进制数即可。也就是说,我们要表示64位
的地址,只需要16位十六进制数即可。
补码
进制问题解决了在计算机底层软件中数的表示问题,接下来还需要解决的是记录问题,也就是
说,如何把数实际存储在64位寄存器中。我们想要解决两个问题:
如何记录负数
可以使用加法器计算减法么
天才般的先行者,使用了补码来一举解决了这两个问题。
想要解决第二个问题,一个想法自然出现了,既然 , 那可以
在加法器中输入一个正数和一个负数来实现减法呀。
n n n n
n n n4 n 4
ab=a+(b) a b = a + ( b )
macOS上的汇编入门(二)——数学基础
第 2 页 /共
58 页
然而,我们知道,在计算机中,一个存储单位存储的数据大小是有上限的。比如说在64位CPU中,
每个寄存器有64位,因此可以存储64位二进制数。因此,在CPU的加法器中,实际上使用了模
加法。也就是说,加法器做的,就是对于输入的两个64位二进制数 和 , 输出64位2 64
二进制数 .
因此,我们只有找到合适的将负数记录成64位二进制数的方法,才能将加法器转化为减法器。
注意到
而由于 是64位二进制数,因此, 必然是一个正数,而正数的记录方法我们是
知道的。因此,我们可以使用 来记录 , 其参与的减法就可以变成相应的加
法。
但是,还有一个细节需要注意。比如说,我们想要记录的二进制数是 0xfffffffffffffffe , 那
么根据刚刚讨论的,我们可以将其记录为 0x1 . 这就出现了问题,如何区分 0x1 和
0xfffffffffffffffe 呢?我们采用这种方法只是为了方便减法,并不打算将正数和负数混同
啊。
因此,在实际操作中,当出现负数时,能够允许的负数的绝对值最大值是 . 换句话
说,其记录值最高位 0 表示正数, 1 表示负数。这种记录方法叫做 补码 。也就是说,对于小
于 的正数,采用其二进制表示为其实际记录;对于不低于 的负数,将其加
上 后的正数的二进制表示为其实际记录。如果采用补码,那么可以表示
的整数。因此,采用补码记录的数称为 63 2 63 1 有符号整数 。反之,如果直接使用其二
进制表示为其记录的话,那么只能表示 的整数。因此,这种数的记录形式称
为 无符号整数 。
逻辑运算
除了加减乘除以外,二进制数还有独特的运算——逻辑运算。分别是与(and), 或(or), 非(not)
和异或(xor). 与或非大家都很熟悉了,异或就是当且仅当两个操作数不同时输出 1 , 相同时输
出 0 .
2
64
2 64 a a b b
(a+b) mod 2
64
( a + b ) mod 2 64
ab≡a+(2
64
b)(mod2
64
) a b ≡ a + ( 2 64 b ) ( mod 2 64 )
b b 2
64
b 2 64 b
2
64
b 2 64 b b b
2
63
2 63
2
63
2 63 2
63
2 63
2
64
2 64 2
63
2
63
1 2
63 2 63 1
02
64
1 0 2 64 1
macOS上的汇编入门(二)——数学基础
第 3 页 /共
58 页
剩余59页未读,继续阅读
资源评论
北极象
- 粉丝: 1w+
- 资源: 345
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功