Передача параметров в подпрограмму сборки

Код находится в сборке 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
1
задан 30.11.2019, 03:15
1 ответ

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
0
ответ дан 01.12.2019, 10:33
  • 1
    Я это понял в push, но если у меня есть подпрограмма, которую называются CalcularPos, где está весь có я говорю с операциями и внутри этой я звоню в другую подпрограмму ' call animarXY' có mo я происхожу с ним как pará метры rax и rdx?. В có я говорю, что ты показал меня, оно я не функционирует, хотя, если он может быть помести мне всю подпрограмму как serí в, потому что, если ты помещаешь реестры внутри подпрограммы, ты должен помещать push pop, потому что а ты помещаешь их serí an стоимость, возвращенная подпрограммой и я он думал, что push poní в в начале подпрограммы despué s " mov rbp, rsp". – davidca 30.11.2019, 12:11
  • 2
    параметров в сборщике не существуют . CPU действует с реестрами. Реестры могут загружать данными leí два в ячейках запоминающего устройства. Которое tú пламя я происхожу pará метры - простая одна convenció n , чтобы показывать где buscará có я говорю необходимые данные. Ты можешь происходить pará метры, не используя батарейки. И батарейка - помощь . Чтобы использовать ее, ты заставляешь push для помещать вещей и pop для доставать . Порядка, в котором ты делаешь операции, важно : это LIFO. Ты можешь использовать conveció n шага pará метры , которые ты хотел бы, даже смесь реестров и батарейки. – Juanjo 30.11.2019, 12:24
  • 3
    Есть множество руководителей в Интернете на этих концепциях; deberí схвати делать несколько доказательств до тех пор, пока ты не поймешь их. Внутри немного borraré мой ответ. – Juanjo 30.11.2019, 12:26
  • 4
    Уже оно я функционировало, видно, что шесть первых pará метры, которые проходят в реестрах, - RDI, RSI, RDX, RCX, R8, R9 и я использовал двух первых как pará метры и оно я функционировало. – davidca 30.11.2019, 13:10
  • 5
    Пожалуйста, сними получающую отметку из ответа. Así я не могу удалять ее. – Juanjo 30.11.2019, 14:05