Системски софтвер/К1 Септембар 2020

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Поставка

Написати еквивалентан програм на 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];
    }
}