Для начала: для этого нет абсолютно никакой практической причины.Кажется, что это должно работать, но это не так.Моя стратегия состоит в том, чтобы использовать call
, чтобы получить %eip
и popq
в %rax
.Так что теперь %eip
(в теории) хранится в %rax
.Затем, когда я хочу вернуться к этому месту в моем коде, я call %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
все говорят, что они просто идут по адресу в памяти, который вы им предоставляете.Что я должен делать по-другому, чтобы сделать эту работу?Спасибо!