Jak w poprzednich ćwiczeniach do zadania dołączony jest kod assemblera:
- <+0>: endbr64
- <+4>: push rbp
- <+5>: mov rbp,rsp
- <+8>: mov DWORD PTR [rbp-0x14],edi
- <+11>: mov QWORD PTR [rbp-0x20],rsi
- <+15>: mov DWORD PTR [rbp-0x4],0x9fe1a
- <+22>: cmp DWORD PTR [rbp-0x4],0x2710
- <+29>: jle 0x55555555514e <main+37>
- <+31>: sub DWORD PTR [rbp-0x4],0x65
- <+35>: jmp 0x555555555152 <main+41>
- <+37>: add DWORD PTR [rbp-0x4],0x65
- <+41>: mov eax,DWORD PTR [rbp-0x4]
- <+44>: pop rbp
- <+45>: ret
Przejdę od razu do linii 15, gdzie następuje przypisanie wartości
0x9FE1A
do adresu w pamięci [rbp-0x4]
. Następnie wykonywana jest instrukcja cmp
, porównująca zawartość [rbp-0x4]
z wartością 0x2710
. Jeśli warunek porównania jest spełniony, następuje skok do instrukcji w linii 37. W przeciwnym razie, co w tym przypadku ma miejsce, przechodzimy do linii 31, gdzie od wartości zapisanej w [rbp-0x4]
(0x9FE1A
) odejmowana jest wartość 0x65
. Następnie wykonywana jest instrukcja jmp
, która pomija linię 37 i przekierowuje wykonanie programu bezpośrednio do linii 41, gdzie dane z adresu [rbp-0x4]
zostają wprowadzone do rejestru EAX
. Wobec tego odpowiedź to 0x9FE1A - 0x65 = 0x9FDB5 (654773).