在上一篇文章中,我们讨论了汇编语言中如何定义字面量与局部变量。在这篇文章中,我们将继续讨论,如何在汇编语言中定义C语言中的全局变量。在讨论全局变量之前,我们首先需要介绍一下寻址方式。
寻址方式
所谓寻址方式,就是已知地址如何获得该地址对应的内存单元内的值。在上一篇文章中,我们实质已经用到了寻址方式。比如说,已知栈顶的地址存储在rsp内,那么我们是通过(%rsp)获得对应位置的内存单元的值的。一般来说,我们寻址方式需要记得下图:

这个记号代表地址为基址+指标*倍数+偏移量处的内存单元中存储的值。
其中,以$开头的都是数字(但注意我们真正写的时候不需要加上$符号),以%开头的都是寄存器。也就是说,在偏移量、倍数的位置上,不能写寄存器,在基址、指标的位置上,不能写数字。此外,倍数只能是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架构下是不支

最低0.47元/天 解锁文章
5

被折叠的 条评论
为什么被折叠?



