Консультация № 174390
20.11.2009, 17:06
35.00 руб.
0 8 2
Задание на тему ОСОБЕННОСТИ РЕАЛЬНОГО РЕЖИМА МИКРОПРОЦЕССОРОВ 80386 и 80286.
Написать подпрограмму, просматривающую битовую строку и заменяющую все имеющиеся последовательности "111" на "000". Адрес строки задается парой регистров FS:DI, длина- регистром ECX. Для отладки подпрограммы составляется основная программа, определяющая необходимые структуры данных и вызывающая рабочую процедуру.

Обсуждение

давно
Посетитель
7438
7205
20.11.2009, 17:29
общий
Несколькло вопросов:
1) Адрес в FS:DI или все же в ES:DI ?
2) Длина - длина в байтах или в битах ?
3) Рассматриваем одну большую последовательность бит, т.е. рассматриваем в том числе случай, когда часть последовательности бит в одном байте, вторая в следующем ?
4) Биты в байте начинаются с младшего (нулевого) бита ?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
24116
698
20.11.2009, 18:23
общий
===Перенесено из формы ответа===
Ответ № 256740 от Колесников Иван Владимирович, 1-й класс
Здравствуйте, ItGirl07.
Длина строки задаётся в байтах или битах?
Ответил: Колесников Иван Владимирович, 1-й класс
===Перенесено из формы ответа===
Об авторе:
Действия даже самого крохотного существа приводят к изменениям во всей вселенной. [Никола Тесла]
Раздел Портала ССЫЛКИ
Неизвестный
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
5
Неизвестный
20.11.2009, 19:18
общий
21.11.2009, 00:53
это ответ
Здравствуйте, ItGirl07.
Предлагаю свой вариант программы. В соём решении я использую специфичную для 386 команду bts.
Из-за неполноты информации (см. вопросы в мини-форуме) в своей программе я предпологаю:
1) Длина строки задаётся в битах и может быть не кратна 8
2) Биты нумеруются от младшего к старшему, вся строка - единый массив бит

Приложение:
locals @@
model tiny
.386
.data
bits db 11100110b,11110000b
.code
org 100h
push DS
pop FS
mov di, offset bits
mov ecx, 16
call replace_bits
int 20h
; Замена в битовой строке комбинаций "111" на "000"
; Вход:
; FS:DI - адрес битовой строки
; ECX - длина строки в битах
replace_bits:
mov eax, 0 ; Начинаем с нулевого бита
mov edx, 0 ; Обнуляем счётчик подряд идущих не нулевых бит
@@1:
; Поиск комбинаций из трёх бит подряд
bt [fs:di], eax
jnc @@3 ; Бит равен 0 ;А не @@2 !!!!!!!!!!!!!! Кто будет обнулять счетчик EDX ?
inc edx
cmp edx, 3
jb @@2 ; Меньше 3 бит подряд
; Три бита подряд найденны - обнуляем
push eax
btc [fs:di], eax
dec eax
btc [fs:di], eax
dec eax
btc [fs:di], eax
pop eax
@@3: ;метка для сброса счетчика подряд идущих единичных бит !!!!!!!!!!!!!!!!!!!
mov edx, 0 ; Обнуляем счётчик подряд идущих не нулевых бит
@@2:
; Обрабатываем следующий бит
inc eax
loop @@1
retn
Неизвестный
20.11.2009, 21:38
общий
Да, спасибо большое, все правильно предположено. Длина строки в битах, нумерация с нулевого бита, строка рассматривается как непр. последовательность бит
Неизвестный
20.11.2009, 22:59
общий
Здравствуйте, хотя автор вопроса удовлетворен ответом, Я не понял результатов программы 2

первый ответ
было
11101111 11011110 01110011
стало
00001000 00010000 00000010

перепишем как предлагает автор, все верно
111101110111101111001110
000100000000100001000000

второй ответ
было
11100110 11110000
стало
11011110 00001100
как не крутил не понял результат
давно
Посетитель
7438
7205
21.11.2009, 00:58
общий
Колесников Иван Владимирович:
В Вашей программе была ошибка! Посмотрите исправленный код.
Хотя идея прекрасная! Только из-за этого не удалил неправильный ответ на платный вопрос.
Впредь будьте более внимательны, тщательно тестируйте свои программы!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
21.11.2009, 01:09
общий
Airyashov:
Чего тут непонятного? Это результат того, что счетчик не вовремя сбрасывался
Имеем биты 10011
Дойдя до первого нуля, счетчик единиц остался равным 2!!!
Дойдя до последней единицы, счетчик стал равным 3!!!!!
Начинаем инвертировать биты 100 по команде btc (1 в 0, а 0 при этом превращается в 1 !!!!!!!!)
В результате имеем: 01111 !!!!!!!!!!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа