Здравствуйте, 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>
Угу, так будет лучше. Давно не брал я в руки асма
Здравствуйте, 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