Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Команды and и shr(L)


Автор: klyxa 5.6.2007, 12:11
Народ. Объясните плиз пример этот
Код

_BCD   db      25h ;упакованное BCD-число
s_ch    dw      0 ;место для результата
...
        xor     ax,ax   ;очистка ax
        mov     al,u_BCD
        shl     ax,4    ;ax=0250
        mov     al,u_BCD        ;ax=0225
;преобразование в символьное представление:
        and     ax,3f3fh        ;ax=3235h
        mov     s_ch,ax


Мне вот не понятно почему 0025h после сдвига влево на 4 разряда стало 0250h поидее вабще 0000, т.к. там замещяется нулями разряды,но 0025 и конечное 0000 как то не вяжется..объясните пожалуйста - как там происходит сдвиг.

И еще вот сие
        and     ax,3f3fh   ; and ипользуется для логического умножения 2ух операндов..т.е. 0225*(логичски)3f3f...
Ааа, мб это типа в 2оичной сситеме умножение происходит?=) А то так посмотришь,что то никак не выходит 1 или 0

0000 0010 0010 0101
*
0011 1111 0011 1111
__________________
0000 0100 0010 0101

т.о. "0425" ...омг..у меня чё то не то вышло. поправте плиз. а то я не особо еще с асмой сдружился



Автор: DigitSphinx 5.6.2007, 12:56
2^4=16
Т.е. ты умножаешь на 16 поэтому и сдвиг на 1 разряд !
Цитата(klyxa @  5.6.2007,  12:11 Найти цитируемый пост)

0000 0010 0010 0101
*
0011 1111 0011 1111
__________________
0000 0100 0010 0101

0000 0010 0010 0101
*
0011 1111 0011 1111
__________________
0000 0010 0010 0101
Нет ответ будет 0225 т.е. 1000100101 на калькуляторе проверь
У тебя нолик лишний !

Автор: klyxa 5.6.2007, 14:18
"2^4=16
Т.е. ты умножаешь на 16 поэтому и сдвиг на 1 разряд !"

т.е.
Код

shl     ax,4

4 - это степень в которую надо возвести 2?..а почему если 16,то на 1 разряд?

вот ще пример
Код

 mov AL,7
shr AL,1 ;AL=3, CF=1


7 - 0111
shr - сдвиг побитово вправо,т.е. 0011,т.е. 3
А вот с первым примером какаято херь невнятная. ЛАдно бы там rol был. Еще всё доступно,но вот чтобы в степеь и далее..Объясни плиз,как ты так лихо? smile

"Нет ответ будет 0225 т.е. 1000100101 на калькуляторе проверь
У тебя нолик лишний !"

А зачем тогда мы делали

Код

 and     ax,3f3fh 


Если получилось то, что было. Или тут тоже какойто скрытый смысел?сори за тупость,если таковая присутствует.Но..хочу всё знать!=)

Автор: DigitSphinx 5.6.2007, 14:45
Я сам тока начал изучать asm !
На счет shl я не уверен , действительно хрень !
На счет “&” логического И:
Операция не имеет отношение к умножению !
Называется Конъюнкция, у логических операторов есть таблицы истинности , у логического И
A    |    B    |    A&B
0         0           0
0         1           0
1         0           0
1         1           1
Т.е. только когда оба операнда положительны то и результат положительный
0000 0010 0010 0101
*
0011 1111 0011 1111
__________________
0000 0010 0010 0101

Другой пример

0000 0010 0010 0101
*
0011 1101 0011 1011
__________________
0000 0000 0010 0001

Добавлено через 11 минут и 17 секунд
Да кстати с shl и shr вроде логично
25h = 37d = 100101b
Сдвигаем 100101 на 4 разряда влево получаем 1001010000
1001010000b = 592d = 250h

7h = 7d = 0111b
Сдвигаем на разряд вправо получаем 011,1 = 3,5d = 3.8h
Но единичка после запятой откидывается и получаем 011 = 3d  =3h

Добавлено через 14 минут и 10 секунд
Короче все сдвиги в 2-ой системе счисления !

Автор: klyxa 5.6.2007, 14:59
"Команда and используется для логического умножения двух операндов. Результат операции помещается по адресу первого операнда. Эту команду удобно использовать для принудительной установки или сброса определенных битов операнда. "

Код

;Пример. Надо в числе 11111111 обнулить 2, 3 и 6 биты.
mov ax,11111111b
and ax,10110011b



Ну не суть..меня интересует когда они получали символ нажатой клавиши(или что там) с помощью 

Код

;преобразование в символьное представление:
        and     ax,3f3fh        ;ax=3235h
; and     ax{0225h},3f3fh  как получается 3235


Мы же вроде считали сейчас. получалось 0225,но уж никак не 3235h. Меня вот сие интерисует.и srl тоже=)

Автор: DigitSphinx 5.6.2007, 15:07
Цитата(klyxa @  5.6.2007,  14:59 Найти цитируемый пост)
;Пример. Надо в числе 11111111 обнулить 2, 3 и 6 биты.
mov ax,11111111b
and ax,10110011b

 smile 
Номера битов с права на лево !
Еще раз : я полный нуб по asm’у !
Я отвечал на вопрос по мат. Логике !

Добавлено @ 15:15
Кстати если разбираешся в asm’е ответь на мой вопрос 
Тема называется “В асме 1-ый раз , что не так с выводом, Не могу вывести строку !”
Она вторая после твоей  smile 

Автор: dumb 5.6.2007, 15:53
Цитата(klyxa @  5.6.2007,  14:59 Найти цитируемый пост)
"Команда and используется для логического умножения двух операндов. Результат операции помещается по адресу первого операнда. Эту команду удобно использовать для принудительной установки или сброса определенных битов операнда. "

откуда читата?
а. нашел. Юров. короче, Витя Юров - тоже человек, и ему тоже(как и всем другим человекам) свойственно ошибаться...
для "принудительной установки" определенных битов команда and использоваться не может, и это очевидно. для "принудительной установки" используется команда or.
причем, похоже, это не опечатка, а именно ошибка, так как пример использования написан с описанной "корявой" логикой.
Цитата

_BCD   db      25h ;упакованное BCD-число
s_ch    dw      0 ;место для результата
...
        xor     ax,ax   ;очистка ax
        mov     al,u_BCD
        shl     ax,4    ;ax=0250
        mov     al,u_BCD        ;ax=0225
;преобразование в символьное представление:
        and     ax,3f3fh        ;ax=3235h ax=0225, обидно, да? smile
        mov     s_ch,ax


а теперь внимание, правильный ответ:
Код

_BCD   db      25h ;упакованное BCD-число
s_ch    dw      0 ;место для результата
...
        xor     ax,ax   ;очистка ax
        mov     al,u_BCD
        shl     ax,4    ;ax=0250
        mov     al,u_BCD        ;ax=0225
;преобразование в символьное представление:
        and     ax,0f0fh        ;ax=0205
        or      ax,3030h        ;ax=3235
        mov     s_ch,ax

Автор: klyxa 5.6.2007, 15:57
";ax=3235h ax=0225, обидно, да? smile"

алилуя!!! спасибо большое =))

Автор: Mikl__ 6.6.2007, 10:53
Может быть я смогу объяснить понятнее
_BCD   db      25h ;упакованное BCD-число
необходимо превратить в код '25' коды чисел ASCII '0'- 30h '1'-31h ... '8' - 38h '9'-39h
чтобы преобразовать упакованное число 0025h цифры необходимо раздвинуть 0205h, а затем сложить с 3030h
тогда мы получим 3235h или код '25'
        mov     ah,u_BCD;ax=25XX
        shr    ax,4    ;ax=025X
после этого должно быть 
        shr     al,4        ;ax=0205
;преобразование в символьное представление:
        add     ax,3030h        ;ax=3235h
        mov     s_ch,ax


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