Bинoгpaдoв Aлeкceй (11.12.2003 15:28, просмотров: 10985)
Господа, а вот в 80х86 нет нормального битового процессора. Написал сегодня кодер CRC на асме (+) но, как мне кажется, получилось криво. Например, может, я и ламер, но регистр с ОС смог сделать только через команды типа jc или jnc:
А как сделать по-правильному ?
;Пример реализации кодера циклического кода (CRC). Кодируется байт.
;Кодовый полином - X^4 + X + 1.
;Схематически кодер выглядит так:
;
; _____________________________________________________
; | ______________ | S1
; | | | /
;Вход__V__ | _____ __V__ _____ _____ _____ |Выход
;-o>| Xor |-a->|Rem_0|->| Xor |-b->|Rem_1|->|Rem_2|->|Rem_3|-o- /->
; | |_____| |_____| |_____| |_____| |_____| |_____| / S2
; |____________________________________________________________|
;
; _____
;Здесь : | Xor | - элемент "Исключающее "ИЛИ"
; |_____|
; _____
; |Rem_x| - "X" - бит остатка. Биты записываются в триггеры
; |_____|
;
; V - изображает стрелочку, направленную вниз
; o - просто узел (т.е. соединение) на электрической схеме
; a - узел "a" (т.е. соединение) - выход первого "Исключающее "ИЛИ"
; b - (в этом узле соединений нет) - выход второго "Исключающее "ИЛИ"
;
;Сначала S1 замкнут, S2 - в нижнем положении. На схему поступает кодируемый
;байт (старшими разрядами вперед). Одновременно байт поступает на выход через
;контакты переключателя S2. После поступления восьмого бита остаток от деле-
;ния на образующий полином уже известен. Поэтому S1 размыкается, а S2 перево-
;дится в верхнее положение. Подаются четыре тактовых импульса, и остаток ста-
;ршими разрядами вперед выдается в линию связи.
prg segment
assume cs:prg,ds:prg,es:prg,ss:prg
.386
org 100h
start: mov al,81h ;Кодируемое слово (подставьте свое слово)
;Обнуление битов остатка и узлов "a" и "b"
mov ah,0 ;ah.7...ah.4 - биты остатка Rem_3...Rem_0
mov cl,8 ;8 бит нужно подать на вход кодера
;Вычисляем узел "a":
crc_coder: mov bx,0 ;Сбросим узлы "a" и "b" в ноль
rol al,1 ;Старший бит регистра AL - во флаг "C"
jnc test_rem_3 ;Бит равен 0 - проверим бит остатка Rem_3
bt ax,15 ;Бит Rem_3 равен единице ?
jnc set_node_a ;Rem_3 = 0, AL.7 = 1 -> узел "a" = 1
jmp count_b ;Rem_3 = AL.7 = 1 -> узел "a" = 0
test_rem_3:bt ax,15 ;Проверим бит Rem_3
jnc count_b ;Rem_3 = AL.7 = 0 -> узел "a" = 0
set_node_a:bts bx,0 ;Rem_3 = 1, AL.7 = 0 -> узел "a" = 1
;Вычисляем узел "b"
count_b: bt bx,0 ;Поместим узел "a" во флаг "C"
jnc test_rem_1 ;Бит равен 0 - проверим бит остатка Rem_1
bt ax,12 ;Бит Rem_1 равен единице ?
jnc set_node_b ;Rem_1 = 0, узел "a" = 1 -> узел "b" = 1
jmp define_rem_3 ;Rem_1 = узел "a" = 1 -> узел "b" = 0
test_rem_1:bt ax,12 ;Проверим бит Rem_1
jnc define_rem_3 ;Rem_1 = узел "a" = 0 -> узел "b" = 0
set_node_b:bts bx,1 ;Rem_1 = 1, узел "a" = 0 -> узел "b" = 1
;Вычисляем бит остатка "Rem_3"
define_rem_3:
bt ax,14 ;Поместим "Rem_2" во флаг "C"
jc set_rem_3
and ah,01111111b
jmp define_rem_2
set_rem_3: or ah,10000000b
;Вычисляем бит остатка "Rem_2"
define_rem_2:
bt ax,13 ;Поместим "Rem_1" во флаг "C"
jc set_rem_2
and ah,10111111b
jmp define_rem_1
set_rem_2: or ah,01000000b
;Вычисляем бит остатка "Rem_1"
define_rem_1:
bt bx,1 ;Поместим узел "b" во флаг "C"
jc set_rem_1
and ah,11011111b
jmp define_rem_0
set_rem_1: or ah,00100000b
;Вычисляем бит остатка "Rem_0"
define_rem_0:
bt bx,0 ;Поместим узел "a" во флаг "C"
jc set_rem_0
and ah,11101111b
jmp check_the_end
set_rem_0: or ah,00010000b
check_the_end:
dec cl ;Все-ли восемь битов уже обработаны ?
jz prg_end
jmp crc_coder
prg_end: int 20h ;Завершим программу
prg ends
end start