Re[12]: вывод на экран содержимого dl
От: Anatoliy.Sviridenkov Россия  
Дата: 19.03.08 11:51
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Дык вот в этом месте и двигаются биты в сторону младших (вправо), а не как надо.

GN>
GN>      SHR  DL, 1h         ; сдвиг на 1
GN>


GN>совсем не обязательно:

GN>
GN>      MOV  RES[BX], '0'  ; Загрузка в строку 0
GN>      ADC  RES[BX], 0    ; добавляем флаг переноса - результат '0' или '1'
GN>


Угу, так будет лучше. Давно не брал я в руки асма
Re[13]: вывод на экран содержимого dl
От: gear nuke  
Дата: 19.03.08 16:09
Оценка: 7 (1)
Здравствуйте, Anatoliy.Sviridenkov,

AS>Давно не брал я в руки асма


Ну я вообще никогда не писал под 16bit x86, но если не думать, то так бы делал и на С:

unsigned char byte;
for ( unsigned i = 8; i; --i ) 
{
  const unsigned char old = byte;
  byte *= 2; // даже если не знаем, в какую сторону двигать, сдвиг всегда можно заменить на сложение с самим собой.
  *p++ = '0' + (byte < old);
}

Если заниматься "оптимизацией" на ассемблере, то счетчик цикла вообще не нужен, вместо него можно использовать маркер — 9й бит (флаг переноса). Смысл простой: устанавливаем CF перед первым сдвигом; сдвиг производим с учетом переноса (можно adc reg, reg) — выполнять, пока сдвигаемое не 0 (маркер не "сдвинулся наружу"; поскольку дальнейшее adc c '0' сбросит CF, о повторном появлени маркера можно не беспокоиться). На ЯВУ впринципе тоже можно подобно...
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.