• 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

Aruba Cloud - Virtual Private Server VPS
+1 głos
843 wizyt
pytanie zadane 15 stycznia 2022 w Assembler przez DzikieHarce Użytkownik (690 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 2022 przez overcq Pasjonat (22,440 p.)
edycja 17 stycznia 2022 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 2022 przez DzikieHarce Użytkownik (690 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 355 wizyt
pytanie zadane 12 marca 2016 w Assembler przez noname375 Początkujący (300 p.)
0 głosów
1 odpowiedź 4,138 wizyt
pytanie zadane 3 kwietnia 2018 w C i C++ przez mietek_arduino Początkujący (330 p.)
0 głosów
3 odpowiedzi 2,568 wizyt
pytanie zadane 23 kwietnia 2016 w C i C++ przez karola Nowicjusz (230 p.)

93,324 zapytań

142,323 odpowiedzi

322,390 komentarzy

62,653 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...