Вопрос относительно программирования на ассемблере (с использованием библиотеки Masm Irvine32).
Я пытаюсь проверить и посчитать отрицательные числа в указанном массиве:
arrayW: 3, -2, 5, 7, 2, 9, -11, 32, -19, 18, 17, 15, -5, 2, 3, 1, -21, 27,-29, 20,
На выходе число, которое отображается, будет 6, потому что в массиве W 6 отрицательных элементов, а именно:
-2, -11, -19, -5, -21, -29.
Здесь я попробовал код, который вычисляет числа между (-2, 17) в данном массиве, но не может понять, как код для проверки и подсчета отрицательных элементов задан массив, может кто-нибудь, пожалуйста, помогите мне здесь
INCLUDE Irvine32.inc
.DATA
arrayW SDWORD 3, -2, 5, 7, 2, 9, -11, 32, -19, 18, 17, 15, -5, 2, 3, 1, -21, 27,-29, 20
initVal SDWORD -2
finalVal SDWORD 17
finalCount SDWORD ?
.CODE
between PROC
cmp eax,ebx
jg next3 ; if eax>ebx, 0<-EAX
cmp ebx,ecx
jg next3 ; if ebx>ecx, 0<-EAX
mov eax,1 ; 1 in EAX register if eax<=ebx and ebx<=eax
jmp next4
next3:
mov eax,0 ; if (eax<=ebx and ebx<=ecx) evaluates to false,
then 0<-EAX
next4:
;call DumpRegs ;Display the register contents
ret
between ENDP
main PROC
mov edi, 0
mov ecx, LENGTHOF arrayW
mov edx,0 ;EDX will hold the count of the elements in the array in the range [-2,17]
L1:
push ecx ;push the contents of counter register ecx to
stack
mov eax, initVal ;the element in the array should be <= -2
mov ebx,arrayW[edi] ;move the element in the array to ebx
mov ecx, finalVal ;the element in the array should be <= 17
call between ;between proc call
add edx,eax ;if the element is in the range [-2,17], add 1 to
EDX
add edi,TYPE arrayW ;add 4 to edi to move to the next element
pop ecx ;pop the value of counter register
loop L1 ;repeat the above for all the elements in the
array (until ecx is 0)
mov eax,edx ;Move the count to eax register
call WriteInt ;To display the output in decimal format
;call DumpRegs ;Display the register contents
exit
main ENDP
END main