Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с массивами со вставкой в АСМ в Паскаль, Не получается 
:(
    Опции темы
Clockgen
  Дата 16.12.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Люди,помогите написать программу с вставкой инструкции ассемблера в паскаль,не получается,т.к. это массив:
Вот собственно задание:
Даны массивы L1,...,L10; M1,...,M10.Определить N-кол-во пар Li,Mi, для кот выполняется условие |Li|=Mi(в квадрате)
Вычислить X=(L2+M2)/(N+1)+N(в квадрате)

Это сообщение отредактировал(а) Clockgen - 16.12.2008, 19:54
PM MAIL   Вверх
Mikl_
Дата 17.12.2008, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



Цитата(Clockgen)
Люди,помогите написать программу с вставкой инструкции ассемблера в паскаль,не получается,т.к. это массив:
Вот собственно задание:
Даны массивы L1,...,L10; M1,...,M10.Определить N-кол-во пар Li,Mi, для кот выполняется условие |Li|=Mi(в квадрате)
Вычислить X=(L2+M2)/(N+1)+N(в квадрате)
Clockgen необходимо обладать даром экстрасенса, что бы написать программу по твоему невнятному заданию smile 
1) Либо массивов 20 L1,...,L10; M1,...,M10 либо массивов 2 а у каждого массива по десять элементов
2) Для кот выполняется условие |Li|=Mi(в квадрате) наверное Li и Mi все таки элементы массивов
3) вычислить X=(L2+M2)/(N+1)+N(в квадрате) вот здесь окончательно становится понятно что L2 и M2 элементы массива, ведь в задании не написано что Х это тоже массив или всётаки массив?
4) написать программу с ассемблерными вставками -- а просто программа на паскале почему тебя не устраивает? Для чего нужна ассемблерная вставка -- объясни ... Только пиши так, чтобы было понятно собеседнику 
Для получения ответа обязательно укажи название своего ВУЗа и факультета -- это мне необходимо для статистики 

Это сообщение отредактировал(а) Mikl_ - 18.12.2008, 09:13
PM MAIL   Вверх
SuperRembo
Дата 9.4.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 24.11.2008

Репутация: нет
Всего: нет



Цитата(Mikl_ @ 17.12.2008,  10:32)
4) написать программу с ассемблерными вставками -- а просто программа на паскале почему тебя не устраивает? Для чего нужна ассемблерная вставка -- объясни ... Только пиши так, чтобы было понятно собеседнику 

Вот всегда на форумах, спрашивают а почему так? а почему не так? 
Да потому что человеку такое задание дали, как и мне кстати, и тож фигня с этими масивами, с обычными переменными всё нормально, а вот с масивами неладно.
PM MAIL   Вверх
SuperRembo
Дата 9.4.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 24.11.2008

Репутация: нет
Всего: нет



Цитата(Clockgen @ 16.12.2008,  18:56)
Люди,помогите написать программу с вставкой инструкции ассемблера в паскаль,не получается,т.к. это массив:
Вот собственно задание:
Даны массивы L1,...,L10; M1,...,M10.Определить N-кол-во пар Li,Mi, для кот выполняется условие |Li|=Mi(в квадрате)
Вычислить X=(L2+M2)/(N+1)+N(в квадрате)

Если тебе интересно, вот работающая програма для обычных переменных
Код

Program A_L8_1;
Uses crt;
var
   a,b,c,d : Byte;

Begin
   a:=5; b:=4; c:=1; d:=1;
   ClrScr;
   TextColor(10);
   Writeln('a = ',a);
   Writeln('b = ',b);
   Writeln('c = ',c);
   Writeln('d = ',d);
   Writeln;
   TextColor(9);
   Writeln(' 16*a*(b-1)');
   Writeln('ДДДДДДДДДДДД - 100 = ');
   Write  ('    c+d    ');
   TextColor(12);
   Gotoxy(22,7);
   ASM
       mov al, c
       add al, d
       mov c,  al

       mov al, a
       mov bl, 16
       mul bl
       mov bl, b
       sub bl, 1
       mul bl
       mov bl, c
       div bl
       sub al, 100

       mov a,  al
   end;
   Write(a);
   ReadKey;
end.


Вот есть пример такой правда не проверял, это у меня в методе написано:
Код

Добавить к элементам масива А любое число, начиная с третьего элемента
  Program test0002;
  Var
      a: array [1..10] of integer;
      i, b: byte;
   begin
       for i:=1 to 10 do
       begin
         randomize;
         a[i]:=random(100)
       end;
       b:=10;
       for i:=3 to 10 do
    begin
            asm
            a[i]:=a[i]+b}
        mov al, byte ptr b
        xor  ah,ah
                mov bl, byte ptr i
                xor  bh, bh
                shl   bx,1
                add word ptr a[ bx-6], ax   
                end; {asm}
            end;
        for i:=1 to 10 do
        writeln(a[i]);
        end.


У меня вот тоже кстати такой вопрос, это моё задание:
Каждый элемент масива A[m], кроме первого, заменить на максимальный элемент с числа пред ведущих элементов.
Вот я написал такое:
Код

Program A_L8_3;
Uses crt;
var
   m1  : array [1..15] of integer;
   i,j : integer;
   n   : byte;

Begin
   ClrScr;
   TextColor(9);
   Writeln('Њ бЁў бд®а¬®ў ­Ё© ўЁЇ ¤Є®ўЁ¬ зЁ­®¬:');
   {Randomize;}
   Textcolor(11);
   For i:=1 to 8 do
   Begin
      m1[i]:=random(32767)-random(32768);
      Write(m1[i],' ');
   end;
   Writeln;
   asm

      mov si, 0
      mov cx, 16
      mov bx, word ptr M1[0]

      @mt1:
         mov ax, word ptr M1[si]
         cmp word ptr M1[si], bx
         jl @fin
           mov bx, word ptr M1[si]
         @fin:
         
         mov word ptr M1[si], bx

         inc si
         dec cx

      cmp cx, 0
      jnl @Mt1
         jmp @more1
      @More1:
   end;
   Writeln;
   TextColor(9);
   Writeln('Њ бЁў Їiб«п ®Ўа®ЎЄЁ:');
   Textcolor(12);
   For i:=1 to 8 do
   Begin
      Write(m1[i],' ');
   end;
   ReadKey;
end.


Но оно зараз не работает, во первых почему-то никак не пойму почему он обрабатывает половину масива, по этому я задаю в СХ в два раза больше итераций. Во вторых при записи с масива в регистр (ВХ) и обратно, значение искажается. Я думаю что это из-за первого бита, отвечающего за знак минуса, когда число отрицательное то в битах это выглядит так 1ххх хххх  хххх хххх, (тип интежер -32 768 .. 32 767) когда положительное по ходу так 0ххх хххх  хххх хххх, и при перемещении это не учитываеться и в регистре уже считаеться число - (0 ... 65 536)... хотя может и не так, не пойму ваще ничего  smile   smile 
PM MAIL   Вверх
SuperRembo
Дата 9.4.2009, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 24.11.2008

Репутация: нет
Всего: нет



Ура! я расчехлил!
Вся загвоздка в том, что ассемблер шагает по паскакалевскому масиву не по слову! а по байту! хххх.хххх.хххх.хххх -- хххх.хххх
по этому на каждый елемент масива препадает по две операции и получаеться настоящая каша.
По этому цыкл нужно задавать в два раза больше и в теле изменять счётчик на два.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.