Деление чисел - Assembler (223561)
Формулировка задачи:
Надо найти результат деления двух целых пятизначных чисел, которые представлены в десятичном формате. Числа ввести с клавиатуры, результат вывести в виде Z = XXX . XXX (целая часть.дробная часть).
Написал ввод с клавиатуры и некое подобие вывода на экран, а вот с делением пятизначных не очень понимаю, ведь у нас число может быть до 65535, а если пользователь введет 99999? В общем, помогите, пожалуйста.
Листинг программы
- .model small
- .stack 16h
- .data
- msgA db 'Enter A = ', '$ '
- msgB db 13,10,'Enter B = ', '$ '
- msg label byte ;массив для ввода символов
- maxnum db 6 ;длина массива
- reallen db ?
- numfld db 5 dup(30h)
- mult10 dw 0
- ascval db 10 dup(30h),13,10,'$' ;массив символов для вывода*
- x dw ? ;результат
- a dw 0 ;коэффициенты
- b dw 0
- z dw 0
- .code
- start: mov ax, @data
- mov ds, ax
- mov ah,9
- lea dx, msgA
- int 21H; просим ввести A
- mov ah,0AH
- lea dx,msg
- int 21H
- call asbin
- mov ax,z
- mov a,ax ; вводим A
- mov ah,9
- lea dx, msgB
- int 21H; просим ввести И
- mov ah,0AH
- lea dx,msg
- int 21H
- call asbin
- mov ax,z
- mov b,ax ; вводим B
- ;здесь должны быть вычисления
- call outp ; вывод результата на экран
- mov ah, 4ch
- int 21h
- asbin proc ; запись с клавиатуры
- mov mult10,0001
- mov z,0
- mov cx,10
- lea si,numfld-1
- mov bl,reallen
- sub bh,bh
- b20:
- mov al,[si+bx]
- and ax,000fh
- mul mult10
- add z,ax
- mov ax,mult10
- mul cx
- mov mult10,ax
- dec bx
- jnz b20
- ret
- asbin endp
- outp proc ; Начало тела процедуры "вывод"
- mov cx,10 ; система счисления
- lea si, ascval+9 ; Установка указателя на конец массива ascval
- mov ax, x ; Результат х занести в ax
- c20: cmp ax,10 ; Сравнить результат с числом 10
- jb c30 ; Если меньше то преобразовывать не надо
- xor dx,dx ; Очистка регистра dx для команды деления
- div cx ; Делим на 10
- or dl, 30h ; Преобразование остатка к ASCII коду
- mov [si], dl ; Занесение остатка от деления в массив ascval
- dec si ; Перемещение указателя массива на 1 байт влево
- jmp c20 ; Переход на начало для преобразования след. цифры
- c30: or al, 30h ; Если остаток меньше 10, то вывод результата на экран
- mov [si], al ; дисплея командами (см. ниже)
- lea dx, ascval ; Загрузка адреса массива
- mov ah, 9 ; Вызов 9-ой функции MS-DOS
- int 21h
- ret ; Возврат в головную программу из п/программы
- outp endp ; Конец процедуры
- end start
Вот уже даже с делением, но больше 32000 он не принимает
Листинг программы
- .model small
- .stack 16h
- .data
- msgA db 'Enter A = ', '$ '
- msgB db 13,10,'Enter B = ', '$ '
- msg5 db 13,10,'Result X = ', '$ '
- msg label byte ;массив для ввода символов
- maxnum db 6 ;длина массива
- reallen db ?
- numfld db 5 dup(30h)
- mult10 dw 0
- ascval db 10 dup(30h),13,10,'$' ;массив символов для вывода*
- x dw ? ;результат
- a dw 0 ;коэффициенты
- b dw 0
- z dw 0
- .code
- start: mov ax, @data
- mov ds, ax
- mov ah,9
- lea dx, msgA
- int 21H;
- mov ah,0AH
- lea dx,msg
- int 21H
- call asbin
- mov ax,z
- mov a,ax
- mov ah,9
- lea dx, msgB
- int 21H;
- mov ah,0AH
- lea dx,msg
- int 21H
- call asbin
- mov ax,z
- mov b,ax
- mov ah,9
- lea dx, msg5
- int 21H;
- mov bx, dx
- mov cx, ax
- mov ax, a
- mov dx,0
- idiv b
- mov x, ax
- call outp ; вывод результата на экран
- mov ah, 4ch
- int 21h
- asbin proc
- mov mult10,0001
- mov z,0
- mov cx,10
- lea si,numfld-1
- mov bl,reallen
- sub bh,bh
- b20:
- mov al,[si+bx]
- and ax,000fh
- mul mult10
- add z,ax
- mov ax,mult10
- mul cx
- mov mult10,ax
- dec bx
- jnz b20
- ret
- asbin endp
- outp proc ; Начало тела процедуры "вывод"
- mov cx,10 ; система счисления
- lea si, ascval+9 ; Установка указателя на конец массива ascval
- mov ax, x ; Результат х занести в ax
- c20: cmp ax,10 ; Сравнить результат с числом 10
- jb c30 ; Если меньше то преобразовывать не надо
- xor dx,dx ; Очистка регистра dx для команды деления
- div cx ; Делим на 10
- or dl, 30h ; Преобразование остатка к ASCII коду
- mov [si], dl ; Занесение остатка от деления в массив ascval
- dec si ; Перемещение указателя массива на 1 байт влево
- jmp c20 ; Переход на начало для преобразования след. цифры
- c30: or al, 30h ; Если остаток меньше 10, то вывод результата на экран
- mov [si], al ; дисплея командами (см. ниже)
- lea dx, ascval ; Загрузка адреса массива
- mov ah, 9 ; Вызов 9-ой функции MS-DOS
- int 21h
- ret ; Возврат в головную программу из п/программы
- outp endp ; Конец процедуры
- end start
Теперь до 65000
Листинг программы
- .model small
- .stack 16h
- .data
- msgA db 'Enter A = ', '$ '
- msgB db 13,10,'Enter B = ', '$ '
- msg5 db 13,10,'Result X = ', '$ '
- msg label byte ;массив для ввода символов
- maxnum db 6 ;длина массива
- reallen db ?
- numfld db 5 dup(30h)
- mult10 dw 0
- ascval db 10 dup(30h),13,10,'$' ;массив символов для вывода*
- x dw ? ;результат
- a dw 0 ;коэффициенты
- b dw 0
- c dw 1000
- z dw 0
- u dw 0
- .code
- start: mov ax, @data
- mov ds, ax
- mov ah,9
- lea dx, msgA
- int 21H;
- mov ah,0AH
- lea dx,msg
- int 21H
- call asbin
- mov ax,z
- mov a,ax
- mov ah,9
- lea dx, msgB
- int 21H;
- mov ah,0AH
- lea dx,msg
- int 21H
- call asbin
- mov ax,z
- mov b,ax
- mov ah,9
- lea dx, msg5
- int 21H;
- mov bx, dx
- mov cx, ax
- xor dx,dx
- mov ax, a
- idiv b
- mov x, ax
- ;mov ax,dx
- ;imul c
- ;idiv x
- ;mov u,ax
- call outp ; вывод результата на экран
- mov ah, 4ch
- int 21h
- asbin proc
- mov mult10,0001
- mov z,0
- mov cx,10
- lea si,numfld-1
- mov bl,reallen
- sub bh,bh
- b20:
- mov al,[si+bx]
- and ax,000fh
- mul mult10
- add z,ax
- mov ax,mult10
- mul cx
- mov mult10,ax
- dec bx
- jnz b20
- ret
- asbin endp
- outp proc ; Начало тела процедуры "вывод"
- mov cx,10 ; система счисления
- lea si, ascval+9 ; Установка указателя на конец массива ascval
- mov ax, x ; Результат х занести в ax
- c20: cmp ax,10 ; Сравнить результат с числом 10
- jb c30 ; Если меньше то преобразовывать не надо
- xor dx,dx ; Очистка регистра dx для команды деления
- div cx ; Делим на 10
- or dl, 30h ; Преобразование остатка к ASCII коду
- mov [si], dl ; Занесение остатка от деления в массив ascval
- dec si ; Перемещение указателя массива на 1 байт влево
- jmp c20 ; Переход на начало для преобразования след. цифры
- c30: or al, 30h ; Если остаток меньше 10, то вывод результата на экран
- mov [si], al ; дисплея командами (см. ниже)
- lea dx, ascval ; Загрузка адреса массива
- mov ah, 9 ; Вызов 9-ой функции MS-DOS
- int 21h
- ret ; Возврат в головную программу из п/программы
- outp endp ; Конец процедуры
- end start
Решение задачи: «Деление чисел»
textual
Листинг программы
- asbin proc ; Процедура ввода с клавиатуры
- mov mult10,0001
- mov z,0
- mov cx,10
- lea si,numfld-1
- mov bl,reallen
- sub bh,bh
- b20:
- mov al,[si+bx]
- and ax,000fh
- mul mult10
- cmp ax,'-' ;если минус, то
- jne b30
- mov dh,1 ;устанавливаем признак минуса
- sub ax,'-'
- jmp b20
- b30: add z,ax
- mov ax,mult10
- mul cx
- mov mult10,ax
- dec bx
- jnz b20
- test dh,dh ;если установлен признак отрицательного числа
- jne b40
- neg z ;то меняем знак
- b40: ret
- asbin endp
Объяснение кода листинга программы
- Процедура ввода с клавиатуры.
- Переменная mult10 содержит значение 10.
- Переменная z содержит результат деления.
- Переменная cx содержит количество разрядов числа.
- Переменная si содержит адрес поля ввода числа.
- Переменная bl содержит значение реального числа.
- Переменная bh содержит знак реального числа.
- Переменная ax содержит результат операции.
- Переменная dh содержит признак отрицательного числа.
- Переменная numfld содержит адрес поля ввода числа.
- При выходе из процедуры ввода, значение переменной z обновляется.
- Если введенное число отрицательное, то устанавливается признак отрицательного числа.
- Результат деления сохраняется в переменной z.
- Если введенное число не является числом, то процедура продолжается до тех пор, пока не будет введено число.
- Результат умножения числа на 10 сохраняется в переменной ax.
- Переменная mult10 обновляется значением ax.
- Уменьшается значение переменной bx на единицу.
- Если значение переменной bx больше нуля, то процедура продолжается до тех пор, пока не будет введено число.
- Если введенное число является отрицательным, то результат деления изменяется на противоположный.
- Конец процедуры ввода с клавиатуры.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д