gpt4 book ai didi

assembly - 我可以通过保存和修改指令指针来执行相当于跳转到标签的操作吗?

转载 作者:行者123 更新时间:2023-12-03 22:22:23 25 4
gpt4 key购买 nike

首先:这绝对没有实际原因。它似乎应该工作,但事实并非如此。我的策略是使用call%eippopq 放入%rax。所以现在 %eip(理论上)存储在 %rax 中。然后,当我想循环回到代码的那个位置时,我 调用 %rax。但这不会发生。不是循环返回,而是继续执行到下一行!我的完整代码在这里:

.section .data
.section .text
.globl _start
_start:
movl $10, %edi # number of fibnum we hunt
movl $0, %ebx # 1st fibnum
movl $1, %esi

call _saveIP
_saveIP:
popq %rax

## Check if %edi is 0
## (thus meaning %ebx is nth fibnum)
## and if so, exit loop
decl %edi
cmpl $0, %edi
je loop_exit

## core Fibonnaci algorithm
## (hold %esi in tmp register %edx,
## esi = esi + ebx,
## ebx = edx)
movl %esi, %edx
addl %ebx, %esi
movl %edx, %ebx

## This should jump up us back up, but doesn't!
jmpq *(%rax)

## Once loop completes...
loop_exit:
movl $1, %eax
int $0x80

我读过有关 jmp 使用间接而非直接跳跃的内容。这听起来很相关,但我不确定它的真正含义,而且我对 jmp/call 的研究都表明它们只是转到您提供的内存中的地址。我应该做些什么不同的事情来完成这项工作?谢谢!

最佳答案

您可以使用 lea 指令获取给定位置的指令指针的值:

    lea .(%rip), %rax

符号.指向当前位置,.(%rip)使用rip相对寻址方式指向.。同样的方法也可以用来获取任何其他标签的地址。

另一种编码稍短的方法是使用 call 后跟 pop。看起来像这样:

    call 0f
0: pop %rax

请注意,根据设计,这只能用于获取紧跟在 call 指令之后的指令的地址。 call 的这种使用在所有现代处理器的返回预测器中都是特殊情况(Via 除外,但它们并不完全是现代的)并且不会导致性能问题,即使 call 没有与相应的 ret 配对。

关于assembly - 我可以通过保存和修改指令指针来执行相当于跳转到标签的操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53601766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com