Sistemski softver/K1 Avgust 2020

Izvor: SI Wiki
< Системски софтвер
Datum izmene: 3. april 2022. u 00:12; autor: KockaAdmiralac (razgovor | doprinosi) (Izmena povratnog tipa zasad)
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;
}