Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/48: Рейтинг темы: голосов - 48, средняя оценка - 4.96
 Аватар для rozz
3 / 3 / 0
Регистрация: 02.09.2010
Сообщений: 50

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

14.09.2010, 12:27. Показов 9467. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.09.2010, 12:27
Ответы с готовыми решениями:

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

Массив: двумерный -> одномерный
Добрый день вопрос таков, как в одномерный массив записать строку из двумерного? mov ax,A mov B,ax Не выходит.

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

9
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
14.09.2010, 13:46
Цитата Сообщение от rozz Посмотреть сообщение
последних L положительных элементов
Если не ошибаюсь в этом случае и код на си работает не верно - находит не последних L положительных элементов, а сумму положительных элементах среди L последних... Может так и надо? то есть не правильно сформулировано задание?
0
 Аватар для rozz
3 / 3 / 0
Регистрация: 02.09.2010
Сообщений: 50
14.09.2010, 14:03  [ТС]
В С работает верно - Находит сумму положительных элементов с позиции Л.
Т.е. я ввожу позицию 4 допустим(позиция = Л), и должно найти сумму с 4й до 10й позиции (до конца массива) положительных элементов, т.е. сумму положительных элементов должно искать с 4й по 10ю, при этом отрицательные числа не берем в счет.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
14.09.2010, 14:09
Цитата Сообщение от 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
Сообщений: 50
14.09.2010, 14:17  [ТС]
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

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

Вопрос считаю решенным.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
14.09.2010, 14:33
не за что.
Цитата Сообщение от 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
Сообщений: 50
14.09.2010, 14:52  [ТС]
Да хорошо все придумал
Если я заменяю первое на второе - результат 0 выдает. Да ладно, я думаю и такой вариант(test eax, 8000h ; if(a[i]>0)) весьма приемлим

Еще раз - спасибо
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
14.09.2010, 15:03
еще раз не за что. Тока один вопрос не решен остался. Я заменяю
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
Сообщений: 50
14.09.2010, 15:49  [ТС]
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.09.2010, 15:49
Помогаю со студенческими работами здесь

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

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

Сформировать одномерный массив A, где Ai вычисляется по формуле
Сформировать одномерный массив A= {a i} (i=1...30), где ai вычисляется по формуле ai=(i/5+i/3)*10 0&lt;i&lt;31 помогите сделать)

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

Одномерный массив
Дан числовой вектор размера m. Найти минимальный из положительных и максимальный из отрицательных элементов. можно ли как то переделать? ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru