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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2010, 23:18   #1
StudeHt
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 78
По умолчанию Assembler в Pascal

Здравствуйте, уважаемые эксперты! Есть задание:найти сумму элементов массива. Вот получившийся код:
Код:
uses crt;
const MaxSize=100;
type TMas=array[1..MaxSize] of integer;
var Mas:TMas;
    n,i,Sum:integer;
begin
  clrscr;
  repeat
    write('Введите количество элементов массива: ');
    readln(n);
  until n in [2..MaxSize];
  for i:=1 to n do
    begin
      write('Введите элемент №',i,':');
      readln(Mas[i]);
    end;
  clrscr;
  writeln('Массив имеет вид:');
  for i:=1 to n do
    write(Mas[i],' ');
  asm
    xor ax,ax
    xor bx,bx
    mov cx,n
    lea ax,Mas {помещаем адрес массива в ax}
    mov al,byte ptr Mas
    add bx,ax
    inc cx
    mov Sum,bx
  end;

  {Sum:=0;
  for i:=1 to n do
    Sum:=Sum+Mas[i];}
  writeln;
  writeln('Сумма массива равна ',Sum);
  readln;
end.
Но ответ выдает неверный.. Помогите найти ошибку, заранее огромное спасибо!!!
StudeHt вне форума Ответить с цитированием
Старый 10.05.2010, 23:57   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Скажите честно вы понимаете, что делает ваш код на асме?
p51x вне форума Ответить с цитированием
Старый 11.05.2010, 00:02   #3
StudeHt
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 78
По умолчанию

Если бы я понимал, что он делает, то я бы не просил помоч исправить ошибку.. С assembler'ом почти не сталкивался, так что почти совсем не знаю..
{--------------------------------}
Насколько я понял, здесь выводится первый элемент массива, т.е. не происходит суммирование.

Последний раз редактировалось StudeHt; 11.05.2010 в 00:30.
StudeHt вне форума Ответить с цитированием
Старый 11.05.2010, 03:14   #4
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

Код:
uses
  crt;
label
  l1;
const
  MaxSize=100;
type
  TMas = array [1..MaxSize] of integer;
var
  Mas : TMas;
  n, i: integer;
  Sum : integer;
begin
  clrscr;
  repeat
    write ('Enter quantity of elements: ');
    readln(n);
  until n in [2..MaxSize];
  for i:=1 to n do
  begin
    write ('Enter the element N',i,': ');
    readln(Mas[i]);
  end;
  clrscr;
  writeln('Array has a view: ');
  for i:=1 to n do
    write (Mas[i],' ');
  asm
    xor ax,ax {очистка, более быстрая, чем mov ax, 0}
    xor bx,bx {аналогично}
    mov Sum,0 {инициализация суммы нулем}
    mov cx,n {счетчик цикла всегда в cx, так устроено}
    lea bx,Mas {загрузка адреса первого элемента в регистр базы bx}
  l1:
    mov ax, word ptr[bx] {integer - 2 байта, помещаем данные по адресу, находящемуся в регистре bx, word ptr указывает, что размер данных, которые мы читаем по адресу - 2 байта ( word - слово - 2 байта ), квадратные скобки - это чтение данных по адресу, который указан в них, в данном случае адрес в bx, а [bx] - начало данных (младший байт), хранящихся по этому адресу}
    add Sum, ax {Добавляем к сумме}
    add bx, 2 {integer - 2 байта, адресация в системе к каждому байту свой адрес, поэтому увеличиваем счетчик адреса на 2}
  loop l1  {Цикл по cx, cx уменьшается на 1, цикл выполняется до тех пор, пока cx не станет нулем}

  end;
  writeln;
  writeln ('Sum = ',Sum);
  readln;
end.

Последний раз редактировалось capta1n; 11.05.2010 в 03:18.
capta1n вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal + assembler kommunist Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 19.10.2008 21:35
задачи на С++,assembler,Pascal Mitron Фриланс 1 06.01.2008 14:55