• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Liczenie NWD w języku asembler

0 głosów
118 wizyt
pytanie zadane 15 stycznia w Assembler przez DzikieHarce Użytkownik (510 p.)

Hej,

napisałam krótki program w języku asembler, mający liczyć NWD metodą dzielenia. Coś jednak chyba jest nie tak, bo wynik to zawsze liczba a. Wydawało mi się że wcześniej zbuildowałam ten sam kod i działał, teraz już nie chce. Wiecie co może być nie tak?

;program for calculating the greatest common divisor

.model flat, stdcall
.code
Count proc a: DWORD, b: DWORD

;move values from adx and acx to variable a and b
mov edx, b ;moving b to edx
mov ecx, a ;moving a to ecx

;loop to search result
;if result is found, jump to fin
petla:
	cmp b, 0h ;comparision b with 0
	jle fin ;jump to fin if less than or equal to 0
	mov esp, b ;moving b to esp

	xor edx, edx ;made a xor operation on edx
	mov esp, ecx ;moving ecx to esp
	idiv b ;divide b
	mov b, edx ;moving edx to b

	mov ecx, esp ;moving esp to ecx
	jmp petla ;jump to beginning of "petla"


;if number is found, end program.
fin:
	mov eax, ecx ;moving ecx to eax
	ret ;return from the procedure
count endp ;end of procedure name. In this case: count
end ;end of a source file

 

1 odpowiedź

+3 głosów
odpowiedź 16 stycznia przez overcq Pasjonat (17,750 p.)
edycja 17 stycznia przez overcq
 
Najlepsza

Je­ś­li to ten al­go­ry­tm, to na 64-bi­to­wym Li­nuk­sie w skła­d­ni AT&T był­by ta­ki kod:

.text

.globl main
main:
    mov     $84, %rdi
    mov     $18, %rsi
    call    nwd
    mov     $format_string, %rdi
    mov     %rax, %rsi
    mov     $0, %al
    call    printf
    xor     %rax, %rax
    ret

nwd:
    mov     %rdi, %rax
0:  xor     %rdx, %rdx
    idivq   %rsi
    mov     %rsi, %rax
    mov     %rdx, %rsi
    cmp     $0, %rsi
    jne     0b
    ret

.data

format_string:
    .asciz  "%d\n"

Wy­daje się, że uży­łeś rejes­tru esp za­miast eax.

A tak poza tym to nie wiem po co są te ko­men­ta­rze, sko­ro prze­pi­sują to, co ro­bi sa­ma in­struk­cja.

1
komentarz 16 stycznia przez DzikieHarce Użytkownik (510 p.)
Komentarze są dla mnie, żeby lepiej zapamiętać co robią komendy. Robię na x86 Windowsie, ale błąd już poprawiony, użyłam złych rejestrów. Nie mniej jednak, dziękuję za pomoc! ;)

Podobne pytania

0 głosów
0 odpowiedzi 165 wizyt
pytanie zadane 12 marca 2016 w Assembler przez noname375 Początkujący (300 p.)
0 głosów
1 odpowiedź 2,771 wizyt
pytanie zadane 3 kwietnia 2018 w C i C++ przez mietek_arduino Początkujący (330 p.)
0 głosów
3 odpowiedzi 1,366 wizyt
pytanie zadane 23 kwietnia 2016 w C i C++ przez karola Nowicjusz (230 p.)

88,325 zapytań

136,918 odpowiedzi

305,553 komentarzy

58,598 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...