2013-04-15 6 views
0

Я пытаюсь преобразовать код C в код сборки Y86.Как вы выделяете пространство для нескольких массивов в сборке Y86?

Что произойдет, если у вас есть несколько объявлений массива, такие как:

int a[100], b[100]; 

Пусть каждое целое 4 байта. Откуда вы знаете, где в памяти указывать для pos. директивы, чтобы вы не теряли пространства?

<Assembly code begins here> 

... 

halt 

# Array initialization begins here 
.pos ? 
A: 
.long 0 

.pos ? 
B: 
.long 0 
+0

Вы используете стек. Нефиксированные ячейки памяти. Все это простая арифметика –

+0

Хм, хорошо, это означает, что мне просто нужно будет отслеживать позиции памяти начала каждого массива? Например, я знал, что начальные позиции для моих двух массивов были в 0 и 400, я должен был бы рассматривать все как смещение из указателя стека? – CowZow

+0

Также: предположим, что у меня было 10 массивов. Должен ли я отслеживать начальную позицию памяти каждого массива как перемещение из указателя стека? Или есть лучший способ сделать это? Потому что не станет ли он запутываться со всем жестким кодированием значений смещения? – CowZow

ответ

1

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

struc Locals 
    a dd ? dup 100 
    b dd ? dup 100 
ends Locals 

sub esp, sizeof Locals ;; or perhaps sizeof struc Locals 
mov ebp, esp   ;; take a copy of stack ptr 

mov eax, [ebp + offset a] ;; 
mov ebx, [ebp + offset b] ;; 

В ССАГПЗ значение «структуры» должен изменить абсолютное положение текущего сегмента без введения связываемый код:

.file "temp.c" 
    .struct 0 
a: .struct a + 4*100 
b: .struct b + 4*100 
c:    ;; c will contain expression for the size 
    .struct 0 ;; you can start a new struct here 
a2: .struct a2 + 4 ;; this struct would be 'int a2;' 
b2: .struct b2 + 8 ;; 'double b2' 
c2:     ;; sizeof struct #2 

.text 
    sub c, %rsp 
    mov $13, a(%rsp) ;; a[0] = 13 
    mov $2, b(%rsp) ;; b[0] = 2 
+0

'gcc'? Или «газ»? –

+0

Обе работают для меня –