Здравствуйте. У Тома Свэна в книге Turbo Assembler, есть такая задача: Напишите программу распаковки любого количества битов из слова, возвращая эти биты, начиная с младшего разряда регистра. Иными словами, из вызывающей программы должны передаваться необходимые номера битов, например 4,5,6. Подпрограмма должна возвращать эти биты в позициях 0,1 и 2 устанавливая остальные биты в ноль. Т.е. я передаю биты 3,4,5 из числа, например 01101101, а мне нужно получить 00000101. В какую сторону рыть подскажите пожалуйста. на ум приходит rol и ror, чтобы все сдвинутое после полезного стало нулями, но ... как лучше это сделать
Nikankin Если я правильно понял требуется из 01101101 получить 00000001 00000100 00001000 00100000 01000000 Нечто подобное обсуждалось здесь, посмотри внимательно Код (Text): cld mov cl,8 mov bl,01101101b mov al,1 mov di,offset Mass a1: test al,bl jz a2 stosb;mov [di],al/inc di a2: shl al,1 loop a1 Mass db 0,0,0,0,0,0,0,0 q_q опечатка исправлена, спасибо
Я немного исправил свой пост, ошибка была в результате. Дело в том, что предполагается вводить данные о битах хоть сколько раз. Т.е. программа должна обрабатывать любую комбинацию. Моя идея была такова. Берем биты, например с 3 по 5, т.е. из 01101101 будет 101. Байт 8 бит, позиции нужных битов известны из задания. Отнимаю от старшего бита 5 (7-5), получаю количество сдвигов для команды shl mov bh, 5 mov bl, 3 mov dl, 7 (длина байта) sub dl, bh mov cl, dl mov al, 01101101b mov cl, 2 shl al (в результате получится: 10110100, искомые биты с 3 по 5 переместились в в старшие разряды) (теперь нужно отнять 7 - 3 и сдвинуть на указанное число вправо) mov dl, 7 (длина байта) sub dl, bl mov cl, dl mov cl, 4 shr al (в результате 10110100 станет 00000101, что и требовалось) Не уверен в правильности алгоритма, хотя он мне таким кажется. Просто нет возможности сейчас проверить, ни одного компилятора под рукой, даже DEBUGа. Что скажете по это поводу? Mikl__ спасибо за ссылку
Код (Text): TITLE *** MODEL TINY DATASEG src db 01011010b exCODE DB 0 CODESEG ORG 100h START: mov al, [src] mov bh, 5 ; Границы выбираемых битов mov bl, 3 mov dl, 8 ; Длина байта sub dl, bh ; На сколько сдвигать mov cl, dl shl al, cl mov dl, 8 sub dl, bl ; На сколько сдвигать mov cl, dl shr al, cl EXIT: MOV AH, 4CH MOV AL, [exCODE] INT 21H END START Этот код работает как нужно. А как передвинуть выбранные биты в начало байта (по младшим адресам), если биты расположены не по порядку? например из 01101001 выбрать биты 1,3,7 и получить 00000101 Буду рад любым подсказкам. Ну и интересная же штука этот ассемблер