Найти сумму всех элементов массива равных последнему - 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 <метка>
^Решение задачи: «Найти сумму всех элементов массива равных последнему»
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