Схема Горнера. В чем ошибка? - 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, которая, вероятно, предназначена для завершения программы. Однако, в коде нет команды для возврата в основную программу после завершения подпрограммы. - В коде нет обработки ошибок или исключений, что может привести к непредсказуемому поведению программы при вводе некорректных данных.