首页
学习
活动
专区
圈层
工具
发布

理解Y86
EN

Stack Overflow用户
提问于 2016-10-28 18:26:25
回答 2查看 4.4K关注 0票数 0

我有下面的代码。有人能解释一下我在括号里的问题吗?

代码语言:javascript
复制
# Execution begins at address 0 (why?)
.pos 0
irmovq stack, %rsp  # Set up stack pointer  (how can i move the word "stack" in rsp)
call main   # Execute main program
halt    # Terminate program  

# Sample linked list   (what is the purpose of .align 8?)
.align 8
ele1:
.quad 0x00a
.quad ele2
ele2:
.quad 0x0b0
.quad ele3
ele3:
.quad 0xc00
.quad 0

main:
irmovq ele1,%rdi
call sum
ret


sum:


# Stack starts here and grows to lower addresses
.pos 0x100
stack:
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-28 18:56:09

.pos <adr>是用于为编译器更改当前虚拟地址的指令。因此,编译的下一条指令将被视为at address <adr>,如果将<label>置于其前面,则<label>将具有值<adr>,因此以后在以<label>的绝对地址操作的代码中的任何指令都将使用<adr>值进行编译。

此外,编译器在编译过程中跟踪当前的虚拟地址,因此如果您在编译过程中使用了一些<label2>少量指令,那么它将具有<adr + size_of_produced_machine_code_so_far>值。

然后,当您在实际内存中的那个位置加载机器代码时,代码中的所有绝对地址都将适合并正确工作(如果您将它加载到其他地方,它将不能正常工作,因为指令仍将引用编译它们的<adr> )。

在您的示例中,这意味着一旦将计算机代码加载到内存计算机中,第一个irmovq将被放置在address 0上。

为什么执行从地址0开始?谁知道呢,这就是目标平台的特点。如果目标平台将从0x300开始执行,则使用.pos 0x300指令将启动代码放在那里是有意义的。

irmovq stack, %rsp # Set up stack pointer (how can i move the word "stack" in rsp)

rsp被设置为包含stack符号的地址(实际上它是“堆栈”符号的值,在人类逻辑中可以看作是内存地址,但它只是数字,作为计算机中的一切),它是0x100值(因为在stack:标签定义之前有.pos指令)。这样指令就可以实现rsp = 0x100

.align 8的目的是什么?

对齐是指调整地址,可以用一定的数字除以而没有余数。在第一种情况下,标签ele1的地址可以被8整除。如果以前的机器代码以不可分地址结尾,编译器将添加一些字节(通常是nop-like指令)来填补空白,直到下一个可能满足align要求的地址为止。

对齐对于内存控制器的性能是很重要的,因为它们通常在内部处理字节组,就像能够从8对齐的地址获取作为8字节的四字。如果您要求它从非对齐地址获取四字,它将从(address & -8)((address & -8)+8)中获取两个8字节集,并从获取的16字节中间读取最后的8字节结果。(在x86上)。在其他平台上,非对齐内存访问甚至可能是无效操作,导致CPU接收陷阱信号,在这种情况下运行崩溃处理程序)。

(为什么按位和带-8使地址8对齐?-8 = 0xF..F8 =0b11.11000 =>最后3位设置为零=>可被强制8除)

票数 2
EN

Stack Overflow用户

发布于 2016-10-28 18:38:01

执行从0开始,因为这是.pos 0在下一行所做的。

单词“堆栈”不会移动:stack --它是代码中向下的一个标签,它将堆栈指针rsp设置为内存中的那个位置。

对齐到8字节边界的目的是因为处理器没有善意地桥接这样的边界。.quad指令生成8字节数据.

这是不话题,要求教程-这是非常容易的谷歌,并与一个你觉得适合你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40311107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档