Как я могу передать Определенный номер квадрата (8 БАЙТОВ) в качестве параметров подпрограмме в 32-битной сборке NASM - PullRequest
0 голосов
/ 24 ноября 2018

Я использую 32-разрядную сборку NASM, и мне было интересно, есть ли способ передать определенное число квадратов (8 байтов) в качестве параметра подпрограмме в 32-разрядной сборке Nasm.Я знаю, что стек в 32-битной сборке организован так, чтобы принимать определенные двойные слова (4 байта).Поэтому мне интересно, если это вообще возможно сделать.

Пример кода:

section .data 
x: dq 10 ;Defining x as a 8 byte number

section .bss 

section .text 
global asm_main

asm_main:
enter 0,0 ;Creating stack frame

push QWORD[x] ;pushing x as a parameter for the test subprogram
call test ;Calling the subprogram
add esp,8 ;Deallocating memory used by parameter 

leave
ret

Но при запуске кода появляется сообщение о том, что (push QWORD[x]):

инструкция не поддерживается в 32-разрядной версиирежим

1 Ответ

0 голосов
/ 24 ноября 2018

Один из способов - нажать каждое двойное слово отдельно

push dword [x+4]    ; high half first
push dword [x]      ; then low half

Или вы можете сделать 64-битное копирование через регистр XMM с movq load / store.x87 fild / fistp, вероятно, не стоит использовать, но movq - если SSE2 доступен.

Кстати, избегайте инструкции enter.Это очень медленно.Используйте push ebp / mov ebp,esp, как это делают компиляторы.(И для справки, вы могли бы ответить на свой вопрос, посмотрев на выход компилятора для функции, которая вызывает другую функцию, например void foo(int64_t *p) { bar(*p); }. https://godbolt.org/z/0rUx-M

...