Найти сумму всех элементов массива равных последнему - Assembler

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

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

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
 
          .486                                      ; create 32 bit code
          .model flat, stdcall                      ; 32 bit memory model
          option casemap :none                      ; case sensitive 
 
    ;     include files
    ;     ~~~~~~~~~~~~~
          include \masm32\include\windows.inc       ; main windows include file
          include \masm32\include\masm32.inc        ; masm32 library include
 
        ; -------------------------
        ; Windows API include files
        ; -------------------------
          include \masm32\include\gdi32.inc
          include \masm32\include\user32.inc
          include \masm32\include\kernel32.inc
          include \masm32\include\Comctl32.inc
          include \masm32\include\comdlg32.inc
          include \masm32\include\shell32.inc
          include \masm32\include\oleaut32.inc
          include \masm32\include\ole32.inc
          include \masm32\include\msvcrt.inc
 
          include \masm32\include\dialogs.inc       ; macro file for dialogs
          include \masm32\macros\macros.asm         ; masm32 macro file
 
    ;     libraries
    ;     ~~~~~~~~~
          includelib \masm32\lib\masm32.lib         ; masm32 static library
 
        ; ------------------------------------------
        ; import libraries for Windows API functions
        ; ------------------------------------------
          includelib \masm32\lib\gdi32.lib
          includelib \masm32\lib\user32.lib
          includelib \masm32\lib\kernel32.lib
          includelib \masm32\lib\Comctl32.lib
          includelib \masm32\lib\comdlg32.lib
          includelib \masm32\lib\shell32.lib
          includelib \masm32\lib\oleaut32.lib
          includelib \masm32\lib\ole32.lib
          includelib \masm32\lib\msvcrt.lib
 
    ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
 
    ; ************************************************************************
    ;    include \masm32\include\masm32rt.inc
    ; ************************************************************************
 
    .data?
    ;Result dd  ?
    ;lpBuf1 db  1024 dup(?) ; temp Buffers  
 
    .data
        buffer_for_string db 10 dup(0)
        title_string db "Результат:  ",0
        szformat db "%u",0Dh,0Ah,0      ; изменяем формат вывода на dec
        mas dw 3,2,3,6,2,3,19,3
        end_point dw 8 ; end_point < mas.length
    .code
    start:
    ; ************************************************************************
    main proc
    ;   LOCAL Result        :DWORD
    ;   LOCAL var_00        :DWORD
    ;   LOCAL var_01        :BYTE
 
    ;Обнуляем регистры
    xor eax,eax
    xor ebx,ebx
    xor ecx,ecx
    xor edx,edx
    ;=================
    mov cx,end_point        ;Кол-во шагов в цикле
    mov dx,1        ;Нач. знач. для перемножения
    go:
    mov si,ax
    shl si,1
    mov bx,mas[si]
    inc ax
    
    test bx,1 
    mov dx,3
    cmp dx,si 
    ;jp goto1       ;Сравнение элементов массива с 3
    call mypr       ;Вызов процедуры перемножения
    goto1:
    
    loop go ;------------------------------- Sift Ice
    
    ;________________________________
    push edx
    push offset szformat
    push offset buffer_for_string
    call wsprintf
    
    push MB_OK
    push offset title_string
    push offset buffer_for_string
    push 0
    call MessageBox
    
    push 0
    call ExitProcess
    ;________________________________
    
    main endp
    ; ************************************************************************
    ; ************************************************************************
    mypr proc
    ;test bx,bx
    ;js minus_zn
    jmp end_test
    minus_zn:
    ;imul dx,bx     ;Перемножение
    sub dx,bx       ; Сумма
    end_test:
    RET
    mypr endp
    ; ************************************************************************
    ; ************************************************************************
    end start

    Comment ^
    Каркас программы
 
    .386
    .MODEL Flat, STDCALL
    .DATA
    <Ваша инициализиpуемые данные>
    ......
    .DATA?
    <Ваши не инициализиpуемые данные>
    ......
    .CONST
    <Ваши константы>
    ......
    .CODE
    <метка>
    <Ваш код>
 
    .....
 
    end <метка>
    ^
Т.е. должно быть 9 в итоге, у меня выводит три, видимо потому что использую регистр DX, но у меня больше нету РОН для использования AX,BX,CX,DX уже использованы, что я делаю неправильно?

Решение задачи: «Найти сумму всех элементов массива равных последнему»

textual
Листинг программы
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
 
          .486                                      ; create 32 bit code
          .model flat, stdcall                      ; 32 bit memory model
          option casemap :none                      ; case sensitive 
 
    ;     include files
    ;     ~~~~~~~~~~~~~
          include \masm32\include\windows.inc       ; main windows include file
 
        ; -------------------------
        ; Windows API include files
        ; -------------------------
          include \masm32\include\user32.inc
          include \masm32\include\kernel32.inc
 
    ;     libraries
    ;     ~~~~~~~~~
          includelib \masm32\lib\masm32.lib         ; masm32 static library
 
        ; ------------------------------------------
        ; import libraries for Windows API functions
        ; ------------------------------------------
          includelib \masm32\lib\user32.lib
          includelib \masm32\lib\kernel32.lib
    ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
 
    ; ************************************************************************
    ;    include \masm32\include\masm32rt.inc
    ; ************************************************************************
 
    .data?
    ;Result dd  ?
    ;lpBuf1 db  1024 dup(?) ; temp Buffers  
 
    .data
        buffer_for_string db 10 dup(0)
        title_string db "Результат:  ",0
        szformat db "%u",0Dh,0Ah,0      ; изменяем формат вывода на dec
        mas dw 3,2,3,6,2,3,19,3
        len equ (($-mas)/2)-1
    .code
    start:
    ; ************************************************************************
    main proc
 
    mov esi,offset mas
    mov ecx,len
    movzx ebx,word ptr [esi+ecx*type mas]
    xor edx,edx
    xor eax,eax
    
    @@:
    lodsw
    cmp eax,ebx
    jnz @1
    add edx,eax
    @1:
    loop @b
 
    push edx
    push offset szformat
    push offset buffer_for_string
    call wsprintf
    
    push MB_OK
    push offset title_string
    push offset buffer_for_string
    push 0
    call MessageBox
    
    push 0
    call ExitProcess
    ;<br>
    main endp
    end start

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


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

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

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