Sistemski softver/LabP 2020
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