Facebook
From Mature Crane, 3 Years ago, written in Plain Text.
This paste is a reply to Re: Re: Untitled from Jittery Dormouse - view diff
Embed
Download Paste or View Raw
Hits: 95
  1. #----------------------------------------------------------------
  2. # Program lab_5.s - Architektury Komputerów
  3. #----------------------------------------------------------------
  4. #
  5. #  To compile&link: gcc -no-pie -o lab_5 lab_5.s
  6. #  To run:     ./lab_5
  7. #
  8. #----------------------------------------------------------------
  9.  
  10.  
  11.         .data
  12.        
  13. fmt_1:
  14.         .asciz  "Value = %d\n"          # format string
  15. val_1:
  16.         .long   6                       # long number
  17. fmt_2:
  18.         .string "GCD(%d, %d) = %d\n"    # another format string
  19. var_a:
  20.         .long   3084                    # first number
  21. var_b:
  22.         .long   1424                    # second number
  23. fmt_3:
  24.         .string "%d %d"                 # format string for scanf
  25. fmt_4:
  26.         .string "A=%d, B=%d\n"          # yet another format string
  27. fmt_lf:
  28.         .string "\n"                    # just "\n"
  29. ok_num:
  30.         .long   0                       # scanf result
  31. argc:
  32.         .long   0                       # number of arguments
  33. argc_tmp:
  34.         .long   0                       # number of arguments
  35. argv:
  36.         .quad   0                       # address of argv[]
  37. env:
  38.         .quad   0                       # address of env[]
  39. fmt_argc:
  40.         .string "Argc=%d\n"             # format for argc
  41. fmt_argv:
  42.         .string "Argv[%d]=%s\n"         # format for argv
  43. fmt_env:
  44.         .string "Env[%d]=%s\n"          # format for env
  45.  
  46. #----------------------------------------------------------------
  47.  
  48.         .text
  49.         .global main
  50.  
  51. #----------------------------------------------------------------
  52.        
  53. main:
  54.         push %rbp
  55.  
  56.         mov %edi, argc
  57.         mov %edi, argc_tmp
  58.         mov %rsi, argv
  59.         mov %rdx, env
  60.  
  61.         mov val_1, %rsi         # printf( char *fmt, long num ) - second argument to %rsi;
  62.         mov $fmt_1, %rdi        # printf( char *fmt, long num ) - first argument to %rdi;
  63.         xor %rax, %rax          # printf( char *fmt, long num ) - number of vector registers to %al
  64.         call printf
  65.  
  66. again:
  67.  
  68.         mov $fmt_3, %rdi
  69.         mov $var_a, %rsi
  70.         mov $var_b, %rdx
  71.         mov $0, %al
  72.         call scanf
  73.         mov %eax, ok_num
  74.  
  75.         mov $fmt_lf, %rdi       # printf( fmt ) - first argument to %rdi;
  76.         xor %rax, %rax          # printf( fmt ) - number of vector registers to %al
  77.         call printf
  78.  
  79.         cmp $2, ok_num
  80.         jnz no_more_numbers    
  81.  
  82.         mov var_b, %rdx         # printf( fmt, num1, num2 ) - third argument to %rdx;
  83.         mov var_a, %rsi         # printf( fmt, num1, num2 ) - second argument to %rsi;
  84.         mov $fmt_4, %rdi        # printf( fmt, num1, num2 ) - first argument to %rdi;
  85.         xor %rax, %rax          # printf( fmt, long num ) - number of vector registers to %al
  86.         call printf
  87.  
  88.         mov var_a, %edi         # nwd( long num1, long num2 ) - first argument to %rdi
  89.         mov var_b, %esi         # nwd( long num1, long num2 ) - second argument to %rsi
  90.         call gcd
  91.  
  92.         mov %rax, %rcx          # printf( fmt, num1, num2, result ) - fourth argument to %rcx
  93.         mov var_b, %rdx         # printf( fmt, num1, num2, result ) - third argument to %rdx
  94.         mov var_a, %rsi         # printf( fmt, num1, num2, result ) - second argument to %rsi
  95.         mov $fmt_2, %rdi        # printf( fmt, num1, num2, result ) - first argument to %rdi
  96.         mov $0, %al             # printf( fmt, num1, num2, result ) - number of vector registers to %al
  97.         call printf
  98.  
  99.         jmp again
  100.  
  101.  
  102. no_more_numbers:
  103.  
  104.         mov argc, %rsi          # printf( fmt, num ) - second argument to %rsi;
  105.         mov $fmt_argc, %rdi     # printf( fmt, num ) - first argument to %rdi;
  106.         xor %rax, %rax          # printf( fmt, num ) - number of vector registers to %al
  107.         call printf
  108.  
  109.  
  110.         mov argv, %rbp          # %rbp = argv;
  111.  
  112. next_argv:
  113.         mov (%rbp), %rdx        # printf( fmt, num, str ) - third argument to %rdx;
  114.         mov argc, %esi
  115.         sub argc_tmp, %esi      # printf( fmt, num, str ) - second argument to %rsi;
  116.         mov $fmt_argv, %rdi     # printf( fmt, num, str ) - first argument to %rdi;
  117.         xor %rax, %rax          # printf( fmt, num ) - number of vector registers to %al
  118.         call printf
  119.        
  120.         add $8, %rbp            # next argv
  121.         decl argc_tmp           # argc_tmp--;
  122.         jnz next_argv           #
  123.  
  124.  
  125.         mov env, %rbp           # %rbp = env;
  126.  
  127. next_env:
  128.         cmp $0,(%rbp)           # while( env[i] != NULL )
  129.         jz no_more_env
  130.         mov (%rbp), %rdx        # printf( fmt, num, str ) - third argument to %rdx;
  131.         mov argc_tmp, %esi      # printf( fmt, num, str ) - second argument to %rsi;
  132.         mov $fmt_env, %rdi      # printf( fmt, num, str ) - first argument to %rdi;
  133.         xor %rax, %rax          # printf( fmt, num ) - number of vector registers to %al
  134.         call printf
  135.        
  136.         add $8, %rbp            # next env
  137.         incl argc_tmp           # argc_tmp++;
  138.         jmp next_env
  139.  
  140. no_more_env:
  141.  
  142. #       xor %rdi, %rdi          # exit( code ) - first argument to %rdi
  143. #       call exit
  144.  
  145.         pop %rbp
  146.  
  147.         ret
  148.  
  149. #----------------------------------------------------------------
  150. # gcd - computes greatest common divisor
  151. #       Arguments:      %rdi - first number
  152. #                       %rsi - second number
  153. #       Returns:        %rax - gcd value
  154. #----------------------------------------------------------------
  155.  
  156.         .type gcd, @function
  157.  
  158. gcd:
  159.         cmp %rdi, %rsi          # (a==b)?
  160.         jz computed             # yes
  161.         jb b_below_a            # if(b < a) goto b_below_a
  162.         sub %rdi, %rsi          # else b=b-a
  163.         jmp gcd
  164. b_below_a:
  165.         sub %rsi, %rdi          # a=a-b
  166.         jmp gcd        
  167. computed:
  168.         mov %rdi, %rax          # result (a==b)
  169.         ret
  170.  

Replies to Re: Re: Re: Untitled rss

Title Name Language When
Re: Re: Re: Re: Untitled Crippled Meerkat text 3 Years ago.