Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .386
  2. .model flat, stdcall
  3.  
  4. ; прототипы внешних процедур описываются директивой extrn,
  5. ; после знака @ указывается общая длина передаваемых параметров,
  6. ; после двоеточия указывается дистанция «ближняя» – near
  7. extrn  GetStdHandle@4:near
  8. extrn  WriteConsoleA@20:near
  9. extrn  CharToOemA@8:near
  10. extrn  ReadConsoleA@20:near
  11. extrn  ExitProcess@4:near ; функция выхода из программы
  12. extrn  lstrlenA@4:near ; функция определения длины строки
  13.  
  14. ; сегмент данных
  15. .data
  16. sos db ?
  17. dout dd ? ; дескриптор вывода (директива dd резервирует память объемом 32 бита (4 байта))
  18. din dd ? ; дескриптор ввода
  19. strn db "введите число: ",13,10,0 ; выводимая строка,
  20. ; управляющие символы: 13 – возврат каретки, 10 – переход на новую строку, 0 – конец строки
  21. ; (с использованием директивы db резервируется массив байтов)
  22. buf  db 200 dup (?); буфер для вводимых/выводимых строк
  23. lens dd ? ; количество выведенных символов
  24. ;два вводимых числа
  25. numa dd ?
  26. numb dd ?
  27.  
  28. ; сегмент кода
  29. .code
  30. start: ; метка точки входа (завершается двоеточием)
  31.  
  32. ; перекодируем строку strn
  33. push offset strn ; параметры функции помещаются в стек командой
  34. ; offset – операция, возвращающая смещение
  35. push offset strn
  36. call CharToOemA@8 ; вызов функции
  37.  
  38. ; получим дескриптор ввода
  39. push -10
  40. call GetStdHandle@4
  41. mov din, eax ; переместить результат из регистра eax в ячейку памяти с именем din
  42.  
  43. ; получим дескриптор вывода
  44. push -11
  45. call GetStdHandle@4
  46. mov dout, eax
  47.  
  48. ; вывод строки
  49. push offset strn ; в стек помещается указатель на строку
  50. call lstrlenA@4 ; длина в eax
  51. ; вызов функции writeconsolea для вывода строки strn
  52. push 0 ; в стек помещается 5-й параметр
  53. push offset lens ; 4-й параметр
  54. push eax ; 3-й параметр
  55. push offset strn ; 2-й параметр
  56. push dout ; 1-й параметр
  57. call WriteConsoleA@20
  58.  
  59. ; ввод строки
  60. push 0 ; в стек помещается 5-й параметр
  61. push offset lens ; 4-й параметр
  62. push 200 ; 3-й параметр
  63. push offset buf ; 2-й параметр
  64. push din ; 1-й параметр
  65. call ReadConsoleA@20
  66.  
  67. ; обработка 1 строки
  68. xor eax, eax
  69. push offset buf
  70. sub lens, 2
  71. mov ecx, lens
  72. mov esi,offset buf ; начало строки хранится в переменной buf
  73. xor ebx,ebx ; очистить ebx
  74. xor eax,eax ; очистить eax
  75. mov bl,[esi]
  76. mov sos,1
  77. cmp bl,'-'
  78. je @ifnot
  79. mov sos,0
  80. inc esi
  81. @ifnot
  82. convert: ; метка начала цикла
  83.     xor edx, edx ; очистить edx
  84.     mov dl, 10 ; на это число будем умножать, делаем в цикле т.к. при умножении dx затирается
  85.     mov bl, [esi] ; помещаем символ из введенной строки в bl
  86.     .if(bl!='-')
  87.     sub bl, '0' ; вычитаем из введенного символа код нуля
  88.     mul edx ; умножаем старое значение bx на 10, результат – в ax
  89.     add eax, ebx ; добавить к полученному числу новое значение  
  90.     .endif
  91.     inc esi ; перейти на следующую строку
  92. loop convert ; новая итерация цикла
  93. mov numa, eax
  94.  
  95. ; вывод строки
  96. push offset strn ; в стек помещается указатель на строку
  97. call lstrlenA@4
  98. push 0 ; в стек помещается 5-й параметр
  99. push offset lens ; 4-й параметр
  100. push eax ; 3-й параметр
  101. push offset strn ; 2-й параметр
  102. push dout ; 1-й параметр
  103. call WriteConsoleA@20
  104.  
  105. ; ввод строки
  106. push 0 ; в стек помещается 5-й параметр
  107. push offset lens ; 4-й параметр
  108. push 200 ; 3-й параметр
  109. push offset buf ; 2-й параметр
  110. push din ; 1-й параметр
  111. call ReadConsoleA@20
  112.  
  113. ; обработка 2 строки
  114. xor eax, eax
  115. push offset buf
  116. sub lens, 2
  117. mov ecx, lens
  118. mov esi,offset buf ; начало строки хранится в переменной buf
  119. xor ebx, ebx ; очистить ebx
  120. xor eax, eax ; очистить eax
  121. mov bl,[esi]
  122. cmp bl,'-'
  123. jne @end
  124. cmp sos,0
  125. jne @ifnot
  126. mov sos,1
  127. inc esi
  128. @ifnot:
  129. mov sos,1
  130. inc esi
  131. @end:
  132. convertb: ; метка начала цикла
  133.     xor edx,edx ; очистить edx
  134.     mov dl, 10 ; на это число будем умножать, делаем в цикле т.к. при умножении dx затирается
  135.     mov bl, [esi] ; помещаем символ из введенной строки в bl
  136.     sub bl, '0' ; вычитаем из введенного символа код нуля
  137.     mul dx ; умножаем старое значение bx на 10, результат – в ax
  138.     add eax, ebx ; добавить к полученному числу новое значение  
  139.     inc esi ; перейти на следующую строку
  140. loop convertb ; новая итерация цикла
  141. mov numb, eax
  142.  
  143. ; умножение чисел
  144. mov eax, numa
  145. mov ebx, numb
  146. mul ebx
  147. mov numa, eax
  148.  
  149. ; преобразование результата
  150. xor edi, edi
  151. mov edx, numa
  152. xor eax, eax
  153. mov ax, dx ; ax - младшая часть, dx - старшая
  154. shr edx, 16 ; сдвигаем первые 16 бит в право
  155. xor ecx, ecx
  156. mov ecx, 16
  157. mov esi, offset buf ; начало строки хранится в переменной buf
  158. mov ebx, edx
  159. shl ebx, 16 ; сдвигаем 16 бит влево
  160. mov bx, ax ; в ebx хранится полное число
  161. .while ebx>=ecx ; пока число > 16
  162.     div cx
  163.     add dx, '0'
  164.     .if dx>'9' ; если символ > 9, заменить на A,B,...
  165.         add dx, 7
  166.     .endif
  167.     push edx ; кладем данные в стек, для инвертирования
  168.     add edi, 1
  169.     xor edx, edx
  170.     xor ebx, ebx
  171.     mov bx, ax
  172. .endw
  173. add ax, '0'
  174. .if ax>'9'
  175.     add ax, 7
  176. .endif
  177. .if sos==0
  178.     add ax,'-'
  179. .endif
  180. push eax
  181. add edi, 1
  182. ; теперь инвертируем строку
  183. mov ecx, edi
  184. convertc:
  185.     pop [esi]
  186.     inc esi
  187. loop convertc
  188.  
  189. ; выводим результат
  190. push offset buf ; в стек помещается указатель на строку
  191. call lstrlenA@4
  192. push 0 ; в стек помещается 5-й параметр
  193. push offset lens ; 4-й параметр
  194. push eax ; 3-й параметр
  195. push offset buf ; 2-й параметр
  196. push dout ; 1-й параметр
  197. call WriteConsoleA@20
  198.  
  199. ; выход из программы
  200. push 0 ; параметр: код выхода
  201. call ExitProcess@4
  202. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement