2013-02-11 2 views
3

У меня есть арифметическая программа в сборке, но когда я добавляю, вычитаю, умножаю отрицательные числа, это не приведет к желаемому результату.Как использовать отрицательные числа как единое целое?

Для примера

ввода:

-1+2=66675 (should be 1) 

-1-1=656745 (should be -2) 

-1*-1=66757 (should be 1) 

Вопросы:

  • как бы я лечить (-) и (1) в качестве одного?

  • Как сделать арифметическую операцию в подписанных числах?

любые советы, пожалуйста ...

+1

В CONVERT РЕЗУЛЬТАТ К ASCII: MOV AL , РЕЗУЛЬТАТ BYTE PTR + 1; ПЕРВАЯ ПРОВЕРКА, ЕСЛИ AX ПОЗИТИВНО ИЛИ НЕГАТИВНО ... Если вы обнаружите, что число отрицательно, вы должны преобразовать его в двухкомпонентный комплимент. Затем, когда вы конвертируете его в текст, читаемый человеком, вам нужно будет его вернуть. – Kibitz503

+0

ok теперь я знаю спасибо за ваше время. Имейте в виду все, что я узнал от вас. Благослови! :) – scarface23

+0

У меня отличный человек. Хотел бы я быть более полезным, но ASM далека от моего родного языка :) – Kibitz503

ответ

1

Я рекомендую прочитать на 2'S комплимента, а разницу между подписанным и неподписанным Ints. Значение, которое вы показываете, выглядит подозрительно, как подписанное значение int negative, которое преобразуется в значение unsigned int без преобразования. Отрицательные ints имеют самый значительный бит, который установлен в 1. Если вы перетащите это значение в unsigned int без первой маскировки, тогда вы получите гораздо большее число, чем ожидалось.

Пример в 8 битовом представлении:

signed value = -1 
unsigned value = 255 
binary = 1111 1111 

Take the twos compliment: 
     1111 1111 
XOR 0000 0000 
equals 0000 0000 
add1 0000 0001 
dec value = 1 

Вы можете узнать больше здесь (У них есть пример комплемента дополнение до двух вы можете посмотреть): http://academic.evergreen.edu/projects/biophysics/technotes/program/2s_comp.htm

+0

поэтому u означает, что если я ввожу (-1 + 2), тогда -1 должен быть преобразован сначала в комплимент 2, чтобы он обрабатывался как -1 ? пожалуйста, не стесняйтесь, я очень новичок в сборке .. и у нас есть калькулятор proj, не обсуждая нас на ассемблере .. мне действительно трудно понять этот ... – scarface23

+0

8 бит (ваш больше, но 8 бит более простой пример) unsigned int имеет диапазон значений от 0 до 255. Подписанный 8-битный int - от -128 до 127. Комплимент twos - это схема, используемая для выполнения операции сложения. ASM очень низкий уровень, и в зависимости от среды у вас может не быть подписанного int. Ваша функция печати говорит, что у меня 1111 1111, поэтому мой номер должен быть 255, когда он действительно равен -1. – Kibitz503

+0

Ключ состоит в том, чтобы обрабатывать все числа, начинающиеся с^1 000 000 00, как отрицательное число, которое было преобразовано с помощью двух комплиментов. В моем примере, если вы попытаетесь добавить 200 к значению, это все испортит, потому что вы добавляете положительное число, которое слишком велико для контейнера! – Kibitz503

Смежные вопросы