Sistemski softver/LabP 2020

Izvor: SI Wiki
Pređi na navigaciju Pređi na pretragu
Ovaj rok nije rešen. Pomozite SI Wiki tako što ćete ga rešiti.

Popravna lab vežba, jun 2020. godine sa RTI smera - Lab vežba na RTI smeru nekada je obuhvatala samo zadatak sa prevođenjem asemblerskog koda u C kod.

1. zadatak

Postavka

Za dati kod u asembleru dati kako bi mogao izgledati C kod čijim je prevođenjen dobijen.

.intel_syntax noprefix
.text
.global foo
.type foo, @function
foo:
    push rbp
    mov rbp, rsp
    mov QWORD PTR -24[rbp], rdi
    mov QWORD PTR -32[rbp], rsi
    mov DWORD PTR -36[rbp], edx
    mov rax, QWORD PTR -32[rbp]
    mov rdx, QWORD PTR [rax]
    mov rax, QWORD PTR -24[rbp]
    add rax, rdx
    mov QWORD PTR -8[rbp], rax
    mov rax, QWORD PTR -32[rbp]
    mov edx, DWORD PTR 8[rax]
    mov eax, DWORD PTR -36[rbp]
    add eax, edx
    mov DWORD PTR -12[rbp], eax
    mov eax, DWORD PTR -12[rbp]
    movsx rdx, eax
    mov rax, QWORD PTR -8[rbp]
    add rax, rdx
    pop rbp
    ret

Rešenje

typedef struct
{
    long a;
    int b
} A;

long foo(long a, A *b, int c)
{
    // long l1 = a; A *l2 = b; int l3 = c; // use these instead of params?
    long d = a + b->a;
    int e = c + b->b;
    return d + e;
    // or just 'return a + b->a + c + b->b;' ?
}


Objašnjenje:

.intel_syntax noprefix
.text
.global foo
.type foo, @function
foo:
    push rbp
    mov rbp, rsp # no need for repeated 'sub rsp, 0x10' because of the red zone (no nested function calls)
    mov QWORD PTR -24[rbp], rdi # long a = rdi; (param1)
    mov QWORD PTR -32[rbp], rsi # struct *b = rsi; (struct: long a, int b) (param2)
    mov DWORD PTR -36[rbp], edx # int c = edx; (param3)
    mov rax, QWORD PTR -32[rbp] # rax = b;
    mov rdx, QWORD PTR [rax] # rdx = b->a;
    mov rax, QWORD PTR -24[rbp] # rax = a;
    add rax, rdx # rax = a + b->a;
    mov QWORD PTR -8[rbp], rax # long d = a + b->a;
    mov rax, QWORD PTR -32[rbp] # rax = b;
    mov edx, DWORD PTR 8[rax] # edx = b->b;
    mov eax, DWORD PTR -36[rbp] # eax = c;
    add eax, edx # eax = c + b->b;
    mov DWORD PTR -12[rbp], eax # int e = c + b->b;
    mov eax, DWORD PTR -12[rbp] # eax = e;
    movsx rdx, eax # rdx = (long) e;
    mov rax, QWORD PTR -8[rbp] # rax = d;
    add rax, rdx # rax = d + e; (return value)
    pop rbp # no need for 'mov rsp, rbp' before this line (nor 'leave' instead) as rsp hasn't changed
    ret