Sistemski softver/K1 Avgust 2020
Pređi na navigaciju
Pređi na pretragu
Postavka
Napisati ekvivalentan program na C programskom jeziku za dati izvorni asemblerski kod. Izvorni asemblerski kod je napisan u skladu sa 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
Rešenje
typedef union {
long nizLong[7];
int nizInt[14];
} StackUnion;
long* 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;
}