Консультация № 182538
17.03.2011, 06:16
0.00 руб.
0 16 1
Здравствуйте! Прошу помощи в следующем вопросе:Помогите с программой на ассемблере под ОС Windows XP, для TASM.Программу прокомментировать.
Условие задачи:14. Дана двухбайтовая двоичная строка. Сформировать строку, в которой после каждого байта находится бит четности этого байта.

Заранее Спасибо!!!!

Обсуждение

Неизвестный
17.03.2011, 10:26
общий
Код:
;Загружаем в регистр al первый байт данных.
;Где _data это указатель на двух байтовую строку.
mov al, byte ptr [_data]
;Копируем байт в регистр ah
mov ah, al
;Получаем в ah бит чётности, в al остаётся исходный байт, без изменений
and ah, 1
;переносим полученные байты в старшие разряды 32-х битного регистра eax
shl eax, 16
;Загружаем в регистр al второй байт данных.
mov al, byte ptr [_data+1]
;Копируем байт в регистр ah
mov ah, al
;Получаем в ah бит чётности, в al остаётся исходный байт, без изменений
and ah, 1
;Так как у нас в старших разрядах регистра eax
;находится результат с первым байтом, а в младших со вторым,
;меняем местами старшие 2 байта и младшие в регистре eax.
ror eax, 16
;записываем результат. _bufer -указатель на строку с ответом,
;al (исходный 1-й байт) записывается в первый байт,
;ah (байт содержащий бит чётности 1-го байта) во второй,
;с 16-го по 23-й биты регистра eax (исходный 2-й байт)
;записывается 3-м, биты с 24-го по 31-й регистра eax
;(байт содержащий бит чётности 2-го байта) записывается 4-м
mov dword ptr [_bufer], eax


Я уже давно пишу на FASM и подзабыл синтаксис создания заголовков на TASM. Поэтому пишу не в ответах, а в мини форуме.
давно
Посетитель
7438
7205
17.03.2011, 10:50
общий
Слегка отформатировал для удобочитабельности
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
17.03.2011, 10:53
общий
Только вот полагаю, что Вы неправильно решили задачу...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
17.03.2011, 10:58
общий
Адресаты:
Здравствуйте, уточните, пожалуйста:
Что понимается под "двухбайтовая двоичная строка"?
Строка из 16 символов 0 и 1?
Требуется добавить после каждых 8 бит четности, такой, чтобы было четное/нечетное число единиц?
Кстати, четное или нечетное?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
17.03.2011, 10:58
общий
Адресаты:

Спасибо за форматирование. А что не правильно?
давно
Посетитель
7438
7205
17.03.2011, 11:00
общий
Почитайте мое сообщение...
Подождем ответа...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
17.03.2011, 11:00
общий
Цитата: Бит чётности
В вычислительной технике и сетях передачи данных би́том чётности называют контрольный бит, служащий для проверки общей чётности двоичного числа (чётности количества единичных битов в числе).


Это значит, что нужно считать количество бит в байте, а не обнулять старшие разряды.

Примерно так:
xor bx,bx
mov cx,8
push ax
@@01:
shr al,1
adc bl,0
loop @@01
pop ax
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
17.03.2011, 11:02
общий
Адресаты:
Можно еще проще
jp ответит на все вопросы
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
17.03.2011, 11:06
общий
Адресаты:
А о флаге PF, как-то и забыл.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
17.03.2011, 11:10
общий
Адресаты:
Хотя, с другой стороны, если имеем строку 0 и 1, то, по-любому, придется проверять каждый код...
Так что, возможны варианты
Ждем-с автора...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
17.03.2011, 12:57
общий
Мда..., однозначно, я не прав!
давно
Посетитель
7438
7205
17.03.2011, 17:51
общий
Адресаты:
Ну и? Почему тут не отвечаете на поставленные вопросы?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
276566
297
18.03.2011, 09:09
общий
Адресаты:
Здравствуйте! Двухбайтовая двоичная строка представляет из себя к примеру регистр АХ в котором записано к примеру 0101011110001100
давно
Посетитель
7438
7205
18.03.2011, 09:25
общий
Адресаты:
И опять же не на все вопросы дан ответ...
Я еще спрашивал:
Кстати, четное или нечетное?
Т.е., дополняем до четного или нечетного числа единиц.
В сетях передачи данных обычно используется нечетное, чтобы не было посылки из одних нулей, что важно для распознавания.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
276566
297
18.03.2011, 11:24
общий
Адресаты:
до четного
давно
Посетитель
7438
7205
18.03.2011, 11:36
общий
это ответ
Здравствуйте, Magma!
Вот и программа. Смотрите комментарии в теле программы...
Надеюсь, разберетесь самостоятельно. Если нет, милости просим в мини-форум

[code h=200]
.model tiny ;для формата COM
.code
org 100h ;для формата COM
start: ;точка входа
mov ax, 0101011110001100b ;наша двухбайтовая двоичная строка
call FormParityString;выведем

lea dx, sPress ;'Press any key'
mov ah, 9
int 21h

mov ah, 8 ;подождем нажатия на клавишу (чтобы консоль осталась на экране)
int 21h

mov ax, 4c00h ;выход в ДОС
int 21h

;подпрограмма вывода слова побайтно в виде последовательности бит с битом четности
;выводятся биты в порядке мл бит первым, байты аналогично - мл байт первым
;бит четности для наглядности отделен пробелом и выводится после байта
FormParityString proc
push ax ;сохраним старший байт
call PrintByteWithParity ;выведем младший байт
pop ax ;восстановим
mov al, ah ;выведем старший байт
PrintByteWithParity: ;выведем байт из al
push ax ;соохраним для анализа четности

mov ah, 2 ;функция вывода символа из dl на экран
mov cx, 8 ;всего 8 бит
PrintByteBinLoop:
shr al, 1 ;C = мл биту
mov dl, '0' ;формируем код '0' или '1'
adc dl, 0 ;сложим с битом переноса = очередному биту
push ax ;сохраним байт с остальными битами
int 21h ;выведем
pop ax ;восстановим
loop PrintByteBinLoop;по всем битам

mov dl, ' ' ;отделим пробелом
int 21h

pop ax ;наш байт
test ax, ax ;проверим на четность
mov dl, '0' ;формируем код '0' или '1'
jp PrintParity ;флаг PF отвечает за четность, PF = 1 означает четное число единиц
inc dl ;для нечетного выводим '1'
PrintParity:
mov ah, 2 ;выводим
int 21h
mov dl, ' ' ;отделим пробело
int 21h
ret
FormParityString endp

.data
sPress db 0dh,0ah,'Press any key$'

end start
[/code]

Вывод программы:
Код:
00110001 1 11101010 1
Press any key
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа