Bupycnet

Untitled

Dec 7th, 2014
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.46 KB | None | 0 0
  1. .model small, stdcall
  2. .data
  3. sum dw 1000 dup (0)
  4. crlf db 13,10,'$'
  5. msg1 db 'Input number: $'
  6. buf db 8,10 dup(0) ;принимает строку, введенную с клавиатуры
  7. .stack 1024
  8. .code
  9. start:
  10. mov ax,@data ;Настраиваем сегментные регистры
  11. mov ds,ax
  12. mov ah,9 ;функция вывода сообщения на экран
  13. lea dx,msg1 ;выводимое сообщение
  14. int 21h ;выводим на экран
  15. mov ah,0ah ;функция ввода строки с клавиатуры
  16. mov dx,offset buf ;буфер куда вводить
  17. int 21h ;пользователь вводит в текстовом виде в buf значение числа
  18. lea si,buf[2] ;начало введенного текста
  19. ;Преобразование строки в число
  20. ;на входе ds:si ссылается на ASCII строку, которую нужно преобразовать
  21. ;на выходе в ax - число.
  22. xor dx,dx ;сумма
  23. @lp1: xor ax,ax
  24. lodsb ;берем символ
  25. cmp al,13 ;если это конец строки,
  26. jz @ex ;то заканчиваем
  27. cmp al,'9' ;если это не цифра,
  28. jnbe @lp1 ;то пропускаем
  29. cmp al,'0' ;если это не цифра,
  30. jb @lp1 ;то пропускаем
  31. sub ax,'0' ;получаем цифровое значение
  32. shl dx,1 ;умножаем сумму на 10
  33. add ax, dx
  34. shl dx, 2
  35. add dx, ax ;прибавляем текущее значение
  36. jmp @lp1 ;продолжаем обработку
  37. @ex: mov di,dx ;помещаем результат в di
  38. mov ah,9 ;функция вывода сообщения на экран
  39. lea dx,crlf ;выводимое сообщение
  40. int 21h ;выводим на экран
  41.  
  42. call print,di,0,0
  43. mov ah,1 ;Ожидаем нажатия любой клавиши
  44. int 21h
  45. mov ax,4c00h ;закончить программу
  46. int 21h
  47. ;left - остаток числа
  48. ;min - минимальное число разложения
  49. ;i - индекс числа в массиве
  50. print proc left:word, min:word, i:word
  51. cmp left,0 ;если остаток числа 0
  52. jl fp ;закончить разложение
  53. cmp min,di ;если минимальное число суммы=самому числу
  54. jz fp ;закончить разложение
  55. mov bx,i ;индекс числа
  56. shl bx,1 ;получить смещение в массиве
  57. mov ax,min ;взять минимальное число разложения
  58. mov sum[bx],ax ;и сохранить в массиве под i-м индексом
  59. cmp min,0 ;если минимальное число разложения=0
  60. jz sk1 ;то пропустить
  61. mov ax,left ;остаток числа
  62. sub ax,min ;остаток числа-минимальное число разложения
  63. mov cx,i ;индекс числа в массиве
  64. inc cx ;i+1
  65. call print,ax,min,cx ;print(left - min, min, i + 1);
  66. sk1: mov ax,left ;остаток числа
  67. dec ax ;left - 1
  68. mov cx,min ;min
  69. inc cx ;min+1
  70. call print,ax,cx,i ;print(left - 1, min + 1, i);
  71. cmp left,0 ;если остаток не 0
  72. jnz fp ;то пропустить
  73. ;если 0, вывести полученный массив слагаемых
  74. lea bx,sum ;начало массива A
  75. mov cx,0 ;текущий индекс массива (j)
  76. outmas: cmp cx,i ;если j>i
  77. ja sk2 ;то закончить вывод
  78. mov ax,[bx] ;берем элемент массива
  79. call printdec ;преобразовываем число в строку и выводим
  80. cmp cx,i ;если это последнее слагаемое
  81. jz sk3 ;то не выводим +
  82. mov ah,2 ;выводим символ
  83. mov dl,'+' ;разделительный +
  84. int 21h ;выводим
  85. sk3: add bx,2 ;переходим к следующему элементу массива
  86. inc cx ;увеличить индекс
  87. jmp outmas ;продолжаем вывод
  88. sk2: mov ah,9 ;функция вывода сообщения на экран
  89. lea dx,crlf ;выводимое сообщение
  90. int 21h ;выводим на экран
  91. fp: ret
  92. print endp
  93. ;преобразование числа из ах в десятичную строку и вывод на экран
  94. ;ax - число
  95. printdec proc
  96. push cx ;сохраняем регистры
  97. push dx
  98. push bx
  99. mov bx,10 ;основание системы
  100. xor cx,cx ;в сх будет количество цифр в десятичном числе
  101. @@m1a: xor dx,dx ;очистить старшую часть делимого
  102. div bx ;делим число на степени 10
  103. push dx ;и сохраняем остаток от деления(коэффициенты при степенях) в стек
  104. inc cx ;увеличиваем количество десятичных цифр числа
  105. test ax,ax ;после деления остался 0?
  106. jnz @@m1a ;если нет, продолжаем
  107. mov ah,2 ;ф-я вывода символа
  108. @@m2a: pop dx ;взять из стека цифру цисла
  109. add dl,'0' ;преобразовываем цифру в ASCII символ
  110. int 21h ;вывести на экран
  111. loop @@m2a ;все цифры
  112. pop bx ;восстанавливаем регистры
  113. pop dx
  114. pop cx
  115. ret ;выход из подпрограммы
  116. printdec endp
  117. end start
Advertisement
Add Comment
Please, Sign In to add comment