• 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

Object Storage Arubacloud
+1 głos
574 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 (21,690 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 335 wizyt
pytanie zadane 12 marca 2016 w Assembler przez noname375 Początkujący (300 p.)
0 głosów
1 odpowiedź 3,814 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,101 wizyt
pytanie zadane 23 kwietnia 2016 w C i C++ przez karola Nowicjusz (230 p.)

92,565 zapytań

141,417 odpowiedzi

319,601 komentarzy

61,950 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...