Przeskoki w Assemblerze

0

W ramach ćwiczeń dostałem do rozwiązania kilka zadań. Jednym z nich jest zaimplementowanie EAX <-- max(EBX, ECX, EDX).
Moglibyście mi wyjaśnić jak to dokładnie powinno wyglądać? Co jest złego w mojej logice?

section	.text
	global _start

_start:
	  mov $2, %EBX ;wrzucam wartosci do rejestrow
	  mov $8, %ECX 
	  mov $4, %EDX
	  cmp %EBX, %ECX ; ECX - EBX
	  jg _setHigherValue ; jesli EBX > ECX to przeskocz do _setHigherValue
	  cmp %ECX, %EDX ; EDX - ECX
	  jle _setECXAsHighestValue
	  jg _setEDXAsHighestValue
	  
	  
_setHigherValue:
    mov %EBX, %ECX ;  przepisz wartosc z EBX do ECX. 
    ; ? teraz wraca do kolejnej instrukcji ze _start ? 

_setECXAsHighestValue:
    mov %EBX, %EAX

_setECDAsHighestValue:
    mov %EDX, %EAX

nop;
0

Ja bym zmienił parę rzeczy. Po pierwsze, w eax wyląduje na 100% jedna z tych 3 wartości, więc idziemy:

  mov %ebx, %eax
  cmp %eax, %ecx
  jg skip_ecx
  mov %ecx, %eax
skip_ecx:
  cmp %eax, %edx
  jg end
  mov %edx, %eax
end:
  nop

Problem w twoim kodzie jest taki, że jak ebx jest większe od ecx to zakładasz, że ebx jest największe ze wszystkich i nie porównujesz już tego z edx.

0

@hauleth: dzięki! właśnie nie byłem pewny czy po przeskoczeniu do kolejnej. uhm. sekcji(?) i jej wykonaniu, wrócimy do poprzednich instrukcji w _start. teraz zrozumiałem co tam się dzieje, opierając się na Twoim kodzie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1