| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Вычитание (SUB) |
| Автор: aeroslav 7.12.2006, 11:31 |
| В связанном с Delphi ассемблерным файлом производится вычитание из a в b. Результат вычитания Res передается Delphi и дальше выводится. Если a>b, то результат корректен, а если 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
|
| Автор: 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 | ||
| все, как я и говорил... если не смешивать эпохи, то достаточно объявить aAsmI, bAsmI, Res: Integer, а в асме сделать:
|