Циклы в TASM - Assembler

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

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

Добрый вечер! Прошу вашей помощи с заданием, основанным на цикле. Может у кого-то завалялось похожее решение? Вот моё задание: Считать число (n). Проверить равна ли сумма его делителей самому числу n. Заранее спасибо.
Вот наброски мои:
lab0 segment
assume cs:lab0, ds:lab0, es:lab0, ss:lab0
org 100h
begin: jmp main
a db ?
b db ?
c db ?
d db ?
str0 label byte
max0 db 6
real0 db ?
date0 db 6 dup (0)
 
mesa db 0DH,0AH,'Vvedite nomer A: $'
mesd db 0DH,0AH,'Rezultat : $'
afish db 0,0,0,0,0,'$'
 
        cit label byte
        max db 1
        real db ?
        date db 0AH
 
    num_ASCII proc
        xor bx,bx
        mov bl,10
        lea si,afish+4
 
    e_p2:
    cmp ax,0
    je et_pst
    div bx
    add dx,30h
    mov [si],dl
    dec si
    xor dx,dx
    jmp e_p2
 
    et_pst: ret
    num_ASCII endp
 
    ASCII_num proc
        xor ax,ax
        xor cx,cx
        mov cl,real0
        lea si,date0
        xor bx,bx
        mov bl,10
 
    et_p1:
        xor dx,dx
        push cx
        mov cl, [si]
        sub cl,30h
        mul bx
        add ax,cx
        inc si
        pop cx
        loop et_p1
        ret
        ASCII_num endp
 
main:
;a
    mov ah,9
    mov dx, offset mesa
    int 21h
 
    mov ah,0Ah
    mov dx, offset str0
    int 21h
 
    call ASCII_num
    mov a,al
 
;main kod
 
;/
 
    call num_ASCII
    mov ah,9
    mov dx,offset mesd
    int 21h
 
    mov ah,9
    lea dx,afish
    int 21h
 
    mov ah,0Ah
    mov dx,offset cit
    int 21h
ret
lab0 ends
end begin

Решение задачи: «Циклы в TASM»

textual
Листинг программы
%TITLE "В*ш комме*т*рий прогр*ммы"
INCLUDE IO.ASM
MODEL   small
org 100h
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. Объявлены переменные:
    • A, S, k - в сегменте данных (переменная A содержит делимое, S - частное, k - остаток от деления);
    • mess1, mess2, mess3 - в сегменте данных (строки для вывода на экран).
  2. Задано значение регистра CX, равное количеству итераций цикла.
  3. Выполняется цикл по i от n до 1.
  4. На каждой итерации:
    • Делимое помещается в регистр A.
    • Делимое и частное при делении на i (без остатка) помещаются в регистр CX.
    • Если остаток от деления не равен нулю (то есть, i не является делителем), то выполняется следующая итерация.
    • В противном случае (если i является делителем), увеличивается счетчик S и остаток от деления помещается в регистр K.
  5. После завершения цикла выводится на экран сообщение с количеством делителей, а затем выводится количество итераций цикла.
  6. Завершается выполнение программы.

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


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

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

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