Системски софтвер/К1 Август 2020
Пређи на навигацију
Пређи на претрагу
Поставка
Написати еквивалентан програм на C програмском језику за дати изворни асемблерски код. Изворни асемблерски код је написан у складу са System V ABI.
.intel_syntax noprefix
.text
.globl foo
.type foo, @function
foo:
push rbp
mov rbp, rsp
push rbx
sub rsp, 88
mov QWORD PTR -88[rbp], rdi
mov DWORD PTR -92[rbp], esi
mov DWORD PTR -68[rbp], 0
jmp label_2
label_1:
mov eax, DWORD PTR -68[rbp]
cdqe
mov edx, DWORD PTR -92[rbp]
mov DWORD PTR -64[rbp+rax*4], edx
add DWORD PTR -68[rbp], 1
label_2:
cmp DWORD PTR -68[rbp], 9
jle label_1
mov rax, QWORD PTR -88[rbp]
mov rcx, QWORD PTR -64[rbp]
mov rbx, QWORD PTR -56[rbp]
mov QWORD PTR [rax], rcx
mov QWORD PTR 8[rax], rbx
mov rcx, QWORD PTR -48[rbp]
mov rbx, QWORD PTR -40[rbp]
mov QWORD PTR 16[rax], rcx
mov QWORD PTR 24[rax], rbx
mov rdx, QWORD PTR -32[rbp]
mov QWORD PTR 32[rax], rdx
mov rax, QWORD PTR -88[rbp]
add rsp, 99
pop rbx
pop rbp
ret
Решење
typedef union {
long nizLong[7];
int nizInt[14];
} StackUnion;
int foo(long* arg1, int arg2) {
StackUnion unija;
int niz1[4];
niz1[3] = 0;
while (niz1[3] <= 9) {
unija.nizInt[niz1[3]] = arg2;
niz1[3] += 1;
}
arg1[0] = unija.nizLong[0];
arg1[1] = unija.nizLong[1];
arg1[2] = unija.nizLong[2];
arg1[3] = unija.nizLong[3];
arg1[4] = unija.nizLong[4];
return arg1;
}