Преобразование Char Array из C в SPARC

44
2

Рассмотрим приведенные ниже операторы исходного кода.

   struct person  
{
char name[30];
int id;
int points;
};

char Fmt[] = "Name: %s ID: %d Points: %d\n";
void display_one( struct person List[], int I )
{
printf( Fmt, List[I].name, List[I].id, List[I].points );
}

Выполните сегмент кода языка ассемблера SPARC ниже, чтобы последовательность операторов языка ассемблера была эквивалентна приведенным выше операторам C.

      .section ".data"
.align 4
Fmt: .asciz "Name: %s ID: %d Points: %d\n"
.global display_one
.section ".text"
.align 4

display_one:
save %sp, -96, %sp
smul %i1, 40, %l1
add %i0, %l1, %l0
set Fmt, %o0
mov %l0, %o1
ld [%l0+32], %o2
ld [%l0+36], %o3
call printf
nop
ret
restore

Мне было интересно, что делает линия smul% i1, 40,% l1. Я не понимаю, почему он умножается на 40. Если кто-нибудь может объяснить, что это было бы здорово. Благодарю.

спросил(а) 2012-11-14T09:11:00+04:00 7 лет назад
1
Решение
45

40 - размер лица struct person:

char name[30];   // 30 bytes
// 2 bytes padding to make the following int aligned
int id; // 4 bytes
int points; // 4 bytes

Параметр I умножается на 40 для вычисления адреса List[I].

ответил(а) 2012-11-14T09:33:00+04:00 7 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема