Różne programy na zajęcia laboratoryjne z AK2
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

asm-printf-scanf.s 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. # Jan Potocki 2019
  2. .data
  3. # Definicje numerow funkcji systemowych i ich parametrow
  4. SYSEXIT = 60
  5. SYSREAD = 0
  6. SYSWRITE = 1
  7. STDIN = 0
  8. STDOUT = 1
  9. STDERR = 2
  10. # Stale
  11. liczba = 130 # Liczba calkowita do wypisania przez printf
  12. # Ciagi formatujace dla scanf
  13. int1: .asciz "%ld" # 64-bit int
  14. double1: .asciz "%lf" # 64-bit double
  15. # Ciagi formatujace dla printf
  16. int2: .asciz "%ld\n" # 64-bit int
  17. double2: .asciz "%f\n" # 64-bit double (w printf nie "%lf"!)
  18. .bss
  19. # Zmienne
  20. x: .space 8 # 64-bit int
  21. y: .space 8 # 64-bit double
  22. wynik: .space 8 # 64-bit double
  23. .text
  24. .globl main
  25. main:
  26. pushq %rbp # Wyrownanie stosu (alignment) - wymagane przez
  27. # konwencje wywolan
  28. # Wczytanie danych
  29. movb $0, %al # Brak parametrow w rejestrach wektorowych
  30. movq $int1, %rdi # Ciag formatujacy
  31. movq $x, %rsi # Wskaznik na x
  32. call scanf
  33. movb $0, %al # Brak parametrow w rejestrach wektorowych
  34. movq $double1, %rdi # Ciag formatujacy
  35. movq $y, %rsi # Wskaznik na y
  36. call scanf
  37. # Wywolanie funkcji w C
  38. movq (x), %rdi # Przekazanie x (1. parametr, int) przez wartosc
  39. movq (y), %xmm0 # Przekazanie y (2. parametr, double) przez wartosc
  40. # Liczby rejestrow wektorowych w al nie ustawiamy, bo nasza funkcja przyjmuje
  41. # stala liczbe parametrow (inaczej niz printf czy scanf)
  42. call kwadrat
  43. # Wynik zostanie zwrocony w rejestrze xmm0, ktorym rowniez przekazuje sie go do
  44. # funkcji printf - wiec nic nie trzeba z nim robic
  45. # Wypisanie wyniku
  46. movb $1, %al # 1 parametr w rejestrze wektorowym (xmm0)
  47. movq $double2, %rdi # Ciag formatujacy
  48. call printf
  49. # Wypisanie liczby calkowitej ustawionej w stalej
  50. movb $0, %al # Brak parametrow w rejestrach wektorowych
  51. movq $int2, %rdi # Ciag formatujacy
  52. movq $liczba, %rsi # Przekazanie stalej przez wartosc
  53. call printf
  54. popq %rbp # Przywrocenie stosu do poprzedniego stanu
  55. # Koniec programu
  56. movq $SYSEXIT, %rax
  57. movq $0, %rdi
  58. syscall