20.11.2009, 18:47
общий
это ответ
Здравствуйте, ItGirl07.
Поскольку информация в вопросе не совсем полная — см. уточняющие вопросы в мини-форуме, моя функция написана в предположении, что
- длина строки задается в битах
- длина строки может быть не кратна 8 (тогда оставшиеся старшие биты предполагаются нулевыми)
- строка может быть любого размера (в пределах сегмента 64К)
- биты нумеруются от младшего к старшему в пределах байта, от младшего к старшему байтам при переходе между байтами. Младший байт расположен по меньшему адресу.
Исходный код — в приложении. Компилировать:
tasm bitstr.asm
tlink /t bitstr.obj
Проверял под Turbo Debugger.
Успехов!
Приложение:
locals @@
model tiny
.386
.data
test_str DB 0EFh, 0DEh, 73h
.code
ORG 100h
start:
push DS
pop FS
mov di,offset test_str
mov ecx,24
call replace_bits
int 20h
replace_bits PROC NEAR
; просматривает битовую строку и заменяет все имеющиеся последовательности "111" на "000"
; Вход: ECX - длина битовой строки
; FS:DI - адрес строки
add ecx,7 ; прибавляем 7, поскольку длина битовой строки может быть не кратна 8
shr ecx,3 ; длина строки в целых байтах
; реальный режим, поэтому здесь значение ECX не превосходит 64K, т.е. помещается в CX
mov dx,7 ; маска
mov al,FS:[di]
@@next_byte:
mov ah,0
cmp cx,1
je @@0
mov ah,[di+1] ; непоследний байт, подгружаем следующий
@@0:
mov bx,ax ; сохраняем (можно также в стеке - код короче, но медленнее)
and ax,dx
cmp ax,dx
mov ax,bx ; восстанавливаем
jne @@next_bit
; заменяем 111 на 000
not dx ; инвертируем маску
and ax,dx ; сбрасываем только нужные биты
cmp cx,1
je @@2
mov FS:[di],ax ; непоследний байт, сохраняем слово
jmp short @@3
@@2:
mov FS:[di],al ; последний байт, сохраняем только его
@@3:
not dx ; восстанавливаем маску
shl dx,3 ; и сдвигаем на 3 бита
jmp short @@1
@@next_bit:
shl dx,1
@@1:
test dl,dl
jnz @@0
; младший байт проверили полностью, сдвигаем к следующему байту
mov al,ah
movzx dx,dh
inc di
loop @@next_byte
ret
replace_bits ENDP
END start