Количество делителей натурального числа - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д