Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
rozz
3 / 3 / 0
Регистрация: 02.09.2010
Сообщений: 47
#1

Одномерный массив (fasm)

14.09.2010, 12:27. Просмотров 4055. Ответов 9
Метки нет (Все метки)

Здравствуйте!
Есть вот такое задание:

Задание:
Найти сумму последних L положительных элементов в массиве A-{a[i]}. Исходные данные должны быть размером 4 байта.

Есть вот такой вот код:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
format PE console
entry start
 
include 'C:\fasmw16918\INCLUDE\win32a.inc'
 
section '.data' data readable writeable
p db 'pause',0
ru db 'Russian',0
fmat db '%d',9,0
smat db '%d',0
m1 db 'Find the sum of the last L of positive elements in an array of A=(a [i]). Baselines should be size 4 bytes.',13,10,0
m2 db 13,10,'Result =',0
m3 db 'Input l:',0
 
a dd -3, 5, 9, -67, 83, 54, -98, 45, 23, -6
 
l db 0
 
section '.code' code readable executable
start:
  cinvoke setlocale,0,ru
  cinvoke printf,m1
  cinvoke printf,m3
  cinvoke scanf, smat,l
 ; cinvoke scanf, smat,m3
  ;****************************************
  mov esi,a
  mov ecx,10
aga:
  mov eax,[esi]
  push ecx
  cinvoke printf,fmat,eax
  pop ecx
  add esi,4
  loop aga
  ;****************************************
  cinvoke printf,m2
   mov ecx,10
   xor eax,eax
   mov dl, [l]
ugu:
   mov ebx, [esi]
   cmp ebx,0
   jl no
   add eax,[esi]
   dec dl
no:
  cmp ecx,0
  je done;
  sub esi,4
  cmp dl,0
  jne ugu
done:
  ;****************************************
  cinvoke printf,fmat,eax
  cinvoke system,p
  invoke ExitProcess,0
 
 
section '.idata' import data readable
 
library kernel,'kernel32.dll',\
        msvcrt,'msvcrt.dll'
 
import kernel,\
       ExitProcess,'ExitProcess'
 
import msvcrt,\
       setlocale,'setlocale',\
       printf,'printf',\
       scanf,'scanf',\
       system,'system'
Результат выводит, но он не верный, т.е. я ввожу Л=5, а оно мне считает сумму положительных не с 5 позиции, а с цифры 5, которая есть у нас в массиве(цифра 5 на второй позиции, а не на 5й). Ежели я ввожу другую цифру(положительную, которой нет в массиве),то оно считает вовсе сумму всех положительных .

Помогите, пожалуйста, доделать этот код.

Добавлено через 7 минут
Еще я написала на С сию программу(работает правильно), но лезть в дебаггер с ней не хочу, т.к. думаю, что будет много лишнего кода. Просто асм для меня гораздо сложней чем С..=/
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
void main()
{ clrscr();
 int S=0;
 int a[10]={10,-45, -67, 18, 89, -41, 1, 54, -33, 5};
 int L;
 
 cout<<"\n Input L:";
 cin>>L;
 
 for (int i= L-1; i<10; i++)
 { if (a[i]>0)
   {S=S+a[i]; } 
 }
   cout<<"\n Сумма: "<<S;
 
  getch();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2010, 12:27
Ответы с готовыми решениями:

Одномерный массив сдвиги
Дан массив Y1...Y20, построить массив Z1..Z20, элементы которого соответствуют...

Массив: двумерный -> одномерный
Добрый день вопрос таков, как в одномерный массив записать строку из...

Одномерный массив через цикл
Здравствуйте, помогите решить: Определить сумму нечетных чисел и количество...

Создать одномерный массив из двумерного
Дан двумерный массив: N EQU ? Y DB N*N DUP(?); Y Создать...

Турбо ассемблер: одномерный массив сдвиги
Дан массив Y1...Y20, построить массив Z1..Z20, элементы которого соответствуют...

9
vital792
1998 / 1270 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
14.09.2010, 13:46 #2
Цитата Сообщение от rozz Посмотреть сообщение
последних L положительных элементов
Если не ошибаюсь в этом случае и код на си работает не верно - находит не последних L положительных элементов, а сумму положительных элементах среди L последних... Может так и надо? то есть не правильно сформулировано задание?
0
rozz
3 / 3 / 0
Регистрация: 02.09.2010
Сообщений: 47
14.09.2010, 14:03  [ТС] #3
В С работает верно - Находит сумму положительных элементов с позиции Л.
Т.е. я ввожу позицию 4 допустим(позиция = Л), и должно найти сумму с 4й до 10й позиции (до конца массива) положительных элементов, т.е. сумму положительных элементов должно искать с 4й по 10ю, при этом отрицательные числа не берем в счет.
0
vital792
1998 / 1270 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
14.09.2010, 14:09 #4
Цитата Сообщение от rozz Посмотреть сообщение
с позиции Л
Так понятнее. Попробуйте так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
format PE console
entry start
 
include '\INCLUDE\win32a.inc'
 
section '.data' data readable writeable
p db 'pause',0
ru db 'Russian',0
fmat db '%d',9,0
smat db '%d',0
m1 db 'Find the sum of the last L of positive elements in an array of A=(a [i]). Baselines should be size 4 bytes.',13,10,0
m2 db 13,10,'Result =',0
m3 db 'Input l:',0
 
a dd -3, 5, 9, -67, 83, 54, -98, 45, 23, -6
 
l db 0
 
section '.code' code readable executable
start:
  cinvoke setlocale,0,ru
  cinvoke printf,m1
  cinvoke printf,m3
  cinvoke scanf, smat,l
 ; cinvoke scanf, smat,m3
  ;****************************************
  mov esi,a
  mov ecx,10
aga:
  mov eax,[esi]
  push ecx
  cinvoke printf,fmat,eax
  pop ecx
  add esi,4
  loop aga
  ;****************************************
  cinvoke printf,m2
   mov ecx,10
   xor eax,eax
   mov al, [l]
 
dec al
 
   sub ecx, eax
   shl eax, 2
   mov esi, a
   add esi, eax ; esi  &a[l]
   xor ebx, ebx
ugu:
  lodsd
  test eax, 8000h ; if(a[i]>0)
  jnz no
  add ebx, eax
no:
  loop ugu
done:
  ;****************************************
  cinvoke printf,fmat,ebx
  cinvoke system,p
  invoke ExitProcess,0
 
 
section '.idata' import data readable
 
library kernel,'kernel32.dll',\
        msvcrt,'msvcrt.dll'
 
import kernel,\
       ExitProcess,'ExitProcess'
 
import msvcrt,\
       setlocale,'setlocale',\
       printf,'printf',\
       scanf,'scanf',\
       system,'system'
2
rozz
3 / 3 / 0
Регистрация: 02.09.2010
Сообщений: 47
14.09.2010, 14:17  [ТС] #5
C
1
int a[10]={10,-45, -67, 18, 89, -41, 1, 54, -33, 5};

Вввожу Л=3 (при этом, т.к. в С начало с 0 я отнимаю -1 в цикле)
итого позиция три начинается с -67, 18, 89, -41, 1, 54, -33, 5
Т.к. в три отрицательное мы его не считаем, двигаемся дальше 18+89+1+54+5 =167

Одномерный массив (fasm)
0
rozz
3 / 3 / 0
Регистрация: 02.09.2010
Сообщений: 47
14.09.2010, 14:24  [ТС] #6
vital792, Вот, теперь считает правильно. Спасибо большое за помощь

Вопрос считаю решенным.
0
vital792
1998 / 1270 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
14.09.2010, 14:33 #7
не за что.
Цитата Сообщение от vital792 Посмотреть сообщение
test eax, 8000h ; if(a[i]>0)
не очень красивая проверка на положительность но я умнее не придумал(

Добавлено через 4 минуты
В принципе можно так
Assembler
1
2
or eax, eax
js no
по моему так грамотнее, хотя оба решения верны
2
rozz
3 / 3 / 0
Регистрация: 02.09.2010
Сообщений: 47
14.09.2010, 14:52  [ТС] #8
Да хорошо все придумал
Если я заменяю первое на второе - результат 0 выдает. Да ладно, я думаю и такой вариант(test eax, 8000h ; if(a[i]>0)) весьма приемлим

Еще раз - спасибо
0
vital792
1998 / 1270 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
14.09.2010, 15:03 #9
еще раз не за что. Тока один вопрос не решен остался. Я заменяю
Assembler
1
2
3
4
;  test eax, 8000h ; if(a[i]>0)
;  jnz no
   or eax, eax
   js no
и у меня тот же результат получается...
2
rozz
3 / 3 / 0
Регистрация: 02.09.2010
Сообщений: 47
14.09.2010, 15:49  [ТС] #10
Цитата Сообщение от vital792 Посмотреть сообщение
еще раз не за что. Тока один вопрос не решен остался. Я заменяю
Assembler
1
2
3
4
;  test eax, 8000h ; if(a[i]>0)
;  jnz no
   or eax, eax
   js no
и у меня тот же результат получается...
Это я невнимательная =/ Изиняюсь. Я заменила только or eax, eax, а jnz no - оставила, не заменив на js no.

Спасибо, теперь выводит верно.
0
14.09.2010, 15:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2010, 15:49

Сформировать одномерный массив A, где Ai вычисляется по формуле
Сформировать одномерный массив A= {a i} (i=1...30), где ai вычисляется по...

Сформировать одномерный массив A ={ai}, где ai вычисляется по формулам. TASM
Есть такое задание &quot;Сформировать одномерный массив A ={ai} (i= 1...30)&quot;, где ai...

fasm
org 100h mov cl,0 mov ch,255 cikl: mov ah,0eh shl ch,1 jc perivod mov...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru