Выборка из некоторого массива двойных слов без знака всех нечетных элементов - 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

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы