Advertisement
Guest User

Untitled

a guest
Dec 21st, 2018
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. format PE GUI 4.0
  2. entry start
  3.  
  4. include 'C:\fasmw17304\INCLUDE\win32a.inc'
  5.  
  6. BUFFER_SIZE     = 255
  7. ;MODUL           = 10
  8.  
  9.  
  10. section '.data' data readable writeable
  11.         num1 db BUFFER_SIZE dup(?)
  12.         num2 db BUFFER_SIZE dup(?)
  13.         res db BUFFER_SIZE dup(0)
  14.         mulBuf db BUFFER_SIZE dup(0)
  15.         modul db BUFFER_SIZE dup(?)
  16.  
  17.         num1FileName db 'C:\111\num1.txt',0
  18.         num2FileName db 'C:\111\num2.txt',0
  19.         resFileName db 'C:\111\res.txt',0
  20.         modFileName db 'C:\111\mod.txt',0
  21.  
  22.         lpBytesNum1 dd ?
  23.         lpBytesNum2 dd ?
  24.         lpBytesMod dd ?
  25.         lpBytesRes dd ?
  26.         hFile dd ?
  27.  
  28. section '.code' code readable executable
  29.         proc OpenAndRead, fn ,buf ,bufSize, bytesRead
  30.              push    eax
  31.              invoke CreateFile, [fn], GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
  32.              mov [hFile], eax
  33.  
  34.              ;invoke  GetFileSize, [hFile], 0
  35.              ;mov [fSize], eax
  36.  
  37.              invoke ReadFile, [hFile], [buf], [bufSize], [bytesRead], 0
  38.              invoke CloseHandle, [hFile]
  39.  
  40.              pop     eax
  41.              ret
  42.         endp
  43.  
  44.         proc OpenAndWrite, fn, buf, bufSize, bytesRead
  45.              push    eax
  46.              invoke CreateFile, [fn], GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
  47.              mov [hFile], eax
  48.  
  49.              ;invoke  GetFileSize, [hFile], 0
  50.              ;mov [fSize], eax
  51.  
  52.              invoke WriteFile, [hFile], [buf], [bufSize], [bytesRead], 0
  53.              invoke CloseHandle, [hFile]
  54.  
  55.              pop     eax
  56.              ret
  57.         endp
  58.  
  59.         proc ByteAdd, res, numberLen, add_byte
  60.              push eax edi ecx
  61.              pushf
  62.              cld
  63.              clc
  64.              mov ah, byte[add_byte]
  65.  
  66.              mov ecx, [numberLen]
  67.              mov edi, [res]
  68.              .loop:
  69.                 mov al, ah
  70.                 add al, [edi]
  71.                 jc .over
  72.                 stosb
  73.                 jmp .end
  74.              .over:
  75.                 mov ah, 1
  76.                 stosb
  77.              loop .loop
  78.              .end:
  79.                 popf
  80.                 pop ecx edi eax
  81.              ret
  82.         endp
  83.  
  84.  
  85.         ;СУММА
  86.  
  87.         proc Sum, number1, number2, result, numberLen
  88.              push ax edi ecx
  89.              cld
  90.              clc
  91.              mov ecx, [numberLen]
  92.              .loop:
  93.                 mov edi, [number1]
  94.                 mov al,  [edi]
  95.                 mov edi, [number2]
  96.                 jc .over
  97.                 add al, [edi]
  98.                 jmp .save_digit
  99.               .over:
  100.                 add al, 1
  101.                 jc .over_again
  102.                 add al, [edi]
  103.                 jmp .save_digit
  104.               .over_again:
  105.                 mov al, [edi]
  106.               .save_digit:
  107.                 mov edi, [result]
  108.                 mov [edi], al
  109.                 inc [number1]
  110.                 inc [number2]
  111.                 inc [result]
  112.              loop .loop
  113.  
  114.  
  115.              pop ecx edi ax
  116.              ret
  117.         endp
  118.  
  119.         ; СДВИГ ВЛЕВО - *2
  120.  
  121.        proc ShiftLeft, number, numberLen
  122.              push esi ecx eax
  123.              pushf
  124.              cld
  125.              clc
  126.              mov ecx, [numberLen]
  127.              mov esi, [number]
  128.              lodsb
  129.              mov ah, al
  130.              shr ah, 7
  131.              shl al, 1
  132.              mov [esi-1], al
  133.              dec ecx
  134.              .loop:
  135.                  lodsb
  136.                  mov [esi-1], ah
  137.                  mov ah, al
  138.                  shr ah, 7
  139.                  shl al, 1
  140.                  add [esi-1], al
  141.              loop .loop
  142.              popf
  143.              pop eax ecx esi
  144.              ret
  145.         endp
  146.  
  147.         ;Вычитание (мемное)
  148.  
  149.         proc TrueSub, number1, number2, result, numberLen
  150.         pusha
  151.  
  152.  
  153.  
  154.         mov cx, 0
  155.         sub1:
  156.                 mov eax, [numberLen]
  157.                 cmp cx, ax
  158.                 jz exit_sub
  159.  
  160.                 xor ax, ax
  161.  
  162.                 sub_lbl1:
  163.                 mov dx, 256
  164.                 sub dx, ax
  165.                 mov ax, dx
  166.                 mov edi, [number1]
  167.                 mov dl, [edi]
  168.                 add ax, dx
  169.                 mov edi, [number2]
  170.                 mov dl, [edi]
  171.                 sub ax, dx
  172.                 cmp ax, 255
  173.                 jg sub_lbl2
  174.  
  175.                 mov edi, [result]
  176.                 ;mov dl, 'o'
  177.                 mov [edi], al
  178.                 ;mov [edi], dl
  179.                 inc cx
  180.                 inc [number1]
  181.                 inc [number2]
  182.                 inc [result]
  183.  
  184.                 jmp sub2
  185.                 sub_lbl2:
  186.                 mov edi, [result]
  187.                 ;mov dl, 'x'
  188.                 mov [edi], al
  189.                 ;mov [edi], dl
  190.                 inc cx
  191.                 inc [number1]
  192.                 inc [number2]
  193.                 inc [result]
  194.  
  195.                 jmp sub1
  196.                 sub2:
  197.                 mov ax, 1d
  198.                 jmp sub_lbl1
  199.                  exit_sub:
  200.         popa
  201.         ret
  202.         endp
  203.  
  204.  
  205.         ;  Перебор по всем битам со старшего
  206.  
  207.  
  208.  
  209.         proc ModularMul, number1, number2, result, numberLen, modulus
  210.  
  211.              push eax edi ecx
  212.              pushf
  213.              stdcall Remodulate, [number1], [result], [numberLen], [modulus]
  214.              stdcall Remodulate, [number2], [result], [numberLen], [modulus]
  215.              mov ecx, [numberLen]
  216.              mov edi, [number1]
  217.              add edi, [numberLen]
  218.              dec edi
  219.  
  220.              .loop:
  221.                 cmp ecx, 0
  222.                 je .exit_loop
  223.                 ;xor ax, ax
  224.                 ;mov al, [edi]
  225.                 push ecx
  226.                 mov ecx, 8d
  227.  
  228.                 .loopa:
  229.                     stdcall ShiftLeft, [result], [numberLen]
  230.  
  231.                     stdcall Less, [result], [modulus], [numberLen]
  232.                     cmp eax, 0
  233.                     jne .less
  234.                     stdcall TrueSub, [result], [modulus], [result], [numberLen]
  235.                     .less:
  236.  
  237.                     xor ax, ax
  238.                     mov al, [edi]
  239.  
  240.                     mov bx, 1
  241.                     shl bx, cl
  242.                     shr bx, 1
  243.                     test ax, bx
  244.  
  245.  
  246.                     jz .endif
  247.                     stdcall Sum, [result], [number2], [result], [numberLen]
  248.                     .endif:
  249.  
  250.                     stdcall Less, [result], [modulus], [numberLen]
  251.                     cmp eax, 0
  252.                     jne .less2
  253.                     stdcall TrueSub, [result], [modulus], [result], [numberLen]
  254.                     .less2:
  255.  
  256.                 loop .loopa
  257.  
  258.                 pop ecx
  259.                 dec edi
  260.                 dec ecx
  261.              jmp .loop
  262.  
  263.              .exit_loop:
  264.  
  265.              popf
  266.              pop ecx edi eax
  267.              ret
  268.  
  269.         endp
  270.  
  271.         proc Remodulate, number, result, numberLen, modulus
  272.              pusha
  273.              .loop:
  274.                 stdcall Less, [number], [modulus], [numberLen]
  275.                 cmp eax, 0
  276.                 jne .exit
  277.                 stdcall TrueSub, [number], [modulus], [number], [numberLen]
  278.                 jmp .loop
  279.              .exit:
  280.              popa
  281.              ret
  282.         endp
  283.  
  284.         proc ClearArray array, numberLen
  285.              pusha
  286.                 mov ecx, [numberLen]
  287.                 mov edi, [array]
  288.                 @clearloop:
  289.                     mov [edi],BYTE  0
  290.                     inc edi
  291.                 loop @clearloop
  292.              popa
  293.              ret
  294.         endp
  295.  
  296.         proc CopyArray source, dest, numberLen
  297.             pusha
  298.  
  299.             mov ecx, [numberLen]
  300.             .copyloop:
  301.             mov edi, [source]
  302.             mov al, [edi]
  303.             mov edi, [dest]
  304.             mov [edi], al
  305.             inc [source]
  306.             inc [dest]
  307.             loop .copyloop
  308.  
  309.             popa
  310.             ret
  311.         endp
  312.  
  313.         proc ModularExponentiation number1, number2, result, numberLen, modulus, buffer
  314.  
  315.            push eax edi ecx
  316.              pushf
  317.              mov ecx, [numberLen]
  318.              mov edi, [number2]
  319.              add edi, [numberLen]
  320.              dec edi
  321.              mov [res], 1
  322.  
  323.              .loop:
  324.                 cmp ecx, 0
  325.                 je .exit_loop
  326.                 ;xor ax, ax
  327.                 ;mov al, [edi]
  328.                 push ecx
  329.                 mov ecx, 8d
  330.  
  331.                 .loopa:
  332.                     ;stdcall ShiftLeft, [result], [numberLen]
  333.  
  334.                     ;stdcall Less, [result], [modulus], [numberLen]
  335.                     ;cmp eax, 0
  336.                     ;jne .less
  337.                     ;stdcall TrueSub, [result], [modulus], [result], [numberLen]
  338.                     ;.less:
  339.                     ;ModularMul, number1, number2, result, numberLen, modulus
  340.                    ; proc CopyArray source, dest, numberLen
  341.                    ;  proc ClearArray array, numberLen
  342.                     stdcall ClearArray, [buffer], [numberLen]
  343.                     stdcall ModularMul, [result], [result], [buffer], [numberLen], [modulus]
  344.                     stdcall CopyArray, [buffer], [result], [numberLen]
  345.                     ;stdcall ClearArray, [buffer], [numberLen]
  346.  
  347.                     xor ax, ax
  348.                     mov al, [edi]
  349.  
  350.                     mov bx, 1
  351.                     shl bx, cl
  352.                     shr bx, 1
  353.                     test ax, bx
  354.  
  355.  
  356.                     jz .endif
  357.                     stdcall ClearArray, [buffer], [numberLen]
  358.                     ;stdcall Sum, [result], [number2], [result], [numberLen]
  359.                     stdcall ModularMul, [result], [number1], [buffer], [numberLen], [modulus]
  360.                     stdcall CopyArray, [buffer], [result], [numberLen]
  361.                     ;stdcall ClearArray, [buffer], [numberLen]
  362.                     .endif:
  363.  
  364.                     ;stdcall Less, [result], [modulus], [numberLen]
  365.                     ;cmp eax, 0
  366.                     ;jne .less2
  367.                     ;stdcall TrueSub, [result], [modulus], [result], [numberLen]
  368.                     ;.less2:
  369.  
  370.                 loop .loopa
  371.  
  372.                 pop ecx
  373.                 dec edi
  374.                 dec ecx
  375.              jmp .loop
  376.  
  377.              .exit_loop:
  378.  
  379.              popf
  380.              pop ecx edi eax
  381.              ret
  382.  
  383.  
  384.         endp
  385.  
  386.  
  387.        proc Less, number1, number2, numberLen
  388.              push edi esi ecx ebx
  389.              pushf
  390.              mov ecx, [numberLen]
  391.              mov edi, [number1]
  392.              add edi, [numberLen]
  393.              dec edi
  394.  
  395.              mov esi, [number2]
  396.              add esi, [numberLen]
  397.              dec esi
  398.              .loop:
  399.                 mov bl, [edi]
  400.                 mov bh, [esi]
  401.                 cmp bl, bh
  402.                 jb .end_true
  403.                 ja .end_false
  404.                 dec edi
  405.                 dec esi
  406.              loop .loop
  407.              .end_false: ;;equal or greater
  408.              mov eax, 00h
  409.              jmp .exit
  410.              .end_true:
  411.              mov eax, 01h
  412.              .exit:
  413.              popf
  414.              pop ebx ecx esi edi
  415.              ret
  416.         endp
  417.  
  418.         start:
  419.              stdcall OpenAndRead, num1FileName, num1, BUFFER_SIZE, lpBytesNum1
  420.              stdcall OpenAndRead, num2FileName, num2, BUFFER_SIZE, lpBytesNum2
  421.              stdcall OpenAndRead, modFileName, modul, BUFFER_SIZE, lpBytesMod
  422.  
  423.              ;stdcall Less, num1, num2, BUFFER_SIZE
  424.              ;stdcall Subs, num1, num2, res, BUFFER_SIZE
  425.  
  426.              ;stdcall Bits, num1, res, 10d
  427.  
  428.             ; stdcall ModularMul, num1, num2, res, BUFFER_SIZE, modul
  429.            ; proc ModularExponentiation number1, number2, result, numberLen, modulus, buffer
  430.              stdcall ModularExponentiation, num1, num2, res, BUFFER_SIZE, modul, mulBuf
  431.  
  432.              stdcall OpenAndWrite, resFileName, res, BUFFER_SIZE, lpBytesRes
  433.              invoke ExitProcess, 0
  434.  
  435. section '.idata' import data readable writeable
  436.  
  437.         library kernel,'KERNEL32.DLL'
  438.  
  439.         import  kernel,\
  440.                 CreateFile, 'CreateFileA',\
  441.                 WriteFile, 'WriteFile',\
  442.                 ReadFile, 'ReadFile',\
  443.                 CloseHandle, 'CloseHandle',\
  444.                 ExitProcess,'ExitProcess'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement