Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Вычитание (SUB)


Автор: aeroslav 7.12.2006, 11:31
В связанном с Delphi ассемблерным файлом производится вычитание из a в b. Результат вычитания Res передается Delphi и дальше выводится. Если a>b, то результат корректен, а если a<b, то Res по всем правилам представления целых отрицательнх чисел представляется как , к примеру 65524, хотя отнимаю маленькие значения (13-28, 3-47 и т.д.). Есть ли стандартное решение этой проблемы?

Автор: dumb 7.12.2006, 12:11
Цитата(aeroslav @  7.12.2006,  11:31 Найти цитируемый пост)
если a<b, то Res по всем правилам представления целых отрицательнх чисел представляется как , к примеру 65524, хотя отнимаю маленькие значения (13-28, 3-47 и т.д.). Есть ли стандартное решение этой проблемы? 

а где тут проблема-то?

Автор: aeroslav 7.12.2006, 13:19
Ну, к примеру результат -295 выдается как 65321, или это уже не проблема?
Я решил её введением доппеременной, отвечающей за знак числа, и в ассемблере работаю только с положительными. Но может есть другое решение?

Автор: dumb 7.12.2006, 16:02
aeroslav, телепатировать трудно.
есть подозрение, что как всегда путаница с битностью, да и вообще налицо пробел в знаниях базовых понятий.
исходники в студию. и дельфи и асм.

Автор: MAKCim 7.12.2006, 16:06
aeroslav, 
анализируй флаг CF после sub
если он 1, произошел заем из старшего разряда и результат в дополниельном коде
чтобы получить модуль числа нужно
его инвертировать и прибавить 1
Код

...
mov AX, 10
mov BX, 20
sub AX, BX
jnc L1
not AX
inc AX
L1:
...

Автор: aeroslav 7.12.2006, 16:42
ASM:

;a>b
@@2:
  cmp    aAsmI, 235
  jl    @@2a
  add    ax,-235
  cwd
  idiv    bx
  jmp    short @@Exit
@@2a:
  mov    dx, 235
  sub    dx, ax
  mov    ax, dx
  cwd
  idiv    bx
  mov    sign, 1
  jmp    short @@Exit


Delphi:

      aAsmI:= StrToInt(FrmMain.LEdA.Text);
      bAsmI:= StrToInt(FrmMain.LEdB.Text);
      Lab4I(aAsmI, bAsmI, Res);
      if sign=1 then FrmMain.LEdResA.Text:= '-'+IntToStr(Res);
      if sign=0 then FrmMain.LEdResA.Text:= IntToStr(Res);


Максим, спасибо, то, что мне надо.



Автор: dumb 7.12.2006, 16:58
все, как я и говорил... smile

если не смешивать эпохи, то достаточно объявить aAsmI, bAsmI, Res: Integer, а в асме сделать:
Код

mov eax, aAsmI
sub eax, bAsmI
mov Res, eax


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)