Схема Горнера. В чем ошибка? - Assembler
Формулировка задачи:
Программа реализует ввод числа 8-ричной системы счисления. Результат смотрю в watches. Если ввожу 3,4,5,6 - разрядное число, то отображает верно (смотрю по переводу в 10-ную системы в watches), а если ввожу число начиная с 7-ми разрядов, то перевод в 10-ную систему уже не верный. Почему? Чтобы изменить количество разрядов, которые ввожу, меняю только счетчик cx.
TITLE lab7 .Model Small .STACK 100h .186 ;чтобы можно было производить побитовый сдвиг более чем на 1 бит .data object dw ? message db 10,13,'vvod cifri $' .code begin: mov ax,@data ;загрузка сегмента данных mov ds,ax lea bx,object mov object,0 mov cx,7 ;т.к. вводимое число состоит из 3-х цифр m1: mov ah,09; настройка на печать lea dx,message;печать сообщения int 21h mov ah,01;настройка на ввод символа int 21h cmp al,30h;сравнение введенyой цифры с 0 jb m1 cmp al,37h;сравнение введенyой цифры с 7 ja m1 shl word ptr[bx],3;побитовый сдвиг на 3 позиции влево sub al,30h; т.к. в таблице ASCII код цифры опережает ее саму на 30 xor ah,ah; чистим регистр ah add word ptr[bx],ax loop m1 mov ax,4C00h int 21h end begin
Решение задачи: «Схема Горнера. В чем ошибка?»
textual
Листинг программы
TITLE lab7 .Model Small .STACK .386 ;чтобы можно было производить побитовый сдвиг более чем на 1 бит .data object dd 0 message db 10,13,'vvod cifri $' .code begin: mov ax, @data ;загрузка сегмента данных mov ds, ax lea si, object mov bx, 0901h mov cx, 7 ;т.к. вводимое число состоит из 3-х цифр lea dx,message ;печать сообщени @@: mov ah, bh ; настройка на печать int 21h mov ah, bl ;настройка на ввод символа int 21h sub al, 30h ;сравнение введенyой цифры с 0 jb @B cmp al, 7h ;сравнение введенyой цифры с 7 ja @B shl dword ptr[si],3 ;побитовый сдвиг на 3 позиции влево or [si],al loop @B mov ax,4C00h int 21h end begin
Объяснение кода листинга программы
Схема Горнера — это алгоритм деления с остатком, который используется для реализации арифметических операций с длинной арифметикой. В данном коде, возможно, реализуется алгоритм деления на основе этой схемы. Однако, в коде присутствуют некоторые ошибки:
- Переменная
object
объявлена какdd
, что означает, что это 16-битное значение. Однако, в коде используется операция побитового сдвига, которая требует 32-битного значения. - Переменная
message
объявлена какdb
, что означает, что это однобайтовый символ. Однако, в коде используется функцияint 21h
, которая ожидает, чтоmessage
будет 16-битным значением. - В цикле используются операции побитового сдвига и логические операции, которые работают с 32-битными значениями. Однако, в коде нет явного указания на это.
- В цикле отсутствует операция деления, которая является ключевой в алгоритме деления на основе схемы Горнера.
- В конце кода есть команда
int 21h
, которая, вероятно, предназначена для завершения программы. Однако, в коде нет команды для возврата в основную программу после завершения подпрограммы. - В коде нет обработки ошибок или исключений, что может привести к непредсказуемому поведению программы при вводе некорректных данных.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д