Advertisement
Mateusz8868

Untitled

Apr 26th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.65 KB | None | 0 0
  1. .MODEL SMALL, C
  2.  
  3. ;Istnieją dwie możliwości, by to
  4. ;zagwarantować. W pierwszej nadanie nazwy zawierającej podkreślenie należy zapewnić
  5. ;samodzielnie. W drugiej natomiast nazwa procedury wpisywana jest tak samo jak w
  6. ;kodzie źródłowym w języku C, zaś uzupełniona zostaje o ów _char podkreślenia
  7. ;automatycznie dopiero podczas asemblacji. Aby jednak do tego doszło, asembler musi
  8. ;wiedzieć o konieczności przeprowadzenia takiej modyfikacji. Informowany jest o tym
  9. ;poprzez wyspecyfikowanie dodatkowego argumentu w dyrektywie .MODEL, określającego
  10. ;język wysokiego poziomu, z jakim należy zachować zgodność.
  11.  
  12.  
  13. .CODE
  14. PUBLIC SREDNIA, ZNAKI
  15. ;te dane oraz te procedury, które mają być
  16. ;dostępne także z innych modułów, muszą zostać zadeklarowane w module asemblerowym
  17. ;jako publiczne za pomocą dyrektywy PUBLIC.
  18. ;W zależności od użytego modelu pamięci
  19.  
  20.  
  21. SREDNIA PROC NEAR
  22.  
  23. push bp ;zachowujemy pierwotną wartość bp
  24. mov bp, sp ;ustawienie rejestru bp, ustawienie wierzcholka stosu
  25. sub sp, 2 ;zarezerwowanie miejsca dla zmiennej lokalnej
  26.  
  27.  
  28. push cx ;zachowujemy warośći cx
  29. push si ;-||-
  30. push ds
  31. push ss
  32. push sp
  33.  
  34.  
  35. xor ax, ax
  36. mov [bp-2], ax ;zerowanie zmiennej lokalnej
  37. mov si, [bp+4] ;pobranie pierwszego parametru (adres tablicy) do rejestru si, przeskakujemy o stara wartość bp i adres powrnotny.
  38. mov cx, [bp+6] ;pobranie drugiego parametru (rozmiar tablicy) do rejestru cx
  39. mov [bp-2], cx ;wrzucamy do zmiennej lokalnej na stosie rozmiar tablicy
  40. dec cx ;bo petla ma sie wykonac tylko n-1 razy, gdzie n to liczba elementow tablicy
  41. finit ;inicjalizujemy koprocesor
  42. fild WORD PTR[bp-2] ;przepisuje na poczatek ilosc elementow aby moc wykonac dzielenie
  43. fld DWORD PTR [si] ;pobieram pierwszy element z tablicy typu float
  44.  
  45. Petla: cmp cx, 00h ;sprawdzamy warunek czy to koniec tablicy
  46. jz Dzielenie ;jezeli tak to skaczemy do dzielenia
  47. dec cx ;jezeli nie to dekrementujemy cx
  48. add si, 04h ;przesuwam wskaznik na kolejne 4 bajty zawierajace kolejna liczbe typu float
  49. fld DWORD PTR [si] ;pobieram koljena liczbe z tablicy typu float
  50. fadd ;sumuje obie liczby i odkladam je na szczycie stosu koprocesora
  51. jmp Petla ;skok do Petla aby ponownie kontynuowac sumowanie
  52.  
  53. Dzielenie: fdivr ;dzielenie odwrotne, tak bym uzyskal average
  54. pop sp ;aby moc ja zwrocic do glownego programu
  55. pop ss ;zdejmujemy ze stosu odpowiendie rejestry
  56. pop ds
  57. pop si
  58. pop cx
  59. mov sp, bp ;usuwamy zmienne lokalne
  60. pop bp
  61. ret ;konczymy procedure
  62. ENDP
  63.  
  64. ZNAKI PROC NEAR
  65.  
  66. push bp ;zachowujemy pierwotną wartość bp
  67. mov bp, sp ;ustawienie rejestru bp, ustawienie wierzcholka stosu
  68. sub sp, 2 ;zarezerwowanie miejsca dla zmiennej lokalnej
  69.  
  70. push cx ;zachowujemy warośći cx
  71. push si ;-||-
  72. push ds
  73. push ss
  74. push sp
  75.  
  76. xor ax, ax
  77. mov [bp-2], ax ;zerowanie zmiennej lokalnej
  78. mov si, [bp+4] ;pobranie drugiego parametru (adres tablicy) do rejestru si
  79. mov cl, [bp+6] ;pobranie pierwszego parametru (_char ASCII) do rejestru cl
  80.  
  81. Petla2: cmp BYTE PTR [si], 00h ;sprawdzenie czy to koniec tablicy (_char zero)
  82. jz Koniec ;Jezeli tak to konczymy
  83. cmp cl, BYTE PTR [si] ;sprawdzenie czy to szukany _char
  84. jz Inkr ;jezeli tak skaczemy do Inkrementuj
  85. inc si ;jezeli nie bierzemy kolejny _char w tablicy
  86. jmp Petla2 ;i skaczemy na poczatek petli
  87.  
  88. Inkr: inc WORD PTR [bp-2] ;jezeli _char wystapil inkremetujemy zmienna lokalna
  89. inc si ;i biezemy nastepny _char
  90. jmp Petla2 ;skaczemy na poczatek
  91.  
  92. Koniec: mov ax, [bp-2] ;jezeli array sie skonczyla to umieszczemay wartosc zmiennej lokalnej w rejestrze ax
  93. pop sp ;aby moc ja zwrocic do glownego programu
  94. pop ss
  95. pop ds
  96. pop si
  97. pop cx
  98. mov sp, bp ;usuwamy zmienne lokalne
  99. pop bp
  100. ret
  101. ENDP
  102.  
  103. .STACK
  104. DB 100h DUP (?)
  105. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement