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

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

14.09.2010, 12:27. Просмотров 4003. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Одномерный массив (fasm) (Assembler):

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

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

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

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

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

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

9
vital792
1997 / 1269 / 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
1997 / 1269 / 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
1997 / 1269 / 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
1997 / 1269 / 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}, где 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...

MSXML (Fasm)
Много раз уже слышал об этой библиотеке, но может ктнибудь покажет примерчик...

ИГРА FASM
Помогите пожалуйста напишите мне игру на FASM. Надо очень. Игра OpenGL. Спасибо...


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

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

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