Циклы в 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
Объяснение кода листинга программы
- Объявлены переменные:
- A, S, k - в сегменте данных (переменная A содержит делимое, S - частное, k - остаток от деления);
- mess1, mess2, mess3 - в сегменте данных (строки для вывода на экран).
- Задано значение регистра CX, равное количеству итераций цикла.
- Выполняется цикл по i от n до 1.
- На каждой итерации:
- Делимое помещается в регистр A.
- Делимое и частное при делении на i (без остатка) помещаются в регистр CX.
- Если остаток от деления не равен нулю (то есть, i не является делителем), то выполняется следующая итерация.
- В противном случае (если i является делителем), увеличивается счетчик S и остаток от деления помещается в регистр K.
- После завершения цикла выводится на экран сообщение с количеством делителей, а затем выводится количество итераций цикла.
- Завершается выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д