Объявление массивов переменного размера в сборке - PullRequest
2 голосов
/ 14 декабря 2011

Я пишу программу на ассемблере, которую я хочу сделать (основной) следующим образом:

x = 100;
y = int[x]

например. размер у зависит от значения х.

ПРИМЕЧАНИЕ. Я использую набор команд NASM в 64-битной системе Ubuntu.

В сборке я знаю, что размер массива должен быть объявлен в разделе данных файла, например.

myvariable resq 1000

Проблема в том, что я не буду знать, насколько он велик, пока я не выполнил предыдущий расчет. Что я действительно хочу, это что-то вроде:

mov rax, 100
myvariable resq rax

Но это не разрешено, верно? Просто путаюсь с доступом к массиву / объявлениями в сборке.

Любые указатели оценены!

1 Ответ

1 голос
/ 14 декабря 2011

Ваш пример C возможен, только если вы объявляете массив в стеке или извлекаете память из кучи с помощью malloc или подобного. Для небольших значений вполне нормально (и быстрее) использовать стек:

mov rax, 100   # 100 elemtents
shl rax, 3     # muliply with 8, the size of an element
sub rsp, rax   # rsp points now to your array

# do something with the array
mov rbx, [rsp]    # load array[0] to rbx
mov [rsp+8], rbx  # store to array[1]

add rsp, rax   # rsp point to the return address again
...