Найти все четырёхзначные числа, удовлетворяющие условию - Assembler

Узнай цену своей работы

Формулировка задачи:

Народ, нужна помощь! Задача такая. Найти все четырёхзначные десятичные числа, у которых сумма первых двух цифр в два раза больше суммы правых двух цифр. Результат вывести в файл. Я сделал программу с выводом на экран, но не получается переделать под файл, если кто может помогите, пожалуйста исправить программу, чтобы результат выводился в файл. Так как я только начинаю изучать, поэтому может чего-то не понимаю.
Листинг программы
  1. .MODEL tiny; !!!!
  2. .486p
  3. .data
  4. thousand dw 1000
  5. hund db 100
  6. ten db 10
  7. S db ?
  8. car db ' ', '$'
  9. .code
  10. assume cs:@code, ds:@code, es: @code, ss: @code
  11. org 100h
  12. start:
  13. mov bx, 1000
  14. mov cx, 9000
  15. my_loop:
  16. mov ax, bx
  17. div hund
  18. ; al - частное, т.е., 2 левые цифры
  19. push ax
  20. xor ah, ah
  21. div ten
  22. add al, ah
  23. mov S, al ; в S - сумма двух крайних цифр слева
  24. pop ax
  25. ; ah - остаток, т.е., 2 правые цифры
  26. mov al, ah
  27. xor ah, ah
  28. div ten
  29. add al, ah
  30. add al, al
  31. cmp al, S
  32. jne next
  33. mov ax, bx ; Печатаем текущее число (print_n у меня печатает содержимое AX)
  34. call print_n
  35. mov ah, 09h
  36. mov dx, offset car
  37. int 21h
  38. next:
  39. inc bx
  40. loop my_loop
  41. mov ah,0
  42. int 16h
  43. mov ah,4ch
  44. int 21h
  45. print_n proc near ; процедура вывода числа от 0 до 9999, передаваемого через стек в десятичной форме
  46. push bp ; Все регистры сохраняются
  47. mov bp, sp ; Принимает один аргумент (число) размером в слово
  48. push ax
  49. push cx
  50. push dx
  51. ;mov ax, [bp+4] ; адрес этого числа в стеке для ближней модели (near)
  52. ; для дальней модели (far) заменить 4 на 6
  53. cmp ax, 1000
  54. jb short @@p100
  55. mov dx, 0
  56. mov cx,1000
  57. div cx ; в ax - частное, в dx - остаток
  58. push dx ; Запоминаем остаток для дальнейшего
  59. mov dl, al
  60. mov ah, 02h ; вывод тысяч, если они есть
  61. add dl, 30h ; символ цифры в регистре
  62. int 21h
  63. pop ax ; восстанавливаем остаток в ax
  64. jmp short @@p101 ; обходим ненужное сравнение
  65. @@p100:
  66. cmp ax, 100
  67. jb short @@p10
  68. @@p101:
  69. mov cl,100
  70. div cl ; Частное от деления на 100 в al, остаток в ah
  71. push ax
  72. mov dl, al
  73. add dl, 30h
  74. mov ah, 02h ; Вывод сотен, если они есть
  75. int 21h
  76. pop ax
  77. mov al, ah
  78. xor ah, ah
  79. jmp @@p11 ; обходим сравнение с 10
  80. @@p10: ; (будет правильно при отсутствии десятков)
  81. cmp al, 10
  82. jb short @@p0
  83. @@p11: mov cl, 10
  84. div cl ; Частное от деления на 10 в al, остаток в ah
  85. push ax
  86. mov dl, al
  87. add dl, 30h
  88. mov ah, 02h ; Вывод десятков, если они есть
  89. int 21h
  90. pop ax
  91. mov al, ah
  92. @@p0:
  93. mov ah, 02h ; Вывод единиц
  94. mov dl,al
  95. add dl, 30h
  96. int 21h
  97. pop dx
  98. pop cx
  99. pop ax
  100. mov sp, bp ; Восстановление указателя стека к моменту входа
  101. pop bp
  102. ret 0 ; очистка стека
  103. print_n endp
  104. end start

Решение задачи: «Найти все четырёхзначные числа, удовлетворяющие условию»

textual
Листинг программы
  1. model   tiny,pascal
  2. .code
  3. org 100h
  4. begin:  mov si,10
  5.     mov ah,3Ch
  6.     xor cx,cx
  7.     lea dx,dbName
  8.     int 21h
  9.     jc  @@02
  10.     mov dwHndl,ax
  11.     mov cx,9000
  12.     mov ax,1000
  13.     lea di,dbStr
  14. @@00:   call    Check
  15.     jc  @@01
  16.     inc ax
  17.     loop    @@00
  18. @@01:   mov ah,3Eh
  19.     lea bx,dwHndl
  20.     int 21h
  21. @@02:   ret
  22. dbStr   db  4 dup(?),' '
  23. Check   proc
  24. uses    ax,bx,cx,di
  25.     mov cx,2
  26. Chek:   call    Numb
  27.     xchg    bh,bl
  28.     loop    Chek
  29.     shl bh,1
  30.     xor bl,bh
  31.     jnz Exit
  32.     mov ah,40h
  33.     mov bx,dwHndl
  34.     mov cx,5
  35.     lea dx,dbStr
  36.     int 21h
  37. Exit:   ret
  38. Check   endp
  39. dwHndl  dw  ?
  40. dbName  db  '170522.txt',0
  41. Numb    proc
  42. uses    cx
  43.     mov cx,2
  44. @@03:   xor dx,dx
  45.     div si
  46.     add bx,dx
  47.     or  dl,'0'
  48.     mov [di],dl
  49.     inc di
  50.     loop    @@03
  51.     ret
  52. Numb    endp
  53.     end begin

Объяснение кода листинга программы

  1. Устанавливается модель кода tiny, pascal и точка входа программы begin
  2. В переменную si загружается значение 10
  3. В регистр ah загружается значение 3Ch
  4. Регистр cx обнуляется
  5. Адрес переменной dbName загружается в регистр dx
  6. Вызывается прерывание 21h для открытия файла
  7. Если произошла ошибка при открытии файла, то программа переходит на метку @@02
  8. Иначе, в переменную dwHndl загружается значение, полученное в результате открытия файла
  9. В регистр cx загружается значение 9000, в ax - 1000
  10. Адрес переменной dbStr загружается в регистр di
  11. Вызывается процедура Check
  12. Если процедура вернула значение carry flag (CF), программа переходит на метку @@01
  13. Иначе, увеличивается значение переменной ax и происходит повторение цикла @@00
  14. Производится запись результата в файл
  15. Программа возращается по адресу @@02
  16. Процедура завершается В этой программе происходит открытие файла, где в файле 170522.txt хранятся четырёхзначные числа. После открытия файла происходит проверка чисел, удовлетворяющих некоторому условию, и результат записывается в файл.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы