Системски софтвер/К1 Август 2020

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

Поставка

Написати еквивалентан програм на 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 struct {
  int arr[10];
} StructType;

StructType foo(int esi) {
  StructType temp_struct;
  for(int i = 0; i <= 9; ++i) {
    temp_struct.arr[i] = esi;
  }
  return temp_struct;
}