Mam takie zadanie i nie wiem czy go dobrze rozwiązałem. Proszę o pomoc bo nie mam w sumie się kogo podpytać wiec piszę tutaj
Zadanie brzmi:
Program ma wykonać działanie |(x-y)*z|, zmienne maja być przekazane przez rejestry kolejno %EBX, %ECX, %EDX, a wynik przekazany przez %EAX. Ma być zrealizowane za pomocą podprogramu. (czyli CALL i RET)
.text
.global _start
bez:
sub %ebx,%ecx
mul %ecx
cmp $0, %eax
jge end_if
neg %eax
end_if:
ret
_start:
mov $5, %ebx # y
mov $10, %ecx # x
mov $-10, %eax # z
xor %edx,%edx
call bez
nop
Wciąż masz błąd w mov. Wynik odejmowania masz w ebx a nie ecx. Nie zgaduj, myśl. Prześledź działanie programu linia po linii. Ja rozumiem, że zgadywanie jest fajne, ale sekwencja sub-mov-mul na 4 rejestrach ma 1024 kombinacje i tylko jedna z nich jest w kontekście Twojego zadania poprawna. Zamiast na czuja próbować 1000 razy, napisz to raz a porządnie.
U mnie na zajęciach nie używaliśmy movl, subl, itd wiec chyba nie powinno tak być.
Dzisiaj na świeżo popatrzałem na program i faktycznie jest błąd :? Teraz jest już dobrze
sub %ecx,%ebx
mov %ebx,%eax
mul %edx
Powiedzcie mi czy mov działa na tej samej zasadzie co sub lub add ?? Tzn chodzi mi o wynik, bo sub %ecx, %ebx zapisuje wynik do %ebx. Następnie mov %ebx, %eax zapisuje wartość do %eax ? Analogicznie myśląc to tak tylko, że już mnie nie raz zaskoczyliście wiec się pytam :?
sub zapisuje do ebx a mov do eax, bo drugim argumentem, który podałeś do sub jest ebx a w mov eax. Drugi argument przy dodawaniu i odejmowaniu to zarówno jeden z argumentów działania, jak i wynik.
add %eax, %ebx
oznacza: zsumuj eax i ebx i wynik zapisz w ebx. Bo ebx jest drugim argumentem. Gdybyś napisał
add %edx, %ecx
zsumowałbyć edx z ecx i wynik zapisał do ecx. Jeśli chodzi o mov, drugi argument jest celem, pierwszy źródłem
mov %eax, %ecx
oznacza, że chcesz przenieść z eax wartość do ecx (nadpisać ecx wartością z eax). Przy okazji dodam, że tak działają asemblery GNU. W niektórych kompilatorach, m.in. tych Microsoftu argumenty podaje się bez procentów i odwrotnie. Żeby było łatwiej.