ХАНДЫФАР

Программа, которая находит числа в строке и вычисляет их сумму.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db "I was born in 1988, "
  6. ___________db "March 17$"
  7. data ends
  8. code segment public
  9. ____assume ds:data, cs:code
  10. ____main proc
  11. ________mov ____ax, seg data
  12. ________mov ____ds, ax
  13. ________lea ____si, ds:[string]
  14. ________call ___FindNumber
  15. ________mov ____ax, 4C00h
  16. ________int ____21h
  17. ____main endp
  18. ____FindNumber proc
  19. ________push ___ax
  20. ________push ___bx
  21. ________push ___cx
  22. ________push ___dx
  23. ________push ___si
  24. ________xor ____ax, ax
  25. ________xor ____cx, cx
  26. ____FindLoop:
  27. ________lodsb
  28. ________cmp ____al, 24h
  29. ________je _____Finish
  30. ________cmp ____al, 30h
  31. ________jb _____FindLoop
  32. ________cmp ____al, 39h
  33. ________ja _____FindLoop
  34. ________and ____al, 0Fh
  35. ________add ____cx, ax
  36. ________jmp ____FindLoop
  37. ____Finish:
  38. ________test ___cx, cx
  39. ________jnz ____HasNumbers
  40. ________mov ____ah, 02h
  41. ________mov ____dl, 30h
  42. ________int ____21h
  43. ________jmp ____Done
  44. ____HasNumbers:
  45. ________xchg ___ax, cx
  46. ________aam
  47. ________or _____ax, 3030h
  48. ________xchg ___ax, bx
  49. ________mov ____ah, 02h
  50. ________cmp ____bh, 30h
  51. ________jz _____PrintOneNumber
  52. ________mov ____dl, bh
  53. ________int ____21h
  54. ____PrintOneNumber:
  55. ________mov ____dl, bl
  56. ________int ____21h
  57. ____Done:
  58. ________pop ____si
  59. ________pop ____dx
  60. ________pop ____cx
  61. ________pop ____bx
  62. ________pop ____ax
  63. ________ret
  64. ____FindNumber endp
  65. code ends
  66. end main
Программа, которая находит числа в строке и вычисляет их сумму.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db "I was born in 1988, March 17$"
  6. data ends
  7. code segment public _____________; Начало сегмента кода
  8. ____assume ds:data, cs:code
  9. ____main proc ___________________; Начало процедуры main
  10. ________mov ____ax, seg data_____; Получаем адрес сегмента памяти данных и сохраняем его в ax
  11. ________mov ____ds, ax___________; Передаём адрес сегмента памяти данных из регистра ax в ds
  12. ________lea ____si, ds:[string]__; Загружаем адрес переменной string в регистр ds:si
  13. ________call ___FindNumber_______; Вызываем процедуру FindNumber
  14. ________mov ____ax, 4C00h________; Копируем значение функции завершения в ah а значение в al
  15. ________int ____21h______________; Вызываем прерывание DOS
  16. ____main endp ___________________; Конец процедуры main
  17. ____FindNumber proc______________; Начало процедуры FindNumber
  18. ________push ___ax_______________; Сохраняем значение регистра ax в стеке
  19. ________push ___bx_______________; Сохраняем значение регистра bx в стеке
  20. ________push ___cx_______________; Сохраняем значение регистра cx в стеке
  21. ________push ___dx_______________; Сохраняем значение регистра dx в стеке
  22. ________push ___si_______________; Сохраняем значение регистра si в стеке
  23. ________xor ____ax, ax___________; Обнуляем значение регистра ax
  24. ________xor ____cx, cx___________; Обнуляем значение регистра cx
  25. ____FindLoop:
  26. ________lodsb____________________; Загружаем байт из регистра si в регистр al
  27. ________cmp ____al, 24h__________; Сравниваем значение в регистре al с 24h - '$'
  28. ________je _____Finish___________; Если ZF=1, то прыгаем на метку Finish
  29. ________cmp ____al, 30h__________; Сравниваем значение в регистре al с ASCII значением 0
  30. ________jb _____FindLoop_________; Если значение в al ниже чем 0, то прыгаем на метку FindLoop
  31. ________cmp ____al, 39h__________; Сравниваем значение в регистре al с ASCII значением 9
  32. ________ja _____FindLoop_________; Если значение в al выше чем 9, то прыгаем на метку FindLoop
  33. ________and ____al, 0Fh__________; Применяем маску, где обнуляем старший полубайт регистра al
  34. ________add ____cx, ax___________; Прибавляем значение в регистре ax к значению в регистре cx
  35. ________jmp ____FindLoop_________; Выполняем безусловный переход на метку FindLoop
  36. ____Finish:
  37. ________test ___cx, cx
  38. ________jnz ____HasNumbers
  39. ________mov ____ah, 02h__________; Копируем значение функции вывода на консоль в регистр ah
  40. ________mov ____dl, 30h__________; Копируем ASCII значение 0 регистре dl
  41. ________int ____21h______________; Вызываем прерывание DOS
  42. ________jmp ____Done_____________; Выполняем безусловный переход на метку Done
  43. ____HasNumbers:
  44. ________xchg ___ax, cx___________; Выполняем обмен содержимого регистров ax и cx
  45. ________aam______________________; Создаём пару распакованных значений BCD (основание 10)
  46. ________or _____ax, 3030h________; Выполняем преобразование значения в регистре ax в ASCII число
  47. ________xchg ___ax, bx___________; Выполняем обмен содержимого регистров ax и bx
  48. ________mov ____ah, 02h__________; Копируем значение функции вывода на консоль в регистр ah
  49. ________cmp ____bh, 30h__________; Сравниваем значение в регистре bh с ASCII значением 0
  50. ________jz _____PrintOneNumber
  51. ________mov ____dl, bh___________; Копируем значение регистра bh в регистр dl
  52. ________int ____21h______________; Вызываем прерывание DOS
  53. ____PrintOneNumber:
  54. ________mov ____dl, bl___________; Копируем значение регистра bl в регистр dl
  55. ________int ____21h______________; Вызываем прерывание DOS
  56. ____Done:
  57. ________pop ____si_______________; Выталкиваем значение из стека в регистр si
  58. ________pop ____dx_______________; Выталкиваем значение из стека в регистр dx
  59. ________pop ____cx_______________; Выталкиваем значение из стека в регистр cx
  60. ________pop ____bx_______________; Выталкиваем значение из стека в регистр bx
  61. ________pop ____ax_______________; Выталкиваем значение из стека в регистр ax
  62. ________ret______________________; Возврат из процедуры
  63. ____FindNumber endp______________; Конец процедуры FindNumber
  64. code ends _______________________; Конец сегмента кода
  65. end main ________________________; Конец файла. Точкой входа указывается процедура main
















8E D8

8D 36 0000__


B8 4C00
CD 21



50
53
51
52
56

33 C0
33 C9


AC

3C 24
74 0E

3C 30
72 F7

3C 39
77 F3

24 0F
03 C8
EB ED


85 C9
75 09

B4 02
B2 30
CD 21
EB 17 90


91
D4 0A
0D 3030
93

B4 02

80 FF 30
74 04

8A D7
CD 21


8A D3
CD 21


5E
5A
59
5B
58
C3
Made on
Tilda