Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > как вывести на экран отриц. число???


Автор: Frekenbok 28.12.2006, 15:27
Привет!
У меня такая проблема. Везде замечательно описано, как вывести двоичное число на экран (перевод в ASCII-коды, деление на 10, вывод по одной цифре и пр.). А как вывести отрицательное число???
Вот мой план:
Очевидно, знак минус придется выводить "ручками".
Но для того, чтобы определить, отрицательное это число или нет, нужно сканировать знаковый бит? А еще что-нибудь нужно учитывать (например, флаг OF или др.)? С помощью какой команды? Единственное, что приходит на ум - bt AX, 15
Затем если число отрицательное, найти его модуль (NEG) и вывести знак '-' и положительное число (это я умею).
Теперь обратное действие - ввод отриц. числа с клавиатуры.
Если есть знак '-', то получаем из ASCII-числа обычное двоичное и делаем NEG. Ввод выглядит проще, чем вывод.
Просто страшно становится от такого длинного алгоритма для такой простой цели. Нельзя ли проще? Прокомментируйте, плиз, мои рассуждения. 
З.Ы. Код не нужен, нужны идеи  smile 
З.Ы. 2 . С Новым Годом!

Автор: Akina 28.12.2006, 23:36
Цитата(Frekenbok @  28.12.2006,  16:27 Найти цитируемый пост)
Нельзя ли проще?

Да уж куда проще-то? все более чем элементарно...

Цитата(Frekenbok @  28.12.2006,  16:27 Найти цитируемый пост)
Единственное, что приходит на ум 

Код

test ax, 8000h

Автор: Frekenbok 29.12.2006, 05:34
Цитата(Akina @  28.12.2006,  23:36 Найти цитируемый пост)
Да уж куда проще-то? все более чем элементарно...

Элементарно, это да. Хотелось покороче алгоритм, но, видимо, с асмом не получится короче  smile 
Так что, мой план единственно верный? Других идей больше нет?

Автор: W4FhLF 29.12.2006, 08:59
> (2^n-1)/2 - отрицательное; < - положительное. 
Где n - показатель разрядности системы под которую ты пишешь. 
В памяти ведь никакого деления на отрицательные и положительные нет, оно лишь условно. 


PS http://hunger.ru/articles/num

Автор: Frekenbok 29.12.2006, 16:46
W4FhLF, спасибо за ссылку, ты опередил мой вопрос про вещественные числа. Но вычислять такую формулу в асме гораздо длиннее, чем просто отсканировать знаковый бит и отсюда плясать...  smile 

Автор: W4FhLF 29.12.2006, 19:52
Да ты не смотри на формулу, я для универсальности её привёл. Суть в том, что если число > 7FFFFFFF(для 32х разрядных систем) и > 7FFFF для 16ти разрядных, значит оно отрицательное в знакомо представлении.

Допустим надо тебе найти знаковое представление значения B345DFA4h. Твои действия:

Код

    mov eax,0FFFFFFFFh
    sub eax, 0B345DFA4h
    inc eax


Теперь в eax знаковое значение числа B345DFA4h

Можно проще:

Код

    mov eax, 0B345DFA4h
    neg eax



Автор: Frekenbok 6.1.2007, 07:05
W4FhLF, похоже, ты мне просто предлагаешь поменять знак числа. А мне нужно вот что. В результате вычислений у меня в регистре АХ получилось какое-то число. Заранее известно, что я оперирую знаковыми числами. Нужно определить, какое это число - положительное или отрицательное.
Если пользоваться твоим утверждением, что ...
Цитата(W4FhLF @  29.12.2006,  19:52 Найти цитируемый пост)
если число > 7FFFFFFF(для 32х разрядных систем) и > 7FFFF для 16ти разрядных, значит оно отрицательное в знакомо представлении

тогда код скорее всего будет похож на это:
Код

cmp ax, 7FFFh
ja minus ; переход, если АХ>7FFFh
; действия с положит. числом
...
jmp exit
minus:
; действия с отриц. числом
...
exit:
...

Кстати, по-моему, 7FFFh, а не 7FFFFh. Или нет?  smile 

Автор: 10110111 6.1.2007, 19:58
Самое простое - это test reg,reg => js Negative, где reg - любой регистр

Автор: W4FhLF 7.1.2007, 10:19
Frekenbok, ну я просто не знал твоей задачи изначально, тогда так, как ты показал и делай.


Цитата(Frekenbok @  6.1.2007,  07:05 Найти цитируемый пост)
Кстати, по-моему, 7FFFh, а не 7FFFFh. Или нет? 



Угу, очепяткаsmile

Автор: MAKCim 7.1.2007, 10:32
Код

...
    bt AX, 15
    jc @@L1
; число положительное
@@L1:
; число отрицательное

Автор: Frekenbok 7.1.2007, 10:37
10110111, спасибо!
Цитата(10110111 @  6.1.2007,  19:58 Найти цитируемый пост)
Самое простое - это test reg,reg => js Negative, где reg - любой регистр 

Вот это хорошая идея! Действительно, очень просто, даже проще, чем использовать bt. А про переход js вообще не знала, как-то не приходилось пользоваться, их столько - этих переходов!  smile Но это как раз то, что нужно, а я тут голову ломаю. Кстати, правильно я понимаю: reg один и тот же? Т.е., например, число лежит в АХ, тогда test AX, AX?

Автор: 10110111 19.1.2007, 23:13
Цитата

Кстати, правильно я понимаю: reg один и тот же? Т.е., например, число лежит в АХ, тогда test AX, AX? 

Да, именно так

Автор: Frekenbok 21.1.2007, 09:10
Спасибо всем.  smile 

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