Схема Горнера. В чем ошибка? - 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

Объяснение кода листинга программы

Схема Горнера — это алгоритм деления с остатком, который используется для реализации арифметических операций с длинной арифметикой. В данном коде, возможно, реализуется алгоритм деления на основе этой схемы. Однако, в коде присутствуют некоторые ошибки:

  1. Переменная object объявлена как dd, что означает, что это 16-битное значение. Однако, в коде используется операция побитового сдвига, которая требует 32-битного значения.
  2. Переменная message объявлена как db, что означает, что это однобайтовый символ. Однако, в коде используется функция int 21h, которая ожидает, что message будет 16-битным значением.
  3. В цикле используются операции побитового сдвига и логические операции, которые работают с 32-битными значениями. Однако, в коде нет явного указания на это.
  4. В цикле отсутствует операция деления, которая является ключевой в алгоритме деления на основе схемы Горнера.
  5. В конце кода есть команда int 21h, которая, вероятно, предназначена для завершения программы. Однако, в коде нет команды для возврата в основную программу после завершения подпрограммы.
  6. В коде нет обработки ошибок или исключений, что может привести к непредсказуемому поведению программы при вводе некорректных данных.

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


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

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

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