Консультация № 104369
05.10.2007, 02:47
0.00 руб.
0 2 2
Здраствуйте, не могли бы вы помочь с написание программы на ассемблере: "Сложение 2х чисел со знаком" (ввод и вывод в двоичном коде). Сколько не пытался разобраться, никак не получается ((.

Обсуждение

Неизвестный
05.10.2007, 10:54
общий
это ответ
<p><fieldset style=‘background-color:#EFEFEF; width:80%; border:#777777 1px solid; padding:10px;‘ class=fieldset><font color=#777777><i>Перенесено в минифорум, т.к. не является ответом на вопрос.</i>
-----
</font><font color=#777777 size=1><b>• Отредактировал: <a href=/info/user/8 target=_blank>Alexandre V. Tchamaev</a></b> (*Мастер-Эксперт)
<b>• Дата редактирования:</b> 05.10.2007, 17:04</font></fieldset>
давно
Старший Модератор
31795
6196
08.10.2007, 18:37
общий
это ответ
Здравствуйте, Firmament!

Смотрите приложение.
Знаковые биты для байта -7, слова-15, двойного слова-31
По программе (думаю Вам будет полезна):
а)при вводе чисел:
-вводится только цифры 0 и 1;
-максимальное кол-во цифр = 8(т.е. байт);
-нажатие клавиши "Enter" заканчивает ввод числа.
в)введенное число преобразуется в 10-ое со знаком и выводится рядом.
с)вывод результата в системах: 2-ой, 10-ой(со знаком и без) и еще выводится флаги CF(C) и OF(O);
<i><b>CF — флаг переноса</b>. Устанавливается в 1, если результат предыдущей операции не уместился в приемнике и произошел перенос из старшего бита или если требуется заем (при вычитании), иначе устанавливается в 0. Например, после сложения слова 0FFFFh и 1, если регистр, в который надо поместить результат, — слово, в него будет записано 0000h и флаг CF = 1.
<b>OF — флаг переполнения</b>. Этот флаг устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице (то есть отрицательное) и наоборот.</i>
Для работы с числами со знаком важны оба этих флага к примеру:
10000000=-128
10000000=-128
сумма будет 00000000 и установленны флаги: CF=1 и OF=1,
или
01000000=64
01000000=64
сумма будет 10000000(-128<small>сз</small> или 128<small>бз</small>) и флаги: CF=0 и OF=1
Анализ результата возлагается на программиста(таких ситуаций всего 4-е для каждого варианта "++","+-" и "--") т.к. только он знает, что там должно быть (процессору безразлично он складывает числа без знака).
ps:советую посмотреть В.Юров <a href=http://wmate.ru/ebooks/cat13/index-s5.html>"Ассемблер:практикум"</a>
Удачи!

Приложение:
MASM;IDEAL or MASM MODEL small stack 50 .186 DATASEG dbEnterData db 13,10,‘Enter Binary :$‘ dbEquvals db ‘ = $‘ dbFlag db ‘ flag:$‘ dbResult db 13,10,‘Result data :$‘ DataOne db ? DataTwo db ? DataNul db ? CODESEG start: mov ax,@DATA mov ds,ax mov es,ax ;вводим числа mov di,offset DataOne call InputBin mov di,offset DataTwo call InputBin ;сумма чисел mov al,DataOne add al,DataTwo mov DataNul,al ;контроль флагов CF и OF mov bx,2020h jnc no_carry mov bh,‘C‘ no_carry: jno no_over mov bl,‘O‘ ;вывод сообщения о результате no_over: push bx mov ah,09 mov dx,offset dbResult int 21h ;будем выводить в 2-ой форме mov di,offset DataNul mov ah,[di] mov cx,08 ;вывод в 2-ой форме 8-ем бит output_bin: mov al,‘0‘ shl ah,1 adc al,0 int 29h loop output_bin ;выводим в 10-ой форме с учетом знака call output_number ;разделяем знаковые и без знаковые числа mov al,‘:‘ int 29h ;будем выводить без учета знака mov al,[di] mov bl,‘ ‘ call no_znak ;выводим ссобщение о флагах mov ah,09 mov dx,offset dbFlag int 21h ;выводим флаги pop bx mov al,bh int 29h mov al,bl int 29h ;выход в дос mov ah,4ch int 21h ;п/п-мма ввода 2-го числа ;выводим сообщение о вводе числа InputBin: mov dx,offset dbEnterData mov ah,09 int 21h mov cx,08 ;цикл ввода числа input_next: mov ah,07 int 21h ;контроль ввода cmp al,13;клавиша "Enter" jz output_number cmp al,‘0‘ jb input_next cmp al,‘1‘ ja input_next ;выводим введенное число push ax int 29h pop ax ;перобразовываем его в бит и добавляем в число sub al,‘0‘ shl byte ptr[di],1 add [di],al ;контролируем колво бит в числе dec cx jnz input_next ;сообщение о выводе 10-го знакового числа output_number: mov ah,09 mov dx,offset dbEquvals int 21h ;проверяем знак mov bl,‘ ‘ mov al,[di] or al,al jns no_znak ;знак есть переводим в 10-е без знака и запоминаем знак mov bl,‘-‘ dec al not al ;выводим 10-е без знака no_znak: mov bh,10 xor cx,cx ;переводим в 10-ую систему bin_to_dec: xor ah,ah div bh ;и запоминаем в стеке xchg ah,al push ax xchg ah,al ;считаем кол-во цифр в числе inc cx or al,al jnz bin_to_dec ;выводим знак числа mov al,bl int 29h ;выводим цифры извлекая их из стека output_dec: pop ax or al,30h int 29h loop output_dec ret end start
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа