Задание:
14. Написать подпрограмму, формирующую из заданной битовой строки новую путем удаления каждого второго бита (т.е. стpока становится в два раза короче). Результат помещается на место исходной строки. Адрес строки задан парой GS:SI, длина (в битах) — регистром DX
Общая схема решения задачи:
Раз результат нужно поместить на место исходной строки, то все действия можно делать прямо в ней. Для выполнения этого задания нужно хранить два значения: номер считываемого бита и номер устанавливаемого бита в текущем считываемом и устанавливаемом байте соответственно (eсx, ebx). Для хранения смещения считываемого и устанавливаемого байта тоже нужно два регистра (SI, DI). Сначала нужно проверить бит и сбросить его в 0. Если он был установлен, то бит, номер которого хранится в ebx, байта, смещение которого хранится в DI установить в 1. После чего нужно уменьшить значения ecz на 2 и ebx на 1 с проверкой на -1. Если какое либо из этих значений установится в -1 (FFFFh) , то следует его установить в 7 и соответствующее смещение увеличить на 1. Также нужно считать номер текущего бита в строке. если он установится в 0, то процесс завершается.
Текст программы на ассемблере:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
;//Лабораторная работа №4. Особенности реального режима микропроцессора Intel 80x86 .386 ;Определение данных data segment use16 ddd db "stroka"; s db 10101010b,00000000b,00000000b,00000000b,00000000b;//Битовая строка data ends ; Сегмент кода code segment use16 assume cs:code,ds:data start: mov ax,data ; настроить сегментный mov ds,ax ; регистр DS на данные mov gs,ax; mov si,offset s; mov dx,8; call MyProc; mov ah,4ch; int 21h; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;процедура, формирующая из заданной битовой строки новую ;;путём удаления каждого второго бита (т. е. строка становится в 2 раза короче MyProc proc ;;//Сохраняем старое значение регистра данных push ds; mov ax,gs; mov ds,ax; ;;//Переходим собственно к выполнению задания mov di,si; mov bx,7; m_loop1: mov cx,7;//Номер проверяемого бита m_loop: btr dword ptr[si],ecx; jnc notsetbit; bts dword ptr[di],ebx; notsetbit: dec cx; dec bx; ;;//Проверка, нужно ли завершать цикл dec dx; cmp dx,0h; je exit; dec dx; cmp dx,0h; je exit; ;;Проверка не пора ли снова задать ebx; cmp bx,0FFFFh; jne nozero; mov bx,7; add di,1; nozero: ;;//Так как записывается каждый второй бит, то умуньшаем cx ещё на 1 cmp cx,0FFFFh; je m1; btr dword ptr[si],ecx; dec cx; m1: cmp cx,0FFFFh; jne m_loop; ;//Если cx<0 то увеличиваем si (перезодим к следующему байту) add si,1; jmp m_loop1; exit: pop ds; ret; MyProc endp code ends end start |
Результаты работы программы:
Номер опыта | Битовая строка | Количество бит | Ожидаемый результат | Реальный результат |
1 | 11100000000b | 3 | 1100000000b | 11000000b |
2 | 11111111b 11100000b | 10 | 11111000b | 11111000b |
3 | 10101010b | 8 | 11110000b | 11110000b |
Вывод: полученная программа работает верно.