Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Apr 29th, 2012  |  syntax: ASM (NASM)  |  size: 10.14 KB  |  hits: 20  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. .386
  2. .MODEL FLAT, STDCALL
  3.  
  4. .DATA
  5.  
  6.  
  7. .CODE
  8.  
  9. ;--------------------------------------------------
  10. ;((X+73)*(Y+3)-Y*X*5)/(Y*5 >> 2)
  11. ;--------------------------------------------------
  12.  
  13.  
  14. ;//-----------------------------------------------------
  15. FuncAsm PROC X:SDWORD, Y:SDWORD
  16. LOCAL X_mul_Y_plus_1:SDWORD, X_mul_X_plus_Y:SDWORD
  17. ;//-----------------------------------------------------
  18.     PUSH ESI
  19.         PUSH EDI
  20.         PUSH EBX
  21.        
  22.     MOV EAX,[X]                  ;запись параметров в регистры
  23.     MOV EDX,[Y]                  
  24.    
  25.     MOV [X_mul_Y_plus_1],EAX     ;запись параметров в лок. переменные
  26.     MOV [X_mul_X_plus_Y],EDX
  27.    
  28.  
  29.     ADD X_mul_Y_plus_1, 73       ;X+73
  30.     ADD [X_mul_X_plus_Y], 3      ;Y+3
  31.    
  32.     MOV EAX, [X_mul_Y_plus_1]    ;X+73 в регистр EAX
  33.    
  34.     MUL [X_mul_X_plus_Y]         ;умножение EAX на Y+3
  35.     MOV [X_mul_Y_plus_1], EAX    ;запись результата (X+73)(Y+3) в лок. переменую
  36.    
  37.    
  38.     MOV EAX, [Y]                 ;Y в регистр
  39.     MOV [X_mul_X_plus_Y], EAX    ;регистр в лок.переменную
  40.     MUL [X]                      ;умножение EAX на X
  41.        
  42.     MOV ESI, EAX                 ;умножение на 5 с помощью команды LEA
  43.     LEA EDX,[ESI+ESI*4]
  44.     MOV [X_mul_X_plus_Y], EDX    ;Y*X*5 в лок. переменную
  45.  
  46.    
  47.     MOV EAX, [X_mul_Y_plus_1]    ;(X+73)(Y+3) в регистр EAX
  48.     SUB EAX, [X_mul_X_plus_Y]    ;EAX = EAX - Y*X*5
  49.     MOV [X_mul_Y_plus_1], EAX    ;EAX в лок. переменную
  50.    
  51.    
  52.     MOV EAX, [Y]                 ;Y в EAX
  53.    
  54.     MOV ESI, EAX                 ;умножение на 5 с помощью команды LEA
  55.     LEA EDX,[ESI+ESI*4]
  56.    
  57.     MOV [X_mul_X_plus_Y], EDX    ;Y*X*5 в лок. переменную
  58.    
  59.    
  60.     MOV EAX, [X_mul_X_plus_Y]    ;Y*5 из лок. переменной в EAX
  61.     SAR EAX, 2                   ;сдвиг вправо на 2
  62.     MOV [X_mul_X_plus_Y], EAX    ;результат Y*5 >> 2
  63.    
  64.    
  65.     MOV EAX, [X_mul_Y_plus_1]    ;(X+73)(Y+3) - Y*X*5 в EAX
  66.    
  67.     CWD                          ;расширение EAX до DX:AX
  68.     DIV [X_mul_X_plus_Y]         ;деление (X+73)(Y+3)-Y*X*5)/(Y*5 >> 2)
  69.    
  70.     POP EBX
  71.         POP EDI
  72.         POP ESI
  73.    
  74.    RET
  75.    
  76. FuncAsm ENDP
  77.  
  78.  
  79. ;//-----------------------------------------------------
  80. FuncArrayAsm PROC STDCALL X: PTR SDWORD, Y: PTR SDWORD, Dst: PTR SDWORD, Arrlen: DWORD
  81. LOCAL SAVEEBX: DWORD , X_mul_Y_plus_1:SDWORD, X_mul_X_plus_Y:SDWORD
  82. ;//-----------------------------------------------------
  83.         PUSH ESI
  84.         PUSH EDI
  85.         MOV [SAVEEBX], EBX
  86.         MOV ECX, [Arrlen]
  87.     JECXZ Quit    ; Если счётчик нулевой, то выходим
  88.        
  89.         MOV ESI, [X]
  90.         MOV EDI, [Y]
  91.         MOV EBX, [Dst]
  92.  
  93.         .REPEAT
  94.                 PUSH ECX
  95.                 PUSH EBX
  96.                 ;--------------------------------------------------
  97.                 MOV EAX, [ESI]
  98.                 MOV EDX, [EDI]                
  99.    
  100.         MOV [X_mul_Y_plus_1],EAX     ;запись параметров в лок. переменные
  101.         MOV [X_mul_X_plus_Y],EDX
  102.    
  103.  
  104.         ADD X_mul_Y_plus_1, 73       ;X+73
  105.         ADD [X_mul_X_plus_Y], 3      ;Y+3
  106.    
  107.         MOV EAX, [X_mul_Y_plus_1]    ;X+73 в регистр EAX
  108.    
  109.         MUL [X_mul_X_plus_Y]         ;умножение EAX на Y+3
  110.         MOV [X_mul_Y_plus_1], EAX    ;запись результата (X+73)(Y+3) в лок. переменую
  111.    
  112.    
  113.         MOV EAX, [Y]                 ;Y в регистр
  114.         MOV [X_mul_X_plus_Y], EAX    ;регистр в лок.переменную
  115.         MUL [X]                      ;умножение EAX на X
  116.        
  117.         MOV ESI, EAX                 ;умножение на 5 с помощью команды LEA
  118.         LEA EDX,[ESI+ESI*4]
  119.         MOV [X_mul_X_plus_Y], EDX    ;Y*X*5 в лок. переменную
  120.  
  121.    
  122.         MOV EAX, [X_mul_Y_plus_1]    ;(X+73)(Y+3) в регистр EAX
  123.         SUB EAX, [X_mul_X_plus_Y]    ;EAX = EAX - Y*X*5
  124.         MOV [X_mul_Y_plus_1], EAX    ;EAX в лок. переменную
  125.    
  126.    
  127.         MOV EAX, [Y]                 ;Y в EAX
  128.    
  129.         MOV ESI, EAX                 ;умножение на 5 с помощью команды LEA
  130.         LEA EDX,[ESI+ESI*4]
  131.    
  132.         MOV [X_mul_X_plus_Y], EDX    ;Y*X*5 в лок. переменную
  133.    
  134.    
  135.         MOV EAX, [X_mul_X_plus_Y]    ;Y*5 из лок. переменной в EAX
  136.         SAR EAX, 2                   ;сдвиг вправо на 2
  137.         MOV [X_mul_X_plus_Y], EAX    ;результат Y*5 >> 2
  138.    
  139.    
  140.         MOV EAX, [X_mul_Y_plus_1]    ;(X+73)(Y+3) - Y*X*5 в EAX
  141.    
  142.         CWD                          ;расширение EAX до DX:AX
  143.         DIV [X_mul_X_plus_Y]         ;деление ((X+73)(Y+3)-Y*X*5)/(Y*5 >> 2)
  144.         ;--------------------------------------------------
  145.         POP EBX
  146.  
  147.                 MOV [EBX], EAX
  148.  
  149.                 POP ECX
  150.         DEC ECX
  151.         LEA ESI, [ESI+4]
  152.                 LEA EDI, [EDI+4]
  153.                 LEA EBX, [EBX+4]
  154.     .UNTIL ZERO?
  155.  
  156. Quit:
  157.         MOV EBX, [SAVEEBX]
  158.         POP EDI
  159.         POP ESI
  160.         RET
  161.        
  162. FuncArrayAsm ENDP
  163.  
  164. ;//-----------------------------------------------------
  165. FuncArrayAsm_4 PROC STDCALL X: PTR SDWORD, Y: PTR SDWORD, Dst: PTR SDWORD, Arrlen: DWORD
  166. LOCAL X_mul_Y_plus_1:SDWORD, X_mul_X_plus_Y:SDWORD, SAVEEBX: DWORD
  167. ;//-----------------------------------------------------
  168.         PUSH ESI
  169.         PUSH EDI
  170.         MOV [SAVEEBX], EBX
  171.  
  172.         MOV ESI, [X]
  173.         MOV EDI, [Y]
  174.         MOV EBX, [Dst]
  175.  
  176.         MOV ECX, [Arrlen]
  177.         SHR ECX,2
  178.         JZ Cycle
  179.  
  180. Cycle4:
  181.         PUSH ECX       
  182.         REPEAT 4                 
  183.                 PUSH EBX
  184.                 ;--------------------------------------------------
  185.                 MOV EAX, [ESI]
  186.                 MOV EDX, [EDI]                
  187.    
  188.         MOV [X_mul_Y_plus_1],EAX     ;запись параметров в лок. переменные
  189.         MOV [X_mul_X_plus_Y],EDX
  190.    
  191.  
  192.         ADD X_mul_Y_plus_1, 73       ;X+73
  193.         ADD [X_mul_X_plus_Y], 3      ;Y+3
  194.    
  195.         MOV EAX, [X_mul_Y_plus_1]    ;X+73 в регистр EAX
  196.    
  197.         MUL [X_mul_X_plus_Y]         ;умножение EAX на Y+3
  198.         MOV [X_mul_Y_plus_1], EAX    ;запись результата (X+73)(Y+3) в лок. переменую
  199.    
  200.    
  201.         MOV EAX, [Y]                 ;Y в регистр
  202.         MOV [X_mul_X_plus_Y], EAX    ;регистр в лок.переменную
  203.         MUL [X]                      ;умножение EAX на X
  204.        
  205.         MOV ESI, EAX                 ;умножение на 5 с помощью команды LEA
  206.         LEA EDX,[ESI+ESI*4]
  207.         MOV [X_mul_X_plus_Y], EDX    ;Y*X*5 в лок. переменную
  208.  
  209.    
  210.         MOV EAX, [X_mul_Y_plus_1]    ;(X+73)(Y+3) в регистр EAX
  211.         SUB EAX, [X_mul_X_plus_Y]    ;EAX = EAX - Y*X*5
  212.         MOV [X_mul_Y_plus_1], EAX    ;EAX в лок. переменную
  213.    
  214.    
  215.         MOV EAX, [Y]                 ;Y в EAX
  216.    
  217.         MOV ESI, EAX                 ;умножение на 5 с помощью команды LEA
  218.         LEA EDX,[ESI+ESI*4]
  219.    
  220.         MOV [X_mul_X_plus_Y], EDX    ;Y*X*5 в лок. переменную
  221.    
  222.    
  223.         MOV EAX, [X_mul_X_plus_Y]    ;Y*5 из лок. переменной в EAX
  224.         SAR EAX, 2                   ;сдвиг вправо на 2
  225.         MOV [X_mul_X_plus_Y], EAX    ;результат Y*5 >> 2
  226.    
  227.    
  228.         MOV EAX, [X_mul_Y_plus_1]    ;(X+73)(Y+3) - Y*X*5 в EAX
  229.    
  230.         CWD                          ;расширение EAX до DX:AX
  231.         DIV [X_mul_X_plus_Y]         ;деление (X+73)(Y+3)-Y*X*5)/(Y*5 >> 2)
  232.         ;--------------------------------------------------
  233.         POP EBX
  234.  
  235.                 MOV [EBX], EAX
  236.  
  237.                 DEC ECX
  238.                 LEA ESI, [ESI+4]
  239.                 LEA EDI, [EDI+4]
  240.                 LEA EBX, [EBX+4]
  241.         ENDM
  242.         POP ECX
  243.         DEC ECX
  244.         JNZ Cycle4             
  245.  
  246. Cycle:
  247.  
  248.         MOV CL,BYTE PTR [Arrlen]
  249.     AND CL,3              
  250.     JZ Quit
  251.  
  252.         .REPEAT
  253.                 PUSH ECX
  254.                 PUSH EBX
  255.                 ;--------------------------------------------------
  256.                 MOV EAX, [ESI]
  257.                 MOV EDX, [EDI]                
  258.    
  259.         MOV [X_mul_Y_plus_1],EAX     ;запись параметров в лок. переменные
  260.         MOV [X_mul_X_plus_Y],EDX
  261.    
  262.  
  263.         ADD X_mul_Y_plus_1, 73       ;X+73
  264.         ADD [X_mul_X_plus_Y], 3      ;Y+3
  265.    
  266.         MOV EAX, [X_mul_Y_plus_1]    ;X+73 в регистр EAX
  267.    
  268.         MUL [X_mul_X_plus_Y]         ;умножение EAX на Y+3
  269.         MOV [X_mul_Y_plus_1], EAX    ;запись результата (X+73)(Y+3) в лок. переменую
  270.    
  271.    
  272.         MOV EAX, [Y]                 ;Y в регистр
  273.         MOV [X_mul_X_plus_Y], EAX    ;регистр в лок.переменную
  274.         MUL [X]                      ;умножение EAX на X
  275.        
  276.         MOV ESI, EAX                 ;умножение на 5 с помощью команды LEA
  277.         LEA EDX,[ESI+ESI*4]
  278.         MOV [X_mul_X_plus_Y], EDX    ;Y*X*5 в лок. переменную
  279.  
  280.    
  281.         MOV EAX, [X_mul_Y_plus_1]    ;(X+73)(Y+3) в регистр EAX
  282.         SUB EAX, [X_mul_X_plus_Y]    ;EAX = EAX - Y*X*5
  283.         MOV [X_mul_Y_plus_1], EAX    ;EAX в лок. переменную
  284.    
  285.    
  286.         MOV EAX, [Y]                 ;Y в EAX
  287.    
  288.         MOV ESI, EAX                 ;умножение на 5 с помощью команды LEA
  289.         LEA EDX,[ESI+ESI*4]
  290.    
  291.         MOV [X_mul_X_plus_Y], EDX    ;Y*X*5 в лок. переменную
  292.    
  293.    
  294.         MOV EAX, [X_mul_X_plus_Y]    ;Y*5 из лок. переменной в EAX
  295.         SAR EAX, 2                   ;сдвиг вправо на 2
  296.         MOV [X_mul_X_plus_Y], EAX    ;результат Y*5 >> 2
  297.    
  298.    
  299.         MOV EAX, [X_mul_Y_plus_1]    ;(X+73)(Y+3) - Y*X*5 в EAX
  300.    
  301.         CWD                          ;расширение EAX до DX:AX
  302.         DIV [X_mul_X_plus_Y]         ;деление (X+73)(Y+3)-Y*X*5)/(Y*5 >> 2)
  303.         ;--------------------------------------------------
  304.         POP EBX
  305.  
  306.                 MOV [EBX], EAX
  307.  
  308.                 POP ECX
  309.         DEC ECX
  310.         LEA ESI, [ESI+4]
  311.                 LEA EDI, [EDI+4]
  312.                 LEA EBX, [EBX+4]
  313.     .UNTIL ZERO?
  314.  
  315. Quit:
  316.         MOV EBX, [SAVEEBX]
  317.         POP EDI
  318.         POP ESI
  319.         RET
  320. FuncArrayAsm_4 ENDP
  321.  
  322. END