@Alrond2198

Как работать с отрицательными числами в Ассемблере?

Цель: вычислить (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


Так проявляется проблема:
считаются числа правильно, но выводятся неправильно
5f3ac0e8c5963977949043.png
5f3ac0f6f1435862370019.png
5f3ac1025091b927732188.png
Причем неправильно выводится может любое значение из трех.
  • Вопрос задан
  • 1959 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
signed __int8 numerator = 0;
signed __int16 denominator = 0;


extern numerator:sword
extern denominator:sbyte
...
mov denominator, al

Ты видишь, что типы в C и в ассемблере не совпадают?
По-хорошему надо заменить __int8 numerator на __int16 numerator, extern denominator:sbyte на extern denominator:sword а mov denominator, al на mov denominator, ax, чтобы стало как надо.
В остальном всё выглядит хорошо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы