Сумма делителей - Assembler

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

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

Привет. В задачке было 2 условия: (1) Кол-во делителей - я сделал, (2) Сумма делителей - я не сделал. Помогите пожалуйста с кодом именно для 2 условия, что нужно дополнить или как дописать Вот то, что я написал. Для 1 - ого условия оно работает( но кириллица сбилась почему-то :С )
%TITLE "‚*и Є®¬¬Ґ*в*аЁ© Їа®Ја*¬¬л"
INCLUDE IO.ASM
 
MODEL   small
ST1 SEGMENT             ;ЋЇЎ‘*«Ў ‘ҐЈ¬Ґ*’ ‘’ҐЄ*;
    DB 128 DUP(?)
ST1 ENDS
DATA SEGMENT
        A   dw  ?
    S   dw  ?
    k   dw  ?
    mess1 db 'a = $'
    mess2 db 'kol-vo delitelei : $'
    mess3 db 'summa delitelei : $'
    
DATA ENDS
CODE SEGMENT            ;®’Єђ›«Ў ‘ҐЈ¬Ґ*’ Є®¤*;
ASSUME SS:ST1,DS:DATA,CS:CODE    ;‘ўџ§*«Ў ђҐЈЎ‘’ђ®ў›Ґ ‘ҐЈ¬Ґ*’› ‘ ‘ҐЈ¬Ґ*’*¬Ў;
Start:
    push    ds
    sub ax, ax
    push    ax
    mov ax, data
    mov ds, ax
    lea     Dx, mess1
    outstr
    inint   ax
    mov     A,  ax
    mov bx, A
    mov cx, bx ; i
    xor si, si ; s
L1:
    mov     ax, bx ; ax := A
    cwd            ; а*биҐаЁвҐ«м ¤Ґ«Ё¬®Ј® dx:ax
    idiv        cx ; з*бв*®Ґ ў ax, ®бв*в®Є ў dx
    cmp dx, 0  ; or dx,dx ; if (dx = 0)
    jnz     L2     ; then    jnz  = > if net 0
    inc si     ; inc(s)
    
L2: loop    L1     ; for i := n downto 1; loop umpravlyet po cx
    mov     S,  si ; s:= si;
    lea Dx, mess2
    outstr
    outint  S
    newline

Exit:
    finish
ENDS
END Start
Помогите пожалуйста. До завтра надо сдать

Решение задачи: «Сумма делителей»

textual
Листинг программы
%TITLE "В*ш комме*т*рий прогр*ммы"
INCLUDE IO.ASM
MODEL   small
STK SEGMENT
    DB 128 DUP(?)
STK ENDS
DATA SEGMENT
    A   dw  ?
    S   dw  ?
    k   dw  ?
    mess1   db  'a = $'
    mess2   db  'kol-vo delitelei : $'
    mess3   db  'summa delitelei : $'
DATA ENDS
CODE SEGMENT
ASSUME  SS:STK,DS:DATA,CS:CODE
Start:
    mov ax,data
    mov ds,ax
    lea Dx,mess1
    outstr
    inint   ax
    mov A,ax
    mov cx,bx; i
    xor si,si; s
    xor di,di; k
L1:
    mov ax,A; ax := A
    cwd; рaсшеритель делимого dx:ax
    idiv    cx; чaстное в ax, остаток в dx
    or  dx,dx; if (dx = 0)
    jnz L2; then    jnz  = > if net 0
    inc si     ;inc(s)
    add di,cx
L2: loop    L1; for i := n downto 1; loop umpravlyet po cx
    mov S,si ; s:= si;
    mov K,di
    lea Dx,mess2
    outstr
    outint  S
    newline
    lea Dx,mess3
    outstr
    outint  K
    newline
Exit:
    finish
ENDS
END Start

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

  1. Объединение сегментов данных и кода
  2. Переменная A используется для хранения делимого числа
  3. Переменная CX используется для хранения количества итераций цикла
  4. Переменная BX используется для хранения делителя
  5. Переменная SI используется для хранения суммы делителей
  6. Переменная DI используется для хранения остатка от деления
  7. Цикл выполняется n раз, где n - количество делителей
  8. Если остаток от деления равен нулю, то цикл продолжается
  9. Переменная SI увеличивается на единицу после каждой итерации цикла
  10. Переменная DI увеличивается на CX после каждой итерации цикла
  11. После завершения цикла, переменная SI содержит сумму делителей
  12. Переменная S содержит сумму делителей
  13. Переменная K содержит количество делителей
  14. Вывод сообщения kol-vo delitelei : и числа S на экран
  15. Вывод сообщения summa delitelei : и числа K на экран
  16. Код завершается и выполняется функция finish
  17. Переменная DS содержит сегмент данных
  18. Переменная ES содержит сегмент данных
  19. Переменная AX используется для передачи информации в функцию outstr
  20. Переменная CX используется для передачи информации в функцию outint

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


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

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

8   голосов , оценка 4 из 5
Похожие ответы