Системски софтвер/ЛабП 2020

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
Овај рок није решен. Помозите SI Wiki тако што ћете га решити.

Поправна лаб вежба, јун 2020. године са РТИ смера - Лаб вежба на РТИ смеру некада је обухватала само задатак са превођењем асемблерског кода у Ц код.

1. задатак

Поставка

За дати код у асемблеру дати како би могао изгледати Ц код чијим је превођењен добијен.

.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

Решење

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;' ?
}


Објашњење:

.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