Системски софтвер/К1 Септембар 2020
Пређи на навигацију
Пређи на претрагу
Поставка
Написати еквивалентан програм на C програмском језику за дати изворни асемблерски код. Изворни асемблерски код је написан у складу са System V ABI.
.intel_syntax noprefix
.text
.globl foo
.type foo, @function
foo:
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR -8[rbp], rdi
cmp QWORD PTR -8[rbp], 0
je label_1
mov rax, QWORD PTR -8[rbp]
sub rax, 1
push QWORD PTR 88[rbp]
push QWORD PTR 80[rbp]
push QWORD PTR 72[rbp]
push QWORD PTR 64[rbp]
push QWORD PTR 56[rbp]
push QWORD PTR 48[rbp]
push QWORD PTR 40[rbp]
push QWORD PTR 32[rbp]
push QWORD PTR 24[rbp]
push QWORD PTR 16[rbp]
mov rdi, rax
call foo
add rsp, 80
# imul reg64, mem64
# signed multiply
# reg64 ← truncate(reg64 * mem64)
imul rax, QWORD PTR -8[rbp]
jmp label_2
label_1:
mov rax, QWORD PTR 16[rbp]
label_2:
leave
ret
Решење
typedef struct {
long arr[10];
} InputStruct;
long foo(InputStruct s, long rdi) {
if (rdi != 0) {
return foo(s, rdi-1) * rdi;
} else {
return s.arr[0];
}
}