Выборка из некоторого массива двойных слов без знака всех нечетных элементов - Assembler
Формулировка задачи:
Приветствую всех. Вот освоение асма. Боюсь накосячил. Надеюсь на помощь более опытных и буду признателен
Итак требуется:
Написать макрокоманду для выборки из некоторого массива двойных слов без знака всех нечетных элементов с заданным значением заданного поля. С помощью этой макрокоманды обработать два массива, выбирая из 1-го элементы со значением поля D13 - D10 = 1010, а из 2-го - элементы со значением поля D18 - D14 = 10101.
Итого:
Name z_23_2 Count1 = 5 ; кол-во элементов в 1 массиве Count2 = 6 ; кол-во элементов в 2 массиве Mask1 = 00000000000000000011110000000000b ; маска для выделения нужного поля 1 массива (D13-D10) Field1 = 00000000000000000010010000000000b ; задает значение поля для выборки эл-ов из 1 массива Mask2 = 00000000000001111100000000000000b ; маска для выделения нужного поля 2 массива (D18-D14) Field2 = 00000000000001010100000000000000b ; задает значение поля для выборки эл-ов из 2 массива ; сегмент данных Data Segment SrcMass1 dd Count1 dup (?) ; 1-й исходный массив SrcMass2 dd Count2 dup (?) ; 2-й исходный массив ResultMass1 dd 0 ; счетчик выбранных элементов из 1 массива dd Count1 dup(0) ; результирующий массив результата ResultMass2 dd 0 ; счетчик выбранных элементов из 2 массива dd Count2 dup(0) ; результирующий массив результата Data EndS ; сегмент стека - 16 двойных слов Stack Segment dd 16 dup(0) Top label double word Stack EndS ; сегмент кода Code Segment Assume cs:Code, ds:Data, ss:Stack ; макрокоманда выборки элементов из массива с заданным значением заданного поля ; входные параметры: ; Src - исходный массив ; Result- массив для результатов работы ; Count - кол-во элементов в массиве ; MaskX - маска для выделения нужного поля ; Field - значение поля для сравнения Select macro Src, Result, Count, MaskX, Field local m1, m2 mov si,offset Src ; настраиваем указатели на исходный и результирующий массивы mov di,offset Result mov word ptr [di],0 ; обнуление счетчика кол-ва выбранных эл-ов add di,type Result ; результирующий массив по смещению +2 относительно Result mov cx,Count ; счетчик основного цикла по кол-ву элементов массива ;повторим для нечетности add di,type Result ; результирующий массив по смещению +2 относительно Result mov cx,Count ; счетчик основного цикла по кол-ву элементов массива m1: mov ax,[si] ; выбираем очередной элемент mov bx,ax and bx,MaskX ; применяем к элементу маску MASKX, чтобы выделить только нужное поле xor bx,Field ; операция XOR даст ноль, если биты поля совпадают jnz m2 ; переход на m2 если в результате получился не 0 mov [di],ax ; иначе элемент подходит, сохраняем его в результирующий массив add di,type Result ; модификация адреса результирующего массива inc word ptr [Result] ; увеличение кол-ва выбранных элементов m2: add si,type Src ; модификация адреса исходного массива dec cx dec cx jnz m1 ; цикл по кол-ву элементов EndM ; точка старта Start: ; настройка сегментных регистров mov ax,Data mov ds,ax mov ax,Stack mov ss,ax lea sp,Top ; обработка первого массива Select SrcMass1, ResultMass1, Count1, Mask1, Field1 ; обработка второго массива Select SrcMass2, ResultMass2, Count2, Mask2, Field2 ; корректное завершение работы программы mov ah,4Ch int 21h Code EndS End Start
Решение задачи: «Выборка из некоторого массива двойных слов без знака всех нечетных элементов»
textual
Листинг программы
Name Program Count1 = 4 Count2 = 8 Data segment SrcMass1 dd 0CA0EEB01H,0A6B290DH,0FEF5EH,0FF44FFFFH ResultMass1 db 00H dd 4 DUP(?) Mask1 dd 03C00H Field1 dd 02800H Mask2 dd 07C000H Field2 dd 054000H SrcMass2 dd 0FFFD7FFFH, 07454600H, 04185C001H, 0FC054303H, 07D7C01H, 06054180H, 0784F24BH, 0799D4CE1H ResultMass2 db 00H dd 8 DUP (?) Data ends Stack SEGMENT DW 16 dup(?) StkTop LABEL word Stack ends Code SEGMENT ASSUME CS: Code, DS: Data, ES: Data, SS: Stack Select macro Src, Result, CountX, MaskX, FieldX local M1, M2 LEA SI, Src LEA DI, Result+1 MOV CX, CountX M1: MOV AX, [SI] MOV DX, [SI+2] TEST AX, 1 JZ M2 MOV BX, AX AND BX, WORD PTR MaskX CMP BX, WORD PTR FieldX JNZ M2 MOV BX, DX AND BX, WORD PTR MaskX+2 CMP BX, WORD PTR FieldX+2 JNZ M2 INC BYTE PTR [Result] MOV [DI], AX MOV [DI+2], DX ADD DI, 4 M2: ADD SI, 4 DEC CX JNZ M1 endm Start: MOV AX, Data MOV DS, AX MOV AX, Stack MOV SS, AX MOV SP, offset StkTop Select SrcMass1, ResultMass1, Count1, Mask1, Field1 Select SrcMass2, ResultMass2, Count2, Mask2, Field2 MOV ah,4Ch INT 21h code ends end start