Выделение памяти для структуры в SPARC Assembly

Я пытаюсь понять, как выделить память для структуры в сборке SPARC.

Вот C-версия моего кода, который я использую (который отлично работает и компилируется):

#include <stdio.h>
#include <stdlib.h>
#include "test.h"

int main(int argc, char *argv[])
{
    struct tester test;
    ....other code inbetween

    testfn(&test);
    testfn2(&test);
}

Теперь в сборке я полагаю, что мне нужно вызвать такую ​​​​функцию...

mov struct tester, %o0    ! Move struct tester into %o0

call sizeof               ! Get size of struct tester
nop

set %o0, %l1              ! Store size
nop

mov 1, %o0                ! Prepare for calloc call
mov %l1, %o1              ! Prepare for calloc call

call calloc, 2
nop

mov %o0, %l2              ! The pointer returned to the allocated space

mov %l2, %o0

call testfn
nop

mov %l2, %o0

call testfn2
nop

Основная часть, на которой я сейчас застрял, — это как передать этот начальный тест тестера структуры в сборку. Я определяю это где-то или как это работает?

И на всякий случай мой тестер структуры выглядит примерно так...

#define SIZE 100

struct tester2 {
   char abcd[SIZE];
   char efgh[SIZE];
};

struct tester {
   struct tester2 *somePTR;
   int             an_Int;
};

person Community    schedule 17.05.2011    source источник
comment
sizeof это не функция, это оператор времени компиляции   -  person Paul R    schedule 18.05.2011
comment
Значит ли это, что мне нужно более или менее рассчитывать размер моей структуры вручную? Я полагаю, что тогда размер будет... 4 для an_Int, 4 для somePTR, 200 для struct tester2 Верно? Редактировать Я солгал, сделал printf на c и вернул 8 :) Думаю, мне нужно немного больше прочитать о том, как распределяется пространство :)   -  person    schedule 18.05.2011
comment
Это зависит от того, какой ассемблер вы используете - может быть какой-то способ синхронизировать ассемблерную версию структуры с версией C - в противном случае да, вам нужно будет позаботиться об этом вручную. Обратите внимание, что вам не нужно вызывать calloc — вы можете просто выделить структуру статически.   -  person Paul R    schedule 18.05.2011


Ответы (1)


Непонятно, что вы хотите сделать. В коде C это выглядит так, как будто вы выделяете место для структуры в стеке.

struct tester test;

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

mov 1, %o0                ! Prepare for calloc call
mov %l1, %o1              ! Prepare for calloc call

call calloc, 2

Итак, решите, что вы хотите сделать, и либо 1) выделите память для локальной переменной в стеке, используя инструкцию сохранения для уменьшения %sp, либо 2) просто вызовите calloc().

person torgny    schedule 17.05.2011
comment
Эй, Торгни, спасибо за ответ, я хотел добавить свой собственный ответ, потому что понял это, но у меня есть ограничение в 8 часов, вот мой ответ, который я опубликовал. Если бы вы могли сказать мне, правильно ли я думаю, я был бы признателен за это :) Я вызываю функцию C, чтобы поместить материал в структуру, мне не нужно беспокоиться о том, как это обработать, мне просто нужно выделите достаточно места в стеке, чтобы все поместилось, когда оно вызывается другими функциями C. Кроме того, мой вопрос мог сбить с толку тем, что testfn и testfn2 были другими модулями C, которые я написал. Извините, если это было неясно. - person ; 18.05.2011
comment
Ну, чтобы выделить место только для одной структуры тестера, вы должны сохранить %sp, -104, %sp в начале вашей функции, и у вас будет ваша структура в %fp-8. - person torgny; 18.05.2011