Advertisement
Guest User

Untitled

a guest
Jan 21st, 2020
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. section .data
  2.     hello db 'Введите число: ', 0xa
  3.     len equ $-hello
  4.     error db 'Ошибка', 0xa
  5.     len1 equ $-error
  6.  
  7. section .bss
  8.     string resb 200
  9.     factor resb 200
  10.     reverse resb 200
  11.  
  12. section .text
  13.     global _start
  14.     _start:
  15.         mov eax, 4
  16.         mov ebx, 1
  17.         mov ecx, hello
  18.         mov edx, len
  19.         int 0x80
  20.  
  21.         call .read
  22.         mov eax, [esp]          ; Длина собщения
  23.  
  24.         push eax
  25.         call .translate
  26.         mov ebx, [esp +4]       ; Число
  27.  
  28.         cmp eax, 0              ;проверка на ноль
  29.         jnz .n  
  30.         call .error
  31.         call .exit
  32.         .n:
  33.  
  34.         push ebx
  35.         call .fact
  36.  
  37.  
  38.         call .write
  39.  
  40.     mov eax, 1
  41.     mov ebx, 0
  42.     int 0x80
  43.  
  44. .read:
  45.     mov eax, 3
  46.     mov ebx, 0
  47.     mov ecx, string
  48.     mov edx, 200
  49.     int 0x80
  50.     mov [esp+4], eax              ;длина вводимого сообщения
  51. ret
  52.  
  53. .translate:                         ;перевод из символов в число
  54.     mov ebx, 10
  55.     mov ecx, [esp+4]
  56.     dec ecx                     ;убираем символ переноса строки
  57.     mov esi, string         ;адрес массива стринг
  58.     xor eax, eax            ;это как Х на доске
  59.     .perevod:
  60.         mul ebx             ;умножаем еах на 10
  61.         jc .b               ;проверка на переполнение
  62.         mov dl, [esi]      
  63.         sub dl, '0'         ;отнимаем код нуля
  64.         add eax, edx
  65.         inc esi
  66.     loop .perevod
  67.     mov [esp+8], eax                ;превратилось символы в число
  68.     jmp .end
  69.         .b:                 ;блок ошибки, в .fact есть проверка на 0
  70.         mov eax, 0
  71.         mov [esp+8], eax
  72.     .end:
  73. ret
  74.  
  75. .fact:
  76.     mov ecx, factor         ;адрес начала массива factor
  77.     mov eax, [esp+4]
  78.     mov ebx, 2
  79.     .e:
  80.         xor edx, edx
  81.         mov edi, eax        ;чтобы не портить число при возрате при делении
  82.         div ebx             ;остаток в edx
  83.         cmp edx, 0
  84.         jnz .r              ;если остаток не ноль
  85.         push eax            ;исходное число
  86.         push ebx
  87.         push edx
  88.         push edi
  89.         push ecx
  90.         mov eax, ebx        ;делитель
  91.         mov ebx, 10        
  92.         xor edi, edi
  93.         mov ecx, reverse
  94.         .y:                     ;переводим число в символы
  95.             xor edx, edx
  96.             div ebx
  97.             add edx, '0'
  98.             mov [ecx], dl
  99.             inc ecx         ;адрес reverse
  100.             inc edi         ;длина делителя
  101.             cmp eax, 0
  102.         jnz .y
  103.         push edi            ;запоминаем длину делителя
  104.         mov eax, ecx
  105.         dec eax             ; последний символ в реверсе
  106.         mov ecx, [esp+4]        ;адрес фактора
  107.         .h:                 ;переворачиваем делитель и записываем в фактор
  108.             mov bl, [eax]
  109.             mov [ecx], bl
  110.             dec eax
  111.             inc ecx
  112.             dec edi
  113.             cmp edi, 0
  114.         jnz .h
  115.         pop edi
  116.         pop ecx
  117.         add ecx, edi            ;увеличиваем адрес на длину
  118.         pop edi
  119.         pop edx
  120.         pop ebx
  121.         pop eax
  122.  
  123.         mov byte [ecx], '*'
  124.         inc ecx
  125.         jmp .w
  126.         .r:
  127.         mov eax, edi            ;восстанавливаем исходное число
  128.         inc ebx                 ;берем следующий делитель
  129.         xor edx, edx            ;обнулюем остаток
  130.         .w:
  131.         cmp eax, 1
  132.     jnz .e                  ;если еах не равно единице
  133.     mov byte [ecx-1], 0xa
  134.  
  135. ret
  136.  
  137. .write:
  138.     mov eax, 4
  139.     mov ebx, 1
  140.     mov ecx, factor
  141.     mov edx, 200
  142.     int 0x80
  143. ret
  144.  
  145. .error:
  146.     mov eax, 4
  147.     mov ebx, 1
  148.     mov ecx, error
  149.     mov edx, len1
  150.     int 0x80
  151. ret
  152.  
  153. .exit:
  154.   mov ebx, 0
  155.   mov eax, 1
  156.   int 80h
  157. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement