Системски софтвер/ЛабП 2020
Пређи на навигацију
Пређи на претрагу
- Овај рок није решен. Помозите 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