Код находится в сборке x86 / 64. Я хочу передать два значения в качестве параметров подпрограмме, но у меня есть сомнение: параметры, которые идут перед вызовом подпрограммы, это те, которые хранятся в стеке, а затем присваивают им значение с помощью mov no (это, как я видел, они находятся в других примеры) В приведенном ниже коде rdi является параметром подпрограммы CalculatePos, и функция намеревается выполнить некоторые вычисления (деление, сложение, модуль и сумма) и передать эти результаты в качестве параметров другой подпрограмме. Теперь что-то ускользает от меня, потому что мне не нравятся параметры этой функции. Я не знаю, от чего это зависит, чтобы параметры хорошо передавались в подпрограмму, я думал, что с сохранением значений, которые вы хотите передать в стек, и непосредственно перед вызовом, чтобы сделать шаг для присвоения им значения, этого было достаточно, но я не понимал, почему это не работает для меня , Моя логика не должна быть правильной, потому что если вы хотите использовать другие регистры для других вещей в подпрограмме и не хотите передавать их в качестве параметра подпрограмме, это было бы невозможно, поскольку, если они хранятся в стеке и им присвоено какое-то значение, они уже будут параметрами к функции. Где предел, когда он является параметром для подпрограммы, которая находится внутри другой, и когда она является частью подпрограммы, которая его содержит, то есть что должно случиться, чтобы быть параметром, а что должно произойти, чтобы этого не произошло? Может ли кто-нибудь помочь мне лучше понять эти концепции передачи параметров и сказать, как я должен поместить код, чтобы делать то, что я хочу и работать? Заранее большое спасибо, привет.
CalculatePos:
push rbp
mov rbp, rsp
push rdx
push rax
push rdi
mov rdx, 0
mov rax, rdi
mov rdi, 18
div rdi
add rax, 12
add rdx, 11
call animarXY
pop rdi
pop rax
pop rdx
mov rsp, rbp
pop rbp
ret
operaciГіn push
копирует стоимость в такую каковую батарейку. Он не имеет больше. Он не соединяет, и не создают ни ссылки, ни совсем не mГЎgico . Реализуй копию, из-за которого оба элемента (оригинал и скопированный) полностью независимые. Изменения в одном не затрагивают ни для чего другого.
Следовательно, если ты делаешь один push
и потом изменяешь стоимость, вышеупомянутые изменения не перемещаются в батарейку .
Просто, реализуй твои операции раньше делания push
:
mov rdx, 0
mov rax, rdi
mov rdi, 18
div rdi
add rax, 12
add rdx, 11
push rdx
push rax
push rdi
call animarXY
push
для помещать вещей иpop
для доставать . Порядка, в котором ты делаешь операции, важно : это LIFO. Ты можешь использовать conveció n шага pará метры , которые ты хотел бы, даже смесь реестров и батарейки. – Juanjo 30.11.2019, 12:24