sseg segment stack ;объявление стека размером 64 байта db 64 dup(?) sseg ends dseg segment ;объявление сегмена данных arr dw 1,2,3,4,5,6,7 ;обрабатываемый массив narr dw narr-arr-2 ;смещение последнего элемента массива относительно начала массива; т.е. т.к. массив состоит из слов ;(каждое слово 2 байта), фактически тут записано количество_элементов_массива*2-2 ;-2 нужно, т.к. индексация массива начинается с 0 (т.е. 1й элемент - arr[0]) result_arr dw 255 dup(?) ;результирующий массив dseg ends cseg segment ;программный сегмент assume cs:cseg,ss:sseg,ds:dseg ;директива компилятору, чтобы он знал какие сегменты считать сегментами стека, данных и кода main proc far ;основная процедура push ds ; | xor ax,ax ;| push ax ; |сохранение адреса возврата из программы (ret в конце программы вернёт управление по этому адресу) - на начало ; PSP. короче, эта магия необходима, и без неё никак mov ax,dseg ;| mov ds,ax ; |инициализация сегмента данных ;------------- mov si,narr ;запись в si адреса последнего элемента массива mov cl,4 ;нужно, чтобы потом выполнять логические сдвиги на 4 бита process: mov ax,arr[si] ;в ax записываем элемент, на который указывает si mov bx,ax ;копируем ax в bx and bx,0f00fh ;в bx обнуляем все биты, кроме старших 4х и младших 4х and ax,0ff0h ;в ах обнуляем младшие 4 и старшие 4 бита shr bh,cl ;сдвигаем старшие биты в младший адрес, чтоб потом записать их в младшие биты shl bl,cl ;сдвигаем младшие биты в старший адрес, чтоб потом записать их в старшие биты or ah,bl ;запись старших битов на место младших or al,bh ;запись младших битов на место старших mov result_arr[si],ax ;запись обработанного элемента в результирующий массив sub si,2 ;переход к следующему элементу (т.е. к элементу, стоящему перед текущим) jns process ;если si>=0 то продолжить обработку ;------------- ret ;возврат из программы main endp cseg ends end main ;указание линковщику, какая процедура является главной |