Неправильное вычисление знаменателя (signed byte) - Assembler

Узнай цену своей работы

Формулировка задачи:

При компиляции ошибок нет. Числитель вычислен правильно, но знаменатель нет. Помогите, пожалуйста, выявить ошибку (signed byte)
.686
.MODEL FLAT, C
.data
extern shisl:dword,znam:dword,rez:dword
.CODE ;(44+c*d-15)/(a + c - 6)
 
myfunc PROC C aaaS:byte, bbbS:byte,cccS:byte
;shisl *******************************(aaaS+bbbS*cccS-1)/(aaaS/3+1)
    mov al, cccS
    imul bbbS
    mov dl, aaaS
    cbw
    add ax, dx
    sub ax, 1
    mov dx, 0
    ;mov word ptr shisl+2, dx
    mov word ptr shisl, ax
;znam *******************************(aaaS/3+1)
    mov al, aaaS
    cbw
    mov bl, 3
    idiv bl
    add al, 1
    cbw
    mov word ptr znam, ax
 
    mov dx, word ptr shisl+2
    mov ax, word ptr shisl
    idiv znam
    mov word ptr rez,ax
    ret
myfunc ENDP
 
END

Решение задачи: «Неправильное вычисление знаменателя (signed byte)»

textual
Листинг программы
    mov al, cccS
    imul bbbS
    mov dx, ax
    mov ax, aaaS
    cbw
    add ax, dx
    sub ax, 1
    mov dx, 0
    ;mov word ptr shisl+2, dx
    mov word ptr shisl, ax
;znam *******************************(aaaS/3+1)
    mov al, aaaS
    cbw
    mov bl, 3
    idiv bl
    add al, 1
    cbw
    mov word ptr znam, ax
 
    mov dx, word ptr shisl+2
    mov ax, word ptr shisl
    idiv word ptr znam
    mov word ptr rez,ax
    ret

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

  1. mov al, cccS - Загрузка значение переменной 'cccS' в регистр 'al'
  2. imul bbbS - Умножение 'al' на значение переменной 'bbbS'
  3. mov dx, ax - Перемещение результата в регистр 'dx'
  4. mov ax, aaaS - Загрузка значение переменной 'aaaS' в регистр 'ax'
  5. cbw - Преобразование беззнакового числа в знаковое
  6. add ax, dx - Прибавление результата умножения к 'ax'
  7. sub ax, 1 - Вычитание 1 из 'ax'
  8. mov dx, 0 - Установка 'dx' в 0
  9. mov word ptr shisl, ax - Сохранение значения 'ax' в переменной 'shisl'
  10. mov al, aaaS - Загрузка значение переменной 'aaaS' в регистр 'al'
  11. cbw - Преобразование беззнакового числа в знаковое
  12. mov bl, 3 - Загрузка значения 3 в регистр 'bl'
  13. idiv bl - Деление 'al' на 'bl'
  14. add al, 1 - Прибавление 1 к 'al'
  15. cbw - Преобразование беззнакового числа в знаковое
  16. mov word ptr znam, ax - Сохранение значения 'ax' в переменной 'znam'
  17. mov dx, word ptr shisl+2 - Загрузка старшего байта из переменной 'shisl' в 'dx'
  18. mov ax, word ptr shisl - Загрузка младшего байта из переменной 'shisl' в 'ax'
  19. idiv word ptr znam - Деление 'dx:ax' на 'znam'
  20. mov word ptr rez,ax - Сохранение результата деления в переменной 'rez'
  21. ret - Возврат из процедуры

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

9   голосов , оценка 4.222 из 5