|
7 | 7 | .global main
|
8 | 8 | .extern printf
|
9 | 9 |
|
| 10 | +# rdi - a |
| 11 | +# rsi - b |
| 12 | +# RET rax - gcd of a and b |
10 | 13 | euclid_mod:
|
11 |
| - # Abs of the first argument |
12 |
| - mov rax, rdi |
| 14 | + mov rax, rdi # Get abs of a |
13 | 15 | sar rax, 31
|
14 | 16 | xor rdi, rax
|
15 | 17 | sub rdi, rax
|
16 |
| - |
17 |
| - # Abs of the second argument |
18 |
| - mov rax, rsi |
| 18 | + mov rax, rsi # Get abs of b |
19 | 19 | sar rax, 31
|
20 | 20 | xor rsi, rax
|
21 | 21 | sub rsi, rax
|
22 |
| - |
23 |
| - # While loop |
24 | 22 | jmp mod_check
|
25 | 23 | mod_loop:
|
26 |
| - xor rdx, rdx |
| 24 | + xor rdx, rdx # Take the mod of a and b |
27 | 25 | mov rax, rdi
|
28 | 26 | div rsi
|
29 |
| - mov rdi, rsi |
30 |
| - mov rsi, rdx |
| 27 | + mov rdi, rsi # Set b to the mod of a and b |
| 28 | + mov rsi, rdx # Set a to b |
31 | 29 | mod_check:
|
32 |
| - cmp rsi, 0 |
| 30 | + cmp rsi, 0 # Check if b is non-zero |
33 | 31 | jne mod_loop
|
34 |
| - |
35 |
| - mov rax, rdi |
| 32 | + mov rax, rdi # Return the result |
36 | 33 | ret
|
37 | 34 |
|
38 | 35 | euclid_sub:
|
39 |
| - # Abs of the first argument |
40 |
| - mov rax, rdi |
| 36 | + mov rax, rdi # Get abs of a |
41 | 37 | sar rax, 31
|
42 | 38 | xor rdi, rax
|
43 | 39 | sub rdi, rax
|
44 |
| - |
45 |
| - # Abs of the second argument |
46 |
| - mov rax, rsi |
| 40 | + mov rax, rsi # Get abs of b |
47 | 41 | sar rax, 31
|
48 | 42 | xor rsi, rax
|
49 | 43 | sub rsi, rax
|
50 |
| - |
51 |
| - # While loop |
52 | 44 | jmp check
|
53 | 45 | loop:
|
54 |
| - cmp rdi, rsi |
| 46 | + cmp rdi, rsi # Find which is bigger |
55 | 47 | jle if_true
|
56 |
| - |
57 |
| - sub rdi, rsi |
| 48 | + sub rdi, rsi # If a is bigger then a -= b |
58 | 49 | jmp check
|
59 | 50 | if_true:
|
60 |
| - sub rsi, rdi |
| 51 | + sub rsi, rdi # Else b -= a |
61 | 52 | check:
|
62 |
| - cmp rsi, rdi |
| 53 | + cmp rsi, rdi # Check if a and b are not equal |
63 | 54 | jne loop
|
64 |
| - |
65 |
| - mov rax, rdi |
| 55 | + mov rax, rdi # Return results |
66 | 56 | ret
|
67 | 57 |
|
68 | 58 | main:
|
69 |
| - # Calling euclid_mod |
70 |
| - mov rdi, 4288 |
| 59 | + mov rdi, 4288 # Call euclid_mod |
71 | 60 | mov rsi, 5184
|
72 | 61 | call euclid_mod
|
73 |
| - |
74 |
| - # Printing euclid_mod output |
75 |
| - mov rdi, OFFSET fmt |
| 62 | + mov rdi, OFFSET fmt # Print output |
76 | 63 | mov rsi, rax
|
77 | 64 | xor rax, rax
|
78 | 65 | call printf
|
79 |
| - |
80 |
| - # Calling euclid_sub |
81 |
| - mov rdi, 1536 |
| 66 | + mov rdi, 1536 # Call euclid_sub |
82 | 67 | mov rsi, 9856
|
83 | 68 | call euclid_sub
|
84 |
| - |
85 |
| - # Printing euclid_sub output |
86 |
| - mov rdi, OFFSET fmt |
| 69 | + mov rdi, OFFSET fmt # Print output |
87 | 70 | mov rsi, rax
|
88 | 71 | xor rax, rax
|
89 | 72 | call printf
|
90 |
| - |
91 |
| - xor rax, rax |
| 73 | + xor rax, rax # Return 0 |
92 | 74 | ret
|
0 commit comments