Преобразование Char Array из C в SPARC
Рассмотрим приведенные ниже операторы исходного кода.
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. Если кто-нибудь может объяснить, что это было бы здорово. Благодарю.
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]
.