Могу ли я сделать эквивалент jmping метке, сохранив и изменив указатель инструкций? - PullRequest
0 голосов
/ 03 декабря 2018

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

1 Ответ

0 голосов
/ 04 декабря 2018

Вы можете получить значение указателя инструкций в данном месте, используя команду lea:

    lea .(%rip), %rax

Символ . относится к текущему местоположению, .(%rip) использует rip -относительный режим адресации для обозначения ..Тот же метод можно использовать и для получения адреса любой другой метки.

Другой способ с немного более коротким кодированием - использовать call, за которым следует pop.Выглядит так:

    call 0f
0:  pop %rax

Обратите внимание, что по замыслу это можно использовать только для получения адреса инструкции, следующей сразу за инструкцией call.Такое использование call специально предусмотрено во всех современных предикторах возврата процессора (кроме Via, но они не совсем современные) и не вызывает проблем с производительностью, даже если call не связан с соответствующим ret.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...