ХАНДЫФАР

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

  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 ___dx
  22. ________push ___si
  23. ________xor ____ax, ax
  24. ________xor ____bx, bx
  25. ____FindLoop:
  26. ________lodsb
  27. ________cmp ____al, 24h
  28. ________je _____Finish
  29. ________cmp ____al, 31h
  30. ________jb _____FindLoop
  31. ________cmp ____al, 39h
  32. ________ja _____FindLoop
  33. ________and ____al, 0Fh
  34. ________add ____bx, ax
  35. ________jmp ____FindLoop
  36. ____Finish:
  37. ________test ___bx, bx
  38. ________jnz ____HasNumbers
  39. ________mov ____ah, 02h
  40. ________mov ____dl, 30h
  41. ________int ____21h
  42. ________jmp ____Done
  43. ____HasNumbers:
  44. ________xchg ___ax, bx
  45. ________aam
  46. ________or _____ax, 3030h
  47. ________xchg ___ax, bx
  48. ________mov ____ah, 02h
  49. ________cmp ____bh, 30h
  50. ________jz _____PrintOneNumber
  51. ________mov ____dl, bh
  52. ________int ____21h
  53. ____PrintOneNumber:
  54. ________mov ____dl, bl
  55. ________int ____21h
  56. ____Done:
  57. ________pop ____si
  58. ________pop ____dx
  59. ________pop ____bx
  60. ________pop ____ax
  61. ________ret
  62. ____FindNumber endp
  63. code ends
  64. 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______________; Вызываем прерывание
  16. ____main endp ___________________; Конец процедуры main
  17. ____FindNumber proc______________; Начало процедуры FindNumber
  18. ________push ___ax_______________; Сохраняем значение регистра ax в стеке
  19. ________push ___bx_______________; Сохраняем значение регистра bx в стеке
  20. ________push ___dx_______________; Сохраняем значение регистра dx в стеке
  21. ________push ___si_______________; Сохраняем значение регистра si в стеке
  22. ________xor ____ax, ax___________; Обнуляем значение регистра ax
  23. ________xor ____bx, bx___________; Обнуляем значение регистра bx
  24. ____FindLoop:
  25. ________lodsb____________________; Загружаем байт из регистра si в регистр al
  26. ________cmp ____al, 24h__________; Сравниваем значение в регистре al с 24h - '$'
  27. ________je _____Finish___________; Если ZF=1, то прыгаем на метку Finish
  28. ________cmp ____al, 31h__________; Сравниваем значение в регистре al с ASCII значением 1
  29. ________jb _____FindLoop_________; Если значение в al ниже чем 1, то прыгаем на метку FindLoop
  30. ________cmp ____al, 39h__________; Сравниваем значение в регистре al с ASCII значением 9
  31. ________ja _____FindLoop_________; Если значение в al выше чем 9, то прыгаем на метку FindLoop
  32. ________and ____al, 0Fh__________; Применяем маску, где обнуляем старший полубайт регистра al
  33. ________add ____bx, ax___________; Прибавляем значение в регистре ax к значению в регистре bx
  34. ________jmp ____FindLoop_________; Выполняем безусловный переход на метку FindLoop
  35. ____Finish:
  36. ________test ___bx, bx___________; Проверяем значение регистра bx на 0
  37. ________jnz ____HasNumbers_______; Если ZF=0, то прыгаем на метку HasNumbers
  38. ________mov ____ah, 02h__________; Копируем значение функции вывода на консоль в регистр ah
  39. ________mov ____dl, 30h__________; Копируем ASCII значение 0 регистре dl
  40. ________int ____21h______________; Вызываем прерывание
  41. ________jmp ____Done_____________; Выполняем безусловный переход на метку Done
  42. ____HasNumbers:
  43. ________xchg ___ax, bx___________; Выполняем обмен содержимого регистров ax и bx
  44. ________aam______________________; Создаём пару распакованных значений BCD (основание 10)
  45. ________or _____ax, 3030h________; Выполняем преобразование значения в регистре ax в ASCII число
  46. ________xchg ___ax, bx___________; Выполняем обмен содержимого регистров ax и bx
  47. ________mov ____ah, 02h__________; Копируем значение функции вывода на консоль в регистр ah
  48. ________cmp ____bh, 30h__________; Сравниваем значение в регистре bh с ASCII значением 0
  49. ________jz _____PrintOneNumber___; Если ZF=1, то прыгаем на метку PrintOneNumber
  50. ________mov ____dl, bh___________; Копируем значение регистра bh в регистр dl
  51. ________int ____21h______________; Вызываем прерывание
  52. ____PrintOneNumber:
  53. ________mov ____dl, bl___________; Копируем значение регистра bl в регистр dl
  54. ________int ____21h______________; Вызываем прерывание
  55. ____Done:
  56. ________pop ____si_______________; Выталкиваем значение из стека в регистр si
  57. ________pop ____dx_______________; Выталкиваем значение из стека в регистр dx
  58. ________pop ____bx_______________; Выталкиваем значение из стека в регистр bx
  59. ________pop ____ax_______________; Выталкиваем значение из стека в регистр ax
  60. ________ret______________________; Возврат из процедуры
  61. ____FindNumber endp______________; Конец процедуры FindNumber
  62. code ends _______________________; Конец сегмента кода
  63. end main ________________________; Конец файла. Точкой входа указывается процедура main
















8E D8

8D 36 0000__


B8 4C00
CD 21



50
53
52
56

33 C0
33 DB


AC

3C 24
74 0E

3C 31
72 F7

3C 39
77 F3

24 0F
03 D8
EB ED


85 DB
75 09

B4 02
B2 30
CD 21
EB 17 90


93
D4 0A
0D 3030
93

B4 02

80 FF 30
74 04

8A D7
CD 21


8A D3
CD 21


5E
5A
5B
58
C3
Made on
Tilda