Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2010, 12:30   #1
rozz
Пользователь
 
Аватар для rozz
 
Регистрация: 02.09.2010
Сообщений: 26
По умолчанию Организация циклов и работа с целочисленными одномерными массивами данных (fasm)

Помогите, пожалуйста, решить.

Задание:
Найти сумму последних L положительных элементов в массиве A-{a[i]}. Исходные данные должны быть размером 4 байта.
rozz вне форума Ответить с цитированием
Старый 08.09.2010, 13:22   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Покажи наработки - помогу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.09.2010, 14:14   #3
rozz
Пользователь
 
Аватар для rozz
 
Регистрация: 02.09.2010
Сообщений: 26
По умолчанию

format pe
jmp start
N dd 10 ; Здесь я задаю размер массива
A db -3, 5, 9, -67, 83, 54, -98, 45, 23, -6
IndPol dw ?
start:

mov esi, 0 ;

дальше я могу реализовать только на С =/
так
S=0;
for (i=L; i<count(a); i++)
{
if a[i]>0 {
S=S + a[i];}
}
rozz вне форума Ответить с цитированием
Старый 08.09.2010, 14:28   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
дальше я могу реализовать только на С
О! красота. Реализовывай на Си, а потом в CPU отладчика посмотри как будет выглядеть ассемблерный код - я так часто делаю чтоб узнать механизмы работы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.09.2010, 22:26   #5
rozz
Пользователь
 
Аватар для rozz
 
Регистрация: 02.09.2010
Сообщений: 26
По умолчанию

Код:
#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();
}
Ну это сама прога на С, если бы не асм, а С - проблем бы не было =/ А где именно смотреть код асма и здается мне, что там код будет гораздо сложней чем бы он был написан на самом фасме, т.е там он будет более глубже и насыщеней, где и будет вероятность того, что будет много того, чего мне не надо
rozz вне форума Ответить с цитированием
Старый 09.09.2010, 08:54   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

мда... Лень матушка?...
Ладно вот оригинальное решение
Код:
format PE console
entry start
 
include 'D:\fasmw16726\INCLUDE\win32a.inc'
 
section '.data' data readable writeable
p db 'pause',0
ru db 'Russian',0
fmat db '%d',9,0
l db 3
m1 db 'Найти сумму последних L положительных элементов в массиве A-{a[i]}. Исходные данные должны быть размером 4 байта. ',13,10,0
m2 db 13,10,'Результат =',0
a dd -3, 5, 9, -67, 83, 54, -98, 45, 23, -6

section '.code' code readable executable
start:
  cinvoke setlocale,0,ru
  cinvoke printf,m1
  ;****************************************
  mov esi,a
  mov ecx,9
aga:
  mov eax,[esi]
  push ecx
  cinvoke printf,fmat,eax
  pop ecx
  add esi,4
  loop aga
  ;****************************************
  cinvoke printf,m2
   mov ecx,9
   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'
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.09.2010, 12:58   #7
rozz
Пользователь
 
Аватар для rozz
 
Регистрация: 02.09.2010
Сообщений: 26
По умолчанию

Спасибо.
А у меня русский не хочет отображать, подскажешь, что сделать?
Стоит фасм под винду.

И еще в С я ввожу Л - т.е. ввожу с какого элемента надо искать сумму, а здесь - нет такого =/ Здесь уже нажал и сразу результат (

Последний раз редактировалось rozz; 09.09.2010 в 13:07.
rozz вне форума Ответить с цитированием
Старый 09.09.2010, 13:52   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А у меня русский не хочет отображать, подскажешь, что сделать?
Чесно? Не знаю. У меня тоже не ахти. Пиши на аглицком.

Цитата:
а здесь - нет такого
А это твое домашнее задание
Прикрутить функции scanf для ввода данных
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.09.2010, 14:17   #9
rozz
Пользователь
 
Аватар для rozz
 
Регистрация: 02.09.2010
Сообщений: 26
По умолчанию

Хорошо, попробую. Спасибо еще раз!
rozz вне форума Ответить с цитированием
Старый 10.09.2010, 11:41   #10
rozz
Пользователь
 
Аватар для rozz
 
Регистрация: 02.09.2010
Сообщений: 26
По умолчанию

Мои попытки дописать Л не удались: ( Помоги, пожалуйста, что я не правильно написала? Или чего же не написала ? Комменты написала: где я чего дописала и место - где мне выдает ошибку.
Код:
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
m1 db 'Найти сумму последних L положительных элементов в массиве A-{a[i]}. Исходные данные должны быть размером 4 байта. ',13,10,0
m2 db 13,10,'Результат =',0
m3 db 'Input l:',0 ; дописала эту строку

a dd -3, 5, 9, -67, 83, 54, -98, 45, 23, -6

l dw 0 ; дописала эту строку


section '.code' code readable executable
start:
  cinvoke setlocale,0,ru
  cinvoke printf,m1
  cinvoke scanf,fmat,l  ; дописала эту строку
  ;****************************************
  mov esi,a
  mov ecx,9
aga:
  mov eax,[esi]
  push ecx
  cinvoke printf,fmat,eax
  pop ecx
  add esi,4
  loop aga
  ;****************************************
  cinvoke printf,m2
   mov ecx,9
   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
  cinvoke scanf,fmat,m3 ; дописала строку
  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'
rozz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Организация циклов и работа с одномерными массивами DrDre Паскаль, Turbo Pascal, PascalABC.NET 4 26.08.2010 10:57
Организация циклов и работа с одномерными массивами dusya9992 Паскаль, Turbo Pascal, PascalABC.NET 1 25.08.2010 20:49
Организация циклов и работа с одномерными массивами ldinka135 Помощь студентам 4 23.08.2010 10:17
Организация циклов и работа с одномерными массивами в Borland C++ 3.1 Xeon332 Помощь студентам 8 25.12.2008 16:55
Организация циклов и работа с одномерными массивами Zenit10 Помощь студентам 9 17.01.2008 22:20