КУ
Константин Удаков

Люди, помогите с Ассемблером!!!

Помогите найти ошибку в коде
Мне надо посчитать по формуле (c + 4*d - 123)/(1 - a/2)

Тут используется С++ код и ассемблеровский, С++ код работает нормально, результат выводит. Суть в том чтобы результаты на С++ и ассемблера совпадали. Но когда запускается из модуля С++ функции Lab3S и Lab3I (ассемблеровские модули) программа пишет ошибку деления, помогите разобраться, очень нужно.

Код программы:
title Lab3asm.asm
.MODEL Small, C
.data

Extrn C Numerator:Dword
Extrn C aS:Byte, ccS:Byte, dds:Byte
Extrn C xI:Word, aI:Word, cI:Word, ddI:Word
Extrn C Denominator:Word

.code
Public C Lab3S
Lab3S proc far
;Znamenatel*******************************
mov aL, aS
mov dx, 2
IDIV dx
mov dx, 1
sub dx, ax
mov ax, dx
;Zapominanie v steke ax*******************
push ax
CBW
;Vostanovlenie soderzhimogo steka
pop bx
mov Denominator, bx
;Chislitel********************************
mov aL, dds
mov dx, 4
IMUL dx
add aL, ccS
mov dx, 123
CBW
sub ax, dx
CWD ; ax ==> DX:AX
;Mladshaya chast chislitelya
mov WORD PTR Numerator, AX
;Starshaya chast chislitelya
mov WORD PTR Numerator+2, DX
;Rezultat
IDIV bx; Delenie chislitelya na znamenatel
mov xI, ax
ret
Lab3S endp

;=========================================
Public C Lab3I
Lab3I proc far
;Znamenatel*******************************
mov aX, aI
mov cx, 2
IDIV cx
mov cx, 1
sub cx, ax
mov Denominator, cx
;Chislitel********************************
mov ax, ddI
mov cx, 4
IMUL cx
CWD
;Zapominanie v steke (4*d)
push dx
;Zapominanie =4*d v steke (mladshaya chast)
push ax
mov ax, cI
CWD
;Vostanovlenie soderzhimogo steka ===> =4*d - mladlaya chast
pop bx
;Vostanovlenie soderzhimogo steka ===> =4*d - starshaya chast
pop cx
add bx, ax
adc cx, dx
sub bx, 123
sbb cx, 0
;Mladshaya chast chislitelya
mov WORD PTR Numerator, BX
;Starshaya chast chislitelya
mov WORD PTR Numerator+2, CX
;Gotovimsya k deleniu
mov ax, bx
mov dx, cx

;Resultat
IDIV Denominator; Delenie chislitelya na znamenatel
mov xI, ax
ret
Lab3I endp
end

АС
Александр Сергеевич

Прежде чем искать ошибку в коде, необходимо выяснить в чём вы пишите код C++.
Есть предположение, что в IDE, предназначенной для разработки 32-разрядных приложений.
Если это так, то не понятно почему модуль на ассемблере написан, как 16-разрядный.

И неплохо бы взглянуть на то, как выглядят вызовы ассемблерных функций из кода на C++.

А по представленному коду уже в начале очень интересная картина:
Lab3S proc far
;Znamenatel*******************************
mov aL, aS
mov dx, 2
IDIV dx

На 2 делится не aS, а число (2*65536+256*ah+aS), где в ah находится совершенно случайное значение.
Вполне вероятно, это деление приводит к возбуждению прерывания по ошибке переполнения частного.

Дальше смотреть не стала.

Похожие вопросы
Ассемблер. помогите решить!!!
Помогите с ассемблером
Помогите, что не так? прога в ассемблере
Люди выручайте студента Ассемблер
Помогите решить задачу по ассемблеру
помогите написать программу в с++ или на ассемблере
Люди, которые хоть немного разбираются в ассемблере, помогите написать программу)
Ассемблер
Помогите по ассемблеру
Помогите с ассемблером