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
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.