Количество делителей натурального числа - Assembler

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

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

;Программа отказывается работать, если кто знает может предложит более удобный или работающий код, но все таки хотелось бы разобраться с этим. Проблема возникает на метке com а конкретно на команде div ( пишет деление на 0 и зависает)
text segment 'code'
assume CS:text,DS:data
 
begin: mov ax,data
       mov ds,ax
       mov AH,09h
       mov DX,offset message
       int 21h
       mov AH,09h
       mov DX,offset caret
       int 21h 
       mov ah,0ah   
       xor di,di
       mov dx,offset buff ; аддрес буфера
       int 21h ; принимаем строку
       mov dl,0ah
       mov ah,02
       int 21h ; вывод перевода строки
       mov si,offset buff+2
       xor ax,ax
       xor dx,dx
       mov bx,0Ah
 in2:
       inc DX
       mov cl,[si] ; берем символ из буфера
       cmp cl,0dh  ; проверяем не последний ли он
       jz com
       cmp cl,30h  ; если введен неверный символ <0
       jl er
       cmp cl,39h  ; если введен неверный символ >9
       ja er 
       cmp dx,1
       jz prov     ;проверка введения 0 в начале    
       cmp dx,1
       jne match    
 match:        
       sub cl,30h  ;делаем из введенного символа число
       mul bx        ; умножаем на основание системы счисления = 10
       jc er       ; переполнение регистра
       add ax,cx     ;и прибавляем новое = сумма
       jc er       ; переполнение регистра
       inc si      ; указатель на следующий символ
       inc DX
jmp in2 
 
prov:
       cmp cl,30h
       je er
       jmp in2           
er:
       mov dx,offset caret        
       mov ah,9
       int 21h
       mov dx,offset error        
       mov ah,9
       int 21h
       mov dx,offset caret
       mov ah,9
       int 21h
       mov AH,4Ch
       mov AL,00h
       int 21h
    
com:
    xor CX,CX
    xor BX,BX
    push AX
prog:
    inc CX
    push CX
    div CX 
    cmp DX,0
    jz plus
    pop CX
    pop AX
    cmp AX,CX
    jz num 
 
plus:
    inc BX
    jmp prog
       
num:
  inc BX
  mov AX,BX
  xor cx,cx
  mov bx,0Ah
outp:
    xor DX, DX
    div BX
    push DX
    inc CX
    cmp AX, 00h
    jnz outp
  mov AH, 02h
 
out_num:    
    pop DX
  add dl,30h
    int 21h 
    loop out_num
  mov AH,4Ch
  mov AL,00h
  int 21h
 
  text ends
  data segment
  message db '  enter the number $'
  error db 'Symbol not correct or invalid input!$'
  caret db   0Ah,0Dh,'$'
  res db '  output  $'
data ends
stk Segment stack 'stack'
buff    dw 128 Dup(?)
stk ends
end begin

Решение задачи: «Количество делителей натурального числа»

textual
Листинг программы
model   tiny
.code
org 100h
begin:  mov ah,9
    lea dx,dbEnter
    int 21h
    xor di,di
    mov si,10
@@01:   xor ax,ax
    int 16h
    cmp al,13
    jz  @@02
    cmp al,'0'
    jb  @@01
    cmp al,'9'
    ja  @@01
    int 29h
    and ax,0fh
    xchg    di,ax
    xor dx,dx
    mul si
    add di,ax
    jmp short @@01
@@02:   mov ah,9
    lea dx,dbRes
    int 21h
    mov cx,di
@@03:   mov ax,di
    xor dx,dx
    div cx
    or  dx,dx
    jnz @@07
    mov ax,cx
    push    cx
    xor cx,cx
@@04:   xor dx,dx
    div si
    push    dx
    inc cx
    or  ax,ax
    jnz @@04
    mov ax,' '-'0'
@@05:   push    ax
    inc cx
    cmp cx,7
    jb  @@05
@@06:   pop ax
    add al,'0'
    int 29h
    loop    @@06
    pop cx
@@07:   loop    @@03
    ret
dbEnter db  10,13,'Enter number:$'
dbRes   db  10,13,'Result:$'
    end begin

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


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

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

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