macOS上的汇编入门(八)——寻址方式与全局变量

在上一篇文章中,我们讨论了汇编语言中如何定义字面量与局部变量。在这篇文章中,我们将继续讨论,如何在汇编语言中定义C语言中的全局变量。在讨论全局变量之前,我们首先需要介绍一下寻址方式。

寻址方式

所谓寻址方式,就是已知地址如何获得该地址对应的内存单元内的值。在上一篇文章中,我们实质已经用到了寻址方式。比如说,已知栈顶的地址存储在rsp内,那么我们是通过(%rsp)获得对应位置的内存单元的值的。一般来说,我们寻址方式需要记得下图:

addressing

这个记号代表地址为基址+指标*倍数+偏移量处的内存单元中存储的

其中,以$开头的都是数字(但注意我们真正写的时候不需要加上$符号),以%开头的都是寄存器。也就是说,在偏移量、倍数的位置上,不能写寄存器,在基址、指标的位置上,不能写数字。此外,倍数只能是1, 2, 4, 8中的一个。

这四个位置都可以省略,省略的位置将用0代替。比如说,偏移量(基址)就相当于基址+偏移量, 偏移量(, 指标, 倍数)就相当于指标*倍数+偏移量.

这样设计寻址方式是由其原因的。偏移量和基址存在的原因,就是为了解决像我们之前那样通过rsp或者rbp加上偏移量来访问栈上元素的问题。而指标存在的原因,一是在于,我们不仅可以通过寄存器+数字的方式寻址,也希望通过寄存器+寄存器的方式寻址,也就是(基址, 指标, 1)这样的方式实现寄存器+寄存器寻址;此外,当我们在某些循环操作时,可以每次递减或递增指标,然后实现对一块连续内存的访问。而倍数存在的原因,则是由于存数的时候可能是占1个字节,也可能是2个,4个或8个字节。

在了解了寻址方式之后,相信大家就会很容易地理解我们之前通过-8(%rbp)这样的方式获得栈上元素了。我们可以通过如

movq	-8(%rbp), %rax

这样的方式,将内存上的值付给寄存器。但是,值得注意的是,

movq	-8(%rbp), -16(%rbp)	# wrong

这样的方式在x86-64架构下是不支

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值