2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 вычитание на Assembler [Упр]
Сообщение30.09.2011, 12:48 


31/10/10
12
Нужно вычесть два 16-разрядных числа(таких, чтобы результат был отрицательным) и результат вывести на экран.
Код:
   mov   ax, 1221h
   sbb   ax, 4553h

Проблема в том, что при выводе получается неправильное число, CCCEh, как правильно вывести отрицательный результат? (Вывожу регистр ax, предполагаю, что нужно выводить еще что-то, но не знаю что)

 Профиль  
                  
 
 Re: вычитание на Assembler
Сообщение30.09.2011, 14:20 
Заслуженный участник


15/05/05
3444
USA
Pinkey в сообщении #488003 писал(а):
при выводе получается неправильное число, CCCEh, как правильно вывести отрицательный результат?
1. Вы знаете что-нибудь о дополнительном коде?
2. Почему SBB, а не SUB?

 Профиль  
                  
 
 Re: вычитание на Assembler
Сообщение30.09.2011, 14:35 


31/10/10
12
да, sub на самом деле написан. А дополнительный код, это дополнение до двух и прибавление единицы? Если да, то я все равно не понимаю, что надо сделать.

 Профиль  
                  
 
 Re: вычитание на Assembler
Сообщение30.09.2011, 14:57 
Аватара пользователя


27/01/09
813
Уфа
Замечания:
1. Компьютер не может делать неправильно, значит результат правильный.
2. В соответствии с результатом устанавливаются флаги. Нас интересуют флаги С, S, Z, O.
3. Команда SBB это вычитание с заёмом, т.е. с учётом флага С, а в вашем простом примере надо использовать команду SUB.
4. Вы из меньшего положительного вычли большее положительное, получили отрицательное число.
Десятичный пример: 1-4=7 и заём из следующего десятичного разряда, устанавливаются флаги С и S.
Теперь из результата надо получить код отрицательного числа, поэтому вопрос: в каком виде в x86 кодируются отрицательные числа?
Т.е. десятичное отрицательное число выглядит как -3, поэтому из десятичного числа 7 надо получить код 3 и вывести на экран знак минуса и этот код.
Вам из FFFFCCCEh надо получить код отрицательного числа и вывести его со знаком минус.

 Профиль  
                  
 
 Re: вычитание на Assembler
Сообщение30.09.2011, 15:06 


31/10/10
12
Chifu в сообщении #488034 писал(а):
Вам из FFFFCCCEh надо получить код отрицательного числа и вывести его со знаком минус.

Я не понимаю как это сделать, объясните пожалуйста подробнее (вывести надо в 16ричной форме)

 Профиль  
                  
 
 Re: вычитание на Assembler
Сообщение30.09.2011, 15:15 
Аватара пользователя


27/01/09
813
Уфа
Pinkey в сообщении #488035 писал(а):
Я не понимаю как это сделать, объясните пожалуйста подробнее (вывести надо в 16ричной форме)
Полученное двоичное число надо преобразовать в 16-форму. Как двоичные числа преобразуются в 16-форму?

 Профиль  
                  
 
 Re: вычитание на Assembler
Сообщение30.09.2011, 15:35 


31/10/10
12
ну по 4 бита берется за одно 16-ричное число, единицы умножаются на соответствующие степени двойки. Но я все равно не понимаю, как мне вывести правильный ответ

 Профиль  
                  
 
 Re: вычитание на Assembler
Сообщение30.09.2011, 15:43 
Аватара пользователя


27/01/09
813
Уфа
Pinkey в сообщении #488040 писал(а):
ну по 4 бита берется за одно 16-ричное число, единицы умножаются на соответствующие степени двойки. Но я все равно не понимаю, как мне вывести правильный ответ
Берёте массив символов от 0 до F и выводите по индексу полученному из тетрад соответствующие коду символы.

 Профиль  
                  
 
 Re: вычитание на Assembler
Сообщение30.09.2011, 17:07 
Заслуженный участник


15/05/05
3444
USA
Pinkey в сообщении #488032 писал(а):
Если да, то я все равно не понимаю, что надо сделать.
1. Да.
2. Если результат отрицательный, то получить соответствующее положительное значение, вывести знак минус и полученное положительное значение.

 Профиль  
                  
 
 Re: вычитание на Assembler
Сообщение30.09.2011, 20:41 


31/10/10
12
спасибо, теперь все понятно стало:)

 Профиль  
                  
 
 Re: вычитание на Assembler
Сообщение01.10.2011, 10:02 
Аватара пользователя


27/01/09
813
Уфа
То что я назвал кодом отрицательного числа правильнее называть положительным числом, т.к. в числах со знаком признаком отрицательного числа является флаг S, который копирует старший бит машинного слова результата. Вы несколько неправильно написали операцию взятия дополнительного кода для слов. Операция взятия дополнительного кода переводит положительное число в отрицательное, а отрицательное в положительное.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Модераторы: maxal, Toucan, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group