РЕДАКТИРОВАТЬ:
Я не ожидал, что этот вопрос набирает обороты так быстро.Исходя из ответов, которые я уже получил, кажется, я, возможно, пропустил важную часть информации.Шаблон не является фиксированным количеством битов .Некоторые буквы могут иметь больше или меньше битов.Т.е. B имеет 5 битов, но C может использовать до 6 битов, но ни один не использует больше байта.Я включил в свой вопрос пример битовой комбинации «А», в которой для каждой строки используется 7 бит.Также см. Правку внизу вопроса.
Я новичок в сборке.У меня есть битовый шаблон, который соответствует текстовому представлению письма.Каждый 1 представляет $ (или любой символ), и каждый 0 представляет пробел.Т.е.:
$$$$ 11110
$ $ 10001
$ $ 10001
$$$$ 11110
$ $ 10001
$ $ 10001
$$$$ 11110
$ 0001000
$ $ 0010100
$$$$$ 0111110
$ $ 1000001
Я написал программу на языке ассемблера, которая читает каждый шаблон и печатает правильный символ в зависимости от того, читает он 1 или 0. Чтобы определить, является ли он 1 или 0,I И регистр с 1 и затем вправо сдвигает биты количество раз, равное количеству битов в каждой строке, а затем сравнивает результат:
Обратите внимание, что биты для каждой строки хранятся в нижней частиотдельное 2-байтовое слово, которое я загружаю в 8-битный регистр.
patternb: dw 011110b,010001b,010001b,011110b,010001b,010001b,011110b
rowloop:
mov bl,[patternb+si] ;iterate through each element in binary array
patternloop:
mov bh,bl ;move bit pattern into register so that we can change it
and bh,1 ;AND register to find set bits and store back in register
shr bl,1 ;SHIFT original bit pettern right
cmp bh,1 ;check if bit is set or not (1=set, else 0)
je writesym ;if set, write symbol
jne writeblank ;if not set, write space
Проблема в том, как работает AND.Очевидно, что он начинается с наименее значимого бита и печатается, когда биты сдвинуты вправо, но это вызывает проблему, заключающуюся в том, что буква печатается в «обратном» порядке.Т.е.:
####
# #
# #
####
# #
# #
####
Я попробовал несколько манипуляций, но ни одна из них не работает.Я также попытался сместить и повернуть битовый шаблон, чтобы он соответствовал правильной печати, но это не сработает для каждой строки, поскольку не нужно манипулировать каждой строкой таким образом.(Например, строка 2 будет печататься правильно, без необходимости сначала манипулировать).У меня есть один и тот же метод битового шаблона для каждой буквы из AE.
В идеале я бы хотел, чтобы он как-то начинал сравнивать с наиболее значимым битом, который затем должен был бы печататься в правильном порядке ,но я не уверен, что делать с битами для достижения этой цели.
РЕДАКТИРОВАТЬ: После ответа Питера Дунихо, я хотел бы опубликовать некоторые вещи, которые я пробовал: Я пытался ИИспользуя шаблон с 10000b, затем вернем результат, чтобы получить ответ 00001b
, а затем сдвинем биты влево.Затем сравните результат, чтобы увидеть, какой символ должен быть напечатан.Это тоже не работает, но поскольку битовый шаблон не всегда фиксирован, это не будет решением в любом случае.
mov bh,bl ;move bit pattern into register so that we can change it
and bh,10000b ;AND register to find set bits and store back in register
rol bh,1 ;rol result to obtain 00001b
shl bl,1 ;SHIFT original bit pettern right
cmp bh,1 ;check if bit is set or not (1=set, else 0)
je writesym ;if set, write symbol
jne writeblank ;if not set, write space
Самое близкое, что я сейчас сделал для решения этой проблемы (с некоторой помощьюИсходя из ответа Питера Дунихо в качестве руководства), мой массив битов должен храниться как полная 8-битная форма (т.е. 011110000b
и т. д. вместо 011110b
, в противном случае ассемблер хранит его как 00011101
неявно, как упомянуто в ответе Мартина Розенау, который мы надеваемне нужно) И это с полным 10000000b
(так как мы используем не более 8 бит, и это позволяет нам проверять MSB) вместо 1 (000000001b
), как я пытался сделать раньше, а затем с помощьюROL и сравните подход выше (или просто сравните его с 10000000b
).Цикл выполняется в общей сложности 7 раз (из-за того, что каждая буква имеет 7 строчных / битовых шаблонов, за исключением A, в котором есть 4, поэтому A не печатается правильно, но эту проблему я могу решить самостоятельно с некоторыми условиями. Программа работает и печатаетправильно сейчас. Вот код, который я использовал:
mov bh,bl ;move bit pattern into register so that we can change it
and bh,10000000b ;AND register to find set bits and store back in register
rol bh,1 ;shift MSB to LSB to compare (or could just compare with 10000000b instead)
shl bl,1 ;SHIFT original bit pettern left
cmp bh,1 ;check if bit is set or not (or use cmp bh,10000000b and omit rol above)
je writesym ;if set, write symbol
jne writeblank ;if not set, write space
Я пометил решение Питера как ответ, так как именно он указал мне правильное направление, чтобы решить эту проблему. Но, как он упомянулЕсть множество способов решить эту проблему (как указано в различных опубликованных решениях), но мне просто оказалось, что его проще всего реализовать для собственного кода, к чему он стремился.
Ответ Мартина Розенау был также проницательным, особенно в отношении оптимизаций. Я постараюсь реализовать их, когда у меня будет больше времени, а затем обновлю решение выше.