Цель: вычислить (2*a/b-1)/(a-28+c) в ассемблерной функции, вызываемой из С++ файла.
Проблема: ассемблерная функция время от времени какое-то число воспринимает не как отрицательное в дополнительном коде или как его там, а как положительное.
Вот как объявлены параметры в С++ файле:
extern "C"
{
signed __int8 a = 0, b = 1, c = 29;
signed __int8 numerator = 0;
signed __int16 denominator = 0;
signed __int8 result = 0;
void ASM_count();
}
Вот так выглядит ассемблерный файл:
;.586
;.model large, C
.data
extern a:sbyte
extern b:sbyte
extern c:sbyte
extern numerator:sword
extern denominator:sbyte
extern result:sword
;(2*a/b-1)/(a-28+c)
.code
ASM_count PROC
;///////////////////////////////numerator///////////////////////////////
xor eax, eax
mov al, 2
imul a
;cbw
idiv b
dec ax
mov numerator, ax
;///////////////////////////////denominator///////////////////////////////
xor eax, eax
mov al, a
sub al, 28
add al, c
mov denominator, al
;///////////////////////////////result///////////////////////////////
xor eax, eax
mov ax, numerator
idiv denominator
mov result, ax
ret
ASM_count endp
end
Так проявляется проблема:
считаются числа правильно, но выводятся неправильно
Причем неправильно выводится может любое значение из трех.