Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ------------------------------------------------------------------------------------- ;
  2. ;   Лабораторная работа №1 по курсу Программирование на языке ассемблера                ;
  3. ;   Вариант №1.1                                                                       ;
  4. ;   Выполнил студент Мухаматулин Максим                                                 ;
  5. ;                                                                                       ;
  6. ;   Исходный модуль LabAssignment.asm                                                 ;
  7. ;   Содержит функции на языке ассемблера, разработанные в соответствии с заданием        ;
  8. ; ------------------------------------------------------------------------------------- ;
  9. ;   Задание: Реализовать прямое и обратное преобразования Фурье
  10. ;   Формат данных сигнала: __int8
  11. ;   Формат данных спектра: float
  12. ;   Размер (количество отсчетов) сигнала и спектра: 8
  13. ;   Способ реализации: DFT 4x4 + 1 бабочка
  14. ;   Отсчеты спектра являются комплексными числами. Причем действительные части хранятся
  15. ;   в первой половине массива, а мнимые - во второй
  16. .DATA
  17. two real8 2.0
  18. .CODE
  19. ; ------------------------------------------------------------------------------------- ;
  20. ; void CalculateSpectrum(spectrum_type* Spectrum, signal_type* Signal)                  ;
  21. ;   Прямое преобразование Фурье. Вычисляет спектр Spectrum по сигналу Signal           ;
  22. ;   Типы данных spectrum_type и signal_type, а так же разимер сигнала                    ;
  23. ;   определяются в файле Tuning.h                                                     ;
  24. ; ------------------------------------------------------------------------------------- ;
  25. ; e - четная часть сигнала, o - нечетная часть сигнала
  26. ;
  27. ;  Signal = [a0, a1, a2, a3, a4, a5, a6, a7]
  28. ;
  29. ;          +---------------+   +-----+   +--+           +----------------------------+   +------------------+   +-------------+
  30. ;          |(a0+a4)+(a2+a6)|   |t1+t2|   |e1|           |        a1+a7+a3+a5         |   |       t3+t4      |   |      e5     |
  31. ;          |     a0-a4     |   |  k1 |   |e2|           | sqrt(2)/2*((a1+a7)-(a3+a5))|   | sqrt(2)/2*(t3-t4)|   | sqrt(2)/2*e4|
  32. ;          |(a0+a4)-(a2+a6)|   |t1-t2|   |e3|           |             0              |   |         0        |   |      0      |
  33. ;  Re(e) = |     a0-a4     | = |  k1 | = |e2|   Re(o) = |-sqrt(2)/2*((a1+a7)-(a3+a5))| = |-sqrt(2)/2*(t3-t4)| = |-sqrt(2)/2*e4|
  34. ;          |(a0+a4)+(a2+a6)|   |t1+t2|   |e1|           |       -a1-a7-a3-a5         |   |      -t3-t4      |   |     -e5     |
  35. ;          |     a0-a4     |   |  k1 |   |e2|           |-sqrt(2)/2*((a1+a7)-(a3+a5))|   |-sqrt(2)/2*(t3-t4)|   |-sqrt(2)/2*e4|
  36. ;          |(a0+a4)-(a2+a6)|   |t1-t2|   |e3|           |             0              |   |         0        |   |       0     |
  37. ;          |     a0-a4     |   |  k1 |   |e2|           | sqrt(2)/2*((a1+a7)-(a3+a5))|   | sqrt(2)/2*(t3-t4)|   | sqrt(2)/2*e4|
  38. ;          +---------------+   +-----+   +--+           +----------------------------+   +------------------+   +-------------+
  39. ;
  40. ;          +-------+    +---+    +---+           +------------------------------+   +------------------+   +-------------+
  41. ;          |   0   |    | 0 |    | 0 |           |               0              |   |         0        |   |      0      |
  42. ;          |-a2+a6 |    |-k2|    |-o3|           | sqrt(2)/2*((-a1+a7)+(-a3+a5))|   | sqrt(2)/2*(k3+k4)|   | sqrt(2)/2*o1|
  43. ;          |   0   |    | 0 |    | 0 |           |       (-a1+a7)-(-a3+a5)      |   |       k3-k4      |   |      o2     |
  44. ;  Im(e) = | a2-a6 | =  | k2| =  | o3|   Im(o) = | sqrt(2)/2*((-a1+a7)+(-a3+a5))| = | sqrt(2)/2*(k3+k4)| = | sqrt(2)/2*o1|
  45. ;          |   0   |    | 0 |    | 0 |           |               0              |   |         0        |   |      0      |
  46. ;          |-a2+a6 |    |-k2|    |-o3|           |-sqrt(2)/2*((-a1+a7)+(-a3+a5))|   |-sqrt(2)/2*(k3+k4)|   |-sqrt(2)/2*o1|
  47. ;          |   0   |    | 0 |    | 0 |           |      -(-a1+a7)+(-a3+a5)      |   |      -k3+k4      |   |     -o2     |
  48. ;          | a2-a6 |    | k2|    | o3|           |-sqrt(2)/2*((-a1+a7)+(-a3+a5))|   |-sqrt(2)/2*(k3+k4)|   |-sqrt(2)/2*o1|
  49. ;          +-------+    +---+    +---+           +------------------------------+   +------------------+   +-------------+
  50. ;
  51. ;                     +-----------------+   +---+                      +------------------+   +-----+
  52. ;                     |     e1 + e5     |   |re1|                      |         0        |   |  0  |
  53. ;                     |e2 + sqrt(2)/2*e4|   |re2|                      |-o3 + sqrt(2)/2*o1|   | ro2 |
  54. ;                     |       e3        |   |re3|                      |        o2        |   | ro3 |
  55. ;  Re = Re(e)+Re(o) = |e2 - sqrt(2)/2*e4| = |re4|   Im = Im(e)+Im(o) = | o3 + sqrt(2)/2*o1| = | ro4 |
  56. ;                     |     e1 - e5     |   |re5|                      |         0        |   |  0  |
  57. ;                     |e2 - sqrt(2)/2*e4|   |re4|                      |-o3 - sqrt(2)/2*o1|   |-ro4 |
  58. ;                     |       e3        |   |re3|                      |       -o2        |   |-ro3 |
  59. ;                     |e2 + sqrt(2)/2*e4|   |re1|                      | o3 - sqrt(2)/2*o1|   |-ro2 |
  60. ;                     +-----------------+   +---+                      +------------------+   +-----+
  61. ;
  62. CalculateSpectrum PROC              ; [RCX] - Spectrum
  63.                                     ; [RDX] - Signal
  64.     mov al, [rdx+4]                 ; a4
  65.     mov r8b, [rdx+0]                ; a0
  66.  
  67.     movsx ax, al                    ; a4 (расширенный до int16)
  68.     movsx r8w, r8b                  ; a0 (сразу было нельзя, ограничение )
  69.                                     ; Регистры: ax:a4, r8w:a0
  70.  
  71.     mov r9w, r8w                    ; a0
  72.     sub r9w, ax                     ; a0-a4=k1=e2
  73.     add r8w, ax                     ; a0+a4=t1
  74.                                     ; Регистры: ax:a4, r8w:t1, r9w:k1
  75.  
  76.     mov al, [rdx+6]                 ; a6
  77.     mov r10b, [rdx+2]               ; a2
  78.     movsx ax, al                    ; a6 (расширяем)
  79.     movsx r10w, r10b                ; a2   
  80.                                     ; Регистры: ax:a6, r8w:t1, r9w:k1, r10w:a2
  81.    
  82.     mov r11w, r10w                  ; a2
  83.     sub r11w, ax                    ; a2-a6=k2=o3
  84.     add r10w, ax                    ; a2+a6=t2
  85.                                     ; Регистры: ax:a6, r8w:t1, r9w:k1(e2), r10w:t2, r11w:k2(o3)
  86.  
  87.     mov ax, r8w                     ; t1
  88.     sub r8w, r10w                   ; t1-t2=e3
  89.     add r10w, ax                    ; t1+t2=e1
  90.                                     ; Регистры: ax:t1, r8w:e3, r9w:e2, r10w:e1, r11w:o3
  91.    
  92.     sub rsp, 2*7                    ; Бронируем 7 мест для элементов длины word
  93.     mov [rsp+2*6], r9w              ; e2
  94.     mov [rsp+2*5], r11w             ; o3
  95.     mov [rsp+2*4], r10w             ; e1
  96.     mov [rsp+2*3], r8w              ; e3
  97.                                     ; Стек(7): *, *, *, e3, e1, o3, e2
  98.  
  99.     mov al, [rdx+1]                 ; a1
  100.     mov r8b, [rdx+7]                ; a7
  101.     movsx ax, al                    ; a1 (расширенный до int16)
  102.     movsx r8w, r8b                  ; a7
  103.                                     ; Регистры: ax:a1, r8w:a7, r9w:e2, r10w:e1, r11w:o3
  104.  
  105.     mov r9w, r8w                    ; a7
  106.     sub r9w, ax                     ; a7-a1=k3
  107.     add r8w, ax                     ; a1+a7=t3
  108.                                     ; Регистры: ax:a1, r8w:t3, r9w:k3, r10w:e1, r11w:o3
  109.  
  110.     mov al, [rdx+3]                 ; a3
  111.     mov r10b, [rdx+5]               ; a5
  112.     movsx ax, al                    ; a3 (расширяем)
  113.     movsx r10w, r10b                ; a5
  114.                                     ; Регистры: ax:a3, r8w:t3, r9w:k3, r10w:a5, r11w:o3
  115.    
  116.     mov r11w, r10w                  ; a5
  117.     sub r11w, ax                    ; a5-a3=k4
  118.     add r10w, ax                    ; a3+a5=t4
  119.                                     ; Регистры: ax:a3, r8w:t3, r9w:k3, r10w:t4, r11w:k4
  120.  
  121.     mov ax, r8w                     ; t3
  122.     sub r8w, r10w                   ; t3-t4=e4
  123.     add r10w, ax                    ; t3+t4=e5
  124.                                     ; Регистры: ax:t3, r8w:e4, r9w:k3, r10w:e5, r11w:k4
  125.  
  126.     mov ax, r9w                     ; k3
  127.     sub r9w, r11w                   ; k3-k4=o2
  128.     add r11w, ax                    ; k3+k4=o1
  129.                                     ; Регистры: ax:k3, r8w:e4, r9w:o2, r10w:e5, r11w:o1
  130.  
  131.     mov [rsp+2*2], r9w              ; o2=ro3
  132.                                     ; Стек(7): *, *, o2(ro3), e3, e1, o3, e2
  133.  
  134.     mov r9w, [rsp+2*4]              ; e1
  135.     mov ax, r9w                     ; e1
  136.     sub r9w, r10w                   ; e1-e5=re5
  137.     add r10w, ax                    ; e1+e5=re1
  138.                                     ; Регистры: ax:e1, r8w:e4, r9w:re5, r10w:re1, r11w:o1
  139.     mov [rsp+2*1], r10w             ; re1
  140.     mov [rsp+2*0], r9w              ; re5
  141.                                     ; Стек(7): re5, re1, o2(ro3), e3(re3), e1, o3, e2                          
  142.     finit
  143.    
  144.     fld two                         ; Вычисление sqrt(2)/2
  145.     fsqrt
  146.     fdiv two
  147.                                     ; ST: sqrt(2)/2
  148.    
  149.     fild word ptr [rsp+2*0]         ; Загрузка re5 как int16
  150.     fstp dword ptr [rcx+4*4]        ; Сохранение re5 как float
  151.    
  152.     fild word ptr [rsp+2*1]         ; Загрузка re1 как int16
  153.     fstp dword ptr [rcx+4*0]        ; Сохранение re1 как float
  154.    
  155.     fild word ptr [rsp+2*2]         ; Загрузка ro3 как int16
  156.     fst dword ptr [rcx+4*10]        ; Сохранение ro3 как float
  157.     fchs
  158.     fstp dword ptr [rcx+4*14]       ; Сохранение -ro3 как float
  159.    
  160.     fldz                            ; Загружаем 0
  161.     fst dword ptr [rcx+4*8]         ; Сохранение 0 как float
  162.     fstp dword ptr [rcx+4*12]       ; Сохранение 0 как float
  163.    
  164.     fild word ptr [rsp+2*3]         ; Загрузка re3 как int16
  165.     fst dword ptr [rcx+4*2]         ; Сохранение re3 как float
  166.     fstp dword ptr [rcx+4*6]        ; Сохранение re3 как float
  167.    
  168.     fild word ptr [rsp+2*5]         ; Загрузка o3 как int16 на st
  169.     mov [rsp+2*4], r11w             ; Загрузка на стек o1
  170.                                     ; Стек(7): re5, re1, o2(ro3), e3(re3), o1, o3, e2                                      
  171.     fild word ptr [rsp+2*4]         ; Загрузка o1 как int16 на st
  172.     fmul st(0), st(2)               ; sqrt(2)/2*o1
  173.                                     ; ST: sqrt(2)/2*o1, o3, sqrt(2)/2
  174.    
  175.     fldz
  176.     fadd st(0), st(1)               ; sqrt(2)/2*o1
  177.     fsub st(0), st(2)               ; o3-sqrt(2)/2*o1=ro2
  178.     fst dword ptr [rcx+4*9]
  179.     fchs                            ; sqrt(2)/2*o1-o3=ro8
  180.     fstp dword ptr [rcx+4*15]
  181.                                     ; ST: sqrt(2)/2*o1, o3, sqrt(2)/2
  182.    
  183.     fadd st(0), st(1)               ; sqrt(2)/2*o1+o3=ro4
  184.     fst dword ptr [rcx+4*11]       
  185.     fchs                            ; -sqrt(2)/2*o1-o3=ro6
  186.     fstp dword ptr [rcx+4*13]
  187.                                     ; ST: o3, sqrt(2)/2
  188.     fstp st(0)                      ; Избавляемся от o3
  189.                                     ; ST: sqrt(2)/2
  190.  
  191.     fild word ptr [rsp+2*6]         ; Загрузка e2 как int16 на st
  192.     mov [rsp+2*5], r8w
  193.     fild word ptr [rsp+2*5]         ; Загрузка e4 как int16 на st
  194.     fmul st(0), st(2)               ; sqrt(2)/2*e4
  195.                                     ; ST: sqrt(2)/2*e4, e2, sqrt(2)/2  
  196.    
  197.     fldz
  198.     fadd st(0), st(2)               ; e2
  199.     fsub st(0), st(1)               ; e2-sqrt(2)/2*e4=re4
  200.     fst dword ptr [rcx+4*3]
  201.     fstp dword ptr [rcx+4*5]
  202.                                     ; ST: sqrt(2)/2*e4, e2, sqrt(2)/2  
  203.    
  204.     fadd st(0), st(1)               ; sqrt(2)/2*e4+e2=re2
  205.     fst dword ptr [rcx+4*1]
  206.     fstp dword ptr [rcx+4*7]
  207.                                     ; ST: e2, sqrt(2)/2
  208.    
  209.     fstp st(0)                      ; Избавляемся от e2
  210.     fstp st(0)                      ; Избавляемся от sqrt(2)/2
  211.                                     ; ST: e2, sqrt(2)/2
  212.     add rsp, 2*7                    ; Возвращаем адрес стека на прежнее положение
  213.  
  214.     ret
  215. CalculateSpectrum ENDP
  216. ; ------------------------------------------------------------------------------------- ;
  217. ; void RecoverSignal(signal_type* Signal, spectrum_type* Spectrum)                      ;
  218. ;   Обратное преобразование Фурье. Вычисляет сигнал Signal по спектру Spectrum           ;
  219. ;   Типы данных spectrum_type и signal_type, а так же размер сигнала                  ;
  220. ;   определяются в файле Tuning.h                                                     ;
  221. ; ------------------------------------------------------------------------------------- ;
  222. ;
  223. ;  Spectrum = [a0, a1, a2, a3, a4, a5, a6, a7, b0, b1, b2, b3, b4, b5, b6, b7]
  224. ;
  225. ;          +---------------+   +-----+   +--+           +--------------------------------------------+   +-----------------------------+   +----+
  226. ;          |(a0+a4)+(a2+a6)|   |t1+t2|   |e1|           |               (a1+a7)+(a3+a5)              |   |             t3+t4           |   | o1 |
  227. ;          |(a0-a4)+(b6-b2)|   |k1+k2|   |e2|           | sqrt(2)/2*((a1+a7)-(a3+a5)+(b7-b1)+(b5-b3) |   | sqrt(2)/2*((t3-t4)+(k3+k4)) |   | o2 |
  228. ;          |(a0+a4)-(a2+a6)|   |t1-t2|   |e3|           |               (b7-b1)-(b5-b3)              |   |             k3-k4           |   | o3 |
  229. ;  Re(e) = |(a0-a4)-(b6-b2)| = |k1-k2| = |e4|   Re(o) = | sqrt(2)/2*(-(a1+a7)+(a3+a5)+(b7-b1)+(b5-b3)| = | sqrt(2)/2*(-(t3-t4)+(k3+k4))| = | o4 |
  230. ;          |(a0+a4)+(a2+a6)|   |t1+t2|   |e1|           |              -(a1+a7)+(a3+a5)              |   |-            t3+t4           |   |-o1 |
  231. ;          |(a0-a4)+(b6-b2)|   |k1+k2|   |e2|           |-sqrt(2)/2*((a1+a7)-(a3+a5)+(b7-b1)+(b5-b3) |   |-sqrt(2)/2*((t3-t4)+(k3+k4)) |   |-o2 |
  232. ;          |(a0+a4)-(a2+a6)|   |t1-t2|   |e3|           |              -(b7-b1)-(b5-b3)              |   |-            k3-k4           |   |-o3 |
  233. ;          |(a0-a4)-(b6-b2)|   |k1-k2|   |e4|           |-sqrt(2)/2*(-(a1+a7)+(a3+a5)+(b7-b1)+(b5-b3)|   |-sqrt(2)/2*(-(t3-t4)+(k3+k4))|   |-o4 |
  234. ;          +---------------+   +-----+   +--+           +--------------------------------------------+   +-----------------------------+   +----+
  235. ;
  236. ;                 +-----+         +--+
  237. ;                 |e1+o1|         |r1|
  238. ;                 |e2+o2|         |r2|
  239. ;                 |e3+o3|         |r3|
  240. ;  Signal = 1/8 * |e4+o4| = 1/8 * |r4|
  241. ;                 |e1-o1|         |r5|
  242. ;                 |e2-o2|         |r6|
  243. ;                 |e3-o3|         |r7|
  244. ;                 |e4-o4|         |r6|
  245. ;                 +-----+         +--+
  246. ;
  247. RecoverSignal PROC                  ; [RCX] - Signal
  248.                                     ; [RDX] - Spectrum
  249.     finit
  250.     fld dword ptr [rdx+4*0]         ; Загрузка a0
  251.     fld dword ptr [rdx+4*4]         ; Загрузка a4
  252.                                     ; ST: a4, a0
  253.     fldz
  254.     fadd st(0), st(2)               ; a0
  255.     fsub st(0), st(1)               ; a0-a4=k1
  256.     fxch st(2)                      ; ST: a0, a4, k1
  257.     faddp st(1), st(0)              ; a0+a4=t1
  258.                                     ; ST: t1, k1
  259.     fld dword ptr [rdx+4*2]         ; Загрузка a2
  260.     fadd dword ptr [rdx+4*6]        ; a2+a6=t2
  261.                                     ; ST: t2, t1, k1
  262.     fldz
  263.     fadd st(0), st(2)               ; t1
  264.     fsub st(0), st(1)               ; t1-t2=e3
  265.     fxch st(1) 
  266.     faddp st(2), st(0)              ; t1+t2=e1
  267.                                     ; ST: e3, e1, k1
  268.     fld dword ptr [rdx+4*15]        ; Загрузка b7
  269.     fsub dword ptr [rdx+4*9]        ; b7-b1=k3
  270.                                     ; ST: k3, e3, e1, k1
  271.     fld dword ptr [rdx+4*13]        ; Загрузка b5
  272.     fsub dword ptr [rdx+4*11]       ; b5-b3=k4
  273.                                     ; ST: k4, k3, e3, e1, k1
  274.     fldz
  275.     fadd st(0), st(2)               ; k3
  276.     fsub st(0), st(1)               ; k3-k4=o3
  277.                                     ; ST: o3, k4, k3, e3, e1, k1
  278.     fldz
  279.     fadd st(0), st(4)               ; e3
  280.     fsub st(0), st(1)               ; e3-o3=r7
  281.                                     ; ST: r7, o3, k4, k3, e3, e1, k1
  282.    
  283.     sub rsp, 2*8                    ; Бронируем 8 ячеек word в стеке
  284.     fistp word ptr [rsp+2*7]        ; Сохраняем на стек как int16
  285.                                     ; Стек(8): *, *, *, *, *, *, *, r7
  286.                                     ; ST: o3, k4, k3, e3, e1, k1
  287.     fadd st(0), st(3)               ; o3+e3=r3
  288.  
  289.     fistp word ptr [rsp+2*6]        ; Стек(8): *, *, *, *, *, *, r3, r7
  290.                                     ; ST: k4, k3, e3, e1, k1
  291.     fstp st(2)                      ; Избавились от e3
  292.                                     ; ST: k3, k4, e1, k1
  293.     faddp st(1), st(0)              ; k3+k4
  294.                                     ; ST: k3+k4, e1, k1
  295.     fld dword ptr [rdx+4*1]         ; Загрузка a1
  296.     fadd dword ptr [rdx+4*7]        ; a1+a7=t3
  297.                                     ; ST: t3, k3+k4, e1, k1
  298.     fld dword ptr [rdx+4*3]         ; Загрузка a3
  299.     fadd dword ptr [rdx+4*5]        ; a3+a5=t4
  300.                                     ; ST: t4, t3, k3+k4, e1, k1
  301.     fldz
  302.     fadd st(0), st(2)               ; t3
  303.     fadd st(0), st(1)               ; t3+t4=o1
  304.                                     ; ST: o1, t4, t3, k3+k4, e1, k1
  305.     fldz
  306.     fadd st(0), st(5)               ; e1
  307.     fsub st(0), st(1)               ; e1-o1=r5
  308.    
  309.     fistp word ptr [rsp+2*5]        ; Стек(8): *, *, *, *, *, r5, r3, r7
  310.                                     ; ST: o1, t4, t3, k3+k4, e1, k1
  311.     fadd st(0), st(4)               ; e1+o1=r1
  312.  
  313.     fistp word ptr [rsp+2*4]        ; Стек(8): *, *, *, *, r1, r5, r3, r7
  314.                                     ; ST: t4, t3, k3+k4, e1, k1
  315.     fsubp st(1), st(0)              ; t3-t4
  316.                                     ; ST: t3-t4, k3+k4, e1, k1
  317.     fld two                         ; Вычисление sqrt(2)/2
  318.     fsqrt
  319.     fdiv two
  320.     fstp st(3)                      ; Избавляемся от e1
  321.                                     ; ST: t3-t4, k3+k4, sqrt(2)/2, k1
  322.     fldz
  323.     fadd st(0), st(2)               ; k3+k4
  324.     fsub st(0), st(1)               ; k3+k4-(t3-t4)
  325.     fmul st(0), st(3)               ; sqrt(k3+k4-(t3-t4))=o4
  326.     fxch st(2)                      ; ST: k3+k4, t3-t4, o4, sqrt(2)/2, k1
  327.  
  328.     faddp st(1), st(0)              ; k3+k4+(t3-t4)
  329.     fmul st(0), st(2)               ; sqrt(k3+k4+(t3-t4))=o2
  330.                                     ; ST: o2, o4, sqrt(2)/2, k1
  331.     fld dword ptr [rdx+4*14]        ; Загрузка b6
  332.     fsub dword ptr [rdx+4*10]       ; b6-b2=k2
  333.                                     ; ST: k2, o2, o4, sqrt(2)/2, k1
  334.     fldz
  335.     fadd st(0), st(5)               ; k1
  336.     fsub st(0), st(1)               ; k1-k2=e4
  337.                                     ; ST: e4, k2, o2, o4, sqrt(2)/2, k1
  338.     fldz
  339.     fadd st(0), st(1)               ; e4
  340.     fsub st(0), st(4)               ; e4-o4=r8
  341.  
  342.     fistp word ptr [rsp+2*3]        ; Стек(8): *, *, *, r8, r1, r5, r3, r7
  343.                                     ; ST: e4, k2, o2, o4, sqrt(2)/2, k1
  344.     fadd st(0), st(3)               ; e4+o4=r4
  345.     fistp word ptr [rsp+2*2]        ; Стек(8): *, *, r4, r8, r1, r5, r3, r7
  346.                                     ; ST: k2, o2, o4, sqrt(2)/2, k1
  347.     faddp st(4), st(0)              ; k1+k2=e2
  348.                                     ; ST: o2, o4, sqrt(2)/2, e2
  349.     fldz
  350.     fadd st(0), st(4)               ; e2
  351.     fsub st(0), st(1)               ; e2-o2=r6
  352.     fistp word ptr [rsp+2*1]        ; Стек(8): *, r6, r4, r8, r1, r5, r3, r7
  353.                                     ; ST: o2, o4, sqrt(2)/2, e2
  354.     fadd st(0), st(3)               ; e2+o2=r2
  355.     fistp word ptr [rsp+2*0]        ; Стек(8): r2, r6, r4, r8, r1, r5, r3, r7
  356.                                     ; ST: o4, sqrt(2)/2, e2
  357.     fstp st(0)                      ; Избавились от o4
  358.     fstp st(0)                      ; Избавились от sqrt(2)/2
  359.     fstp st(0)                      ; Избавились от e2
  360.                                     ; ST:
  361.  
  362.                                     ; Сохранение значений
  363.     mov r8w, [rsp+2*0]              ; r2
  364.     sar r8w, 3                      ; Смещение на 3 вправо (деление на 2^3)
  365.     mov [rcx+1*1], r8b              ; Сохраняем как int8 (лишние байты от int16 не помешают)
  366.  
  367.     mov r9w, [rsp+2*1]              ; r6
  368.     sar r9w, 3
  369.     mov [rcx+1*5], r9b
  370.  
  371.     mov r10w, [rsp+2*2]             ; r4
  372.     sar r10w, 3
  373.     mov [rcx+1*3], r10b
  374.  
  375.     mov r11w, [rsp+2*3]             ; r8
  376.     sar r11w, 3
  377.     mov [rcx+1*7], r11b
  378.  
  379.     mov r8w, [rsp+2*4]              ; r1
  380.     sar r8w, 3
  381.     mov [rcx+1*0], r8b
  382.  
  383.     mov r9w, [rsp+2*5]              ; r5
  384.     sar r9w, 3
  385.     mov [rcx+1*4], r9b
  386.  
  387.     mov r10w, [rsp+2*6]             ; r3
  388.     sar r10w, 3
  389.     mov [rcx+1*2], r10b
  390.  
  391.     mov r11w, [rsp+2*7]             ; r7
  392.     sar r11w, 3
  393.     mov [rcx+1*6], r11b
  394.  
  395.     add rsp, 2*8                    ; Возвращаем адрес стека на прежнее положение
  396.     ret
  397. RecoverSignal ENDP
  398. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement