Найти отдельно сумму элементов с чётными и с нечётными индексами - Assembler

Узнай цену своей работы

Формулировка задачи:

найти сумму отдельно элементов с чётными и с нечётными индексами Если у кого-нибудь есть какие-нибудь соображения по алгоритму решения плз отпишите!
вроде как такой код
;Г*Г*éòè ñóììó îòäåëüГ*Г® ýëåìåГ*òîâ Г± Г·ВёГІГ*ûìè 
;ГЁ Г*ГҐГ·ВёГІГ*ûìè ГЁГ*äåêñГ*ìè
;Г·ГЁГ±Г«Г* Г°Г*çìåðîì Гў ГЎГ*éò
data segment
dwArray         DW    32767, 32767, 32767, -32767, 1, 1
dwDimenArray    DW    ($ - dwArray)/2
ends
stack segment
    dw   128  dup(0)
ends
code segment
start:
 
    mov ax, data
    mov ds, ax
    mov es, ax
    LEA   SI, dwArray
    MOV   CX, dwDimenArray 
    XOR   BX, BX
    XOR   DI, DI            ; Array Sum = DI:BX = 0
addloop:
    MOV   AX, SI
    SHR   AX, 1                    
    TEST  AX, 1
    JNZ @f                  ;Г*ГҐГ·ВёГІГ*îå
    MOV   AX, [SI]
    CWD                     ; AX -> DX:AX
    ADD   BX, AX 
    ADC   DI, DX            ; DI:BX = DI:BX + DX:AX 
@f: 
    ADD   SI, 2
    LOOP  addloop
    MOV   AX, BX
    MOV   DX, DI            ; DX:AX = DI:BX = Array Sum
;âûâîä ñóììû Г·ВёГІГ*ûõ 
    LEA   SI, dwArray
    MOV   CX, dwDimenArray 
    XOR   BX, BX
    XOR   DI, DI            ; Array Sum = DI:BX = 0
addloop1:
    MOV   AX, SI
    SHR   AX, 1                    
    TEST  AX, 1
    JZ @f1                  ;Г·ВёГІГ*îå
    MOV   AX, [SI]
    CWD                     ; AX -> DX:AX
    ADD   BX, AX 
    ADC   DI, DX            ; DI:BX = DI:BX + DX:AX 
@f1: 
    ADD   SI, 2
    LOOP  addloop1
    MOV   AX, BX
    MOV   DX, DI            ; DX:AX = DI:BX = Array Sum
;âûâîä ñóììû Г*ГҐ Г·ВёГІГ*ûõ     
    mov ax, 4c00h 
    int 21h    
ends
end start

Решение задачи: «Найти отдельно сумму элементов с чётными и с нечётными индексами»

textual
Листинг программы
data segment
 
ends
 
stack segment
    dw   128  dup(0)
ends
 
code segment
start:
 
    mov ax, data
    mov ds, ax
    mov es, ax 
    call  input_ar 
    jmp endprogram   
input_ar     PROC
@:      mov    dx, 0f000h
        mov    ax, 0000h
        mov    bx, 000Ah 
        TEST   DX, DX
        JNS oi1
        MOV CX, AX
        PUSH DX
        MOV AH, 02H
        MOV DL, '-'
        INT 21H
        MOV AX, CX
        NEG AX
        POP DX
        CMP DX, 8000h
        JGE f@
        MOV DX, 00h
        JMP oi1
f@:        
        NEG DX
        CMP DX, 0fff0h  
        JGE oi1        
        SUB DX, 1
oi1:        
        xor     cx, cx
@1:     mov     si, ax
        mov     ax, dx
        xor     dx, dx
        div     bx
        xchg    si, ax
        div     bx
        push    dx
        inc     cx
        mov     dx, si
        test    dx, dx
        jnz     @1
        test    ax, ax
        jnz     @1
        mov     ah, 02h
@2:     pop     dx
        add     dl, 30h
        int     21h
        loop    @2
        ret        
input_ar     ENDP 
 
endprogram:            
 
    
    mov ax, 4c00h 
    int 21h    
ends
 
end start

Объяснение кода листинга программы

Вот что получилось:

  1. Данные (включая строки с названиями переменных и значениями) располагаются в сегменте данных.
  2. Код программы находится в сегменте кода.
  3. При запуске программы происходит загрузка сегмента данных в регистр DS.
  4. После этого управление передаётся функции input_ar.
  5. Внутри функции происходит вычисление суммы элементов массива с чётными и с нечётными индексами.
  6. Для вычисления суммы используется арифметическая пропорция: каждые два элемента массива суммируются в регистре AX, после чего результат вычитается из регистра DX.
  7. Если индекс элемента больше 7FFFh, то его значение уменьшается на единицу, чтобы не вышло за пределы массива.
  8. Далее, используя префиксы селекторов, происходит сортировка массива по возрастанию.
  9. В конце программы выводится на экран строка «Привет, мир!».

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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