Использование памяти, возвращаемой вызовом malloc в NASM - PullRequest
5 голосов
/ 05 апреля 2011

Я использую компилятор nasm для компиляции моего кода в объектный файл, а затем вызываю компоновщик gcc, чтобы связать этот объектный файл для создания окончательного исполняемого файла. Это означает, что у меня есть доступ к библиотекам времени выполнения C.

Мне нужно сделать динамическое распределение памяти, поэтому я выполняю вызов malloc следующим образом

push 20 ;push amount of bytes malloc should allocate    
call _malloc ;call malloc
add esp,4 ;undo push

Адрес выделенной памяти возвращается в регистре eax, но как мне использовать адрес для инициализации этой позиции значениями?

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

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011
push 20                ; push amount of bytes malloc should allocate    
call _malloc           ; call malloc
test eax, eax          ; check if the malloc failed
jz   fail_exit         ; 
add esp,4              ; undo push
mov [eax], dword 0xD41 ; 'A\n'

В любом случае, я предлагаю вам взглянуть на этот урок , в нем есть довольно интересные вещи:

Эта программа печатает «Hello World», выделяет часть памяти, используя malloc, использует эту память для записи 10 букв алфавита на экране (используя printf), освобождает память и возвращает.

3 голосов
/ 05 апреля 2011

После выделения памяти с помощью malloc значение eax - это просто указатель, который вы можете использовать. Например, чтобы записать значения в первые два 32-битных int s, вы можете сделать:

mov dword ptr [eax], 0
mov dword ptr [eax + 4], 1
...