Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка двухмерного массива, asm 
:(
    Опции темы
mandarinka27
Дата 28.2.2010, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите переделать паскалевкий код в во встроенном ассеблере. В файле записан двухмерный массив, нужно поменять местами строки с четными и нечётными номерами.
writeln('kolichestvo strok=',kol1,' ','kolichestvo stolbikov=',kol2);
 i:=1;
  while i<kol1 do begin
    for j:=1 to kol2 do begin
      t:=a[i,j];
      a[i,j]:=a[i+1,j];
      a[i+1,j]:=t
    end;
    i:=i+2
  end;

PM MAIL   Вверх
ФедосеевПавел
Дата 28.2.2010, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Взгляни-ка
Код

PROGRAM Matr;
CONST
  ColMax = 10;
  RowMax = 10;
TYPE
  TMatr  = array [1..RowMax, 1.. ColMax] of Integer;

PROCEDURE FillMatr (VAR a : TMatr; Col, Row : Integer);
VAR
  i, j  : Integer;
BEGIN
  for i:=1 to Row do begin
    for j:=1 to Col do begin
      a[i,j]:=i;
    end;
  end;
END;

PROCEDURE ShowMatr (VAR a : TMatr; Col, Row : Integer);
VAR
  i, j  : Integer;
BEGIN
  for i:=1 to Row do begin
    for j:=1 to Col do begin
      Write(a[i,j]:4);
    end;
    WriteLn;
  end;
END;

VAR
  Row,
  Col   : Integer;
  a     : TMatr;
  i, j  : Integer;
  t     : Integer;
BEGIN
  Row:=4;
  Col:=4;
  FillMatr(a, Col, Row);
  ShowMatr(a, Col, Row);
  WriteLn('---------------');
  WriteLn(' By Pascal');
  FillMatr(a, Col, Row);
  ShowMatr(a, Col, Row);
  i:=2;
  while i<=Row do begin
    for j:=1 to Col do begin
      t:=a[i,j];
      a[i,j]:=a[i-1,j];
      a[i-1,j]:=t;
    end;
    i:=i+2;
  end;
  WriteLn;
  ShowMatr(a, Col, Row);
  WriteLn('---------------');
  WriteLn(' By build assembler');
  FillMatr(a, Col, Row);
  ShowMatr(a, Col, Row);
  WriteLn;
  asm
    push bp

    lea  bx, a          {bx - на начало нечётной строки}
    mov  bp, bx
    add  bp, ColMax*2   {bp - на начало чётной строки}
                        {bp:=bx+ColMax*SizeOf(a[1,1])}

    mov  si, 1          { i:=2}
@@while_i:
    cmp  si, Row        {while i<=Row do begin}
    jae  @@end_i
    push si


    mov  di, 0          {for j:=1 to Col do begin}
    mov  si, di
@@for_j:
    cmp  di, Col
    jae   @@end_j

    mov  ax, ds:[bp+si] {t:=a[i,j]}
    xchg ax, ds:[bx+si] {a[i,j]:=a[i-1,j]}
    mov  ds:[bp+si], ax {a[i-1,j]:=t}

    inc  di
    add  si, 2
    jmp  @@for_j
@@end_j:
    pop  si
    add  si, 2          {i:=i+2}
    add  bx, ColMax*2*2 {переход к следующей паре строк}
    add  bp, ColMax*2*2 { ColMax*2*SizeOf(a[1,1]) }
    jmp  @@while_i
@@end_i:

    pop  bp
  end;
  ShowMatr(a, Col, Row);
END.

PM   Вверх
mandarinka27
Дата 28.2.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо Огромное Павел!!! Только у меня почему то выводит в последней строке нули, но т.е массив в файле
1 2 5 
6 4 6
3 9 4
2 6 9
1 4 6
а когда выводит получается
6 4 6
1 2 5
2 6 9
3 9 4
0 0 0
Надеюсь разберусь с этим. Еще раз спасибо огромное за помощь!!!
PM MAIL   Вверх
ФедосеевПавел
Дата 28.2.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Посмотри внимательнее. Только что проверил на твоём примере - всё нормально отрабатывает.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  BASM.ZIP 0,87 Kb
PM   Вверх
mandarinka27
Дата 28.2.2010, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вроде все правильно написано но у меня все равно нули в последней строке. Мистика!

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  pasasm.rar 0,73 Kb
PM MAIL   Вверх
mandarinka27
Дата 28.2.2010, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я поняла почему так с нулями получается. Еще раз спасибо за помощь милый друг!!! Чмок!!!
PM MAIL   Вверх
ФедосеевПавел
Дата 28.2.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А всё потому, что у меня массив Integer, а а тебя Byte. Соответственно и размеры элементов массива у меня 2 байта, а у тебя 1 байт.
Если использовать Byte, тогда в трёх строках (в комментариях там стоит SizeOf(a[1,1])) замени число 2 на 1.
Например,
Код

    add  bp, ColMax*2   {bp - на начало чётной строки}
                        {bp:=bx+ColMax*SizeOf(a[1,1])}

замени на
    add  bp, ColMax*1   {bp - на начало чётной строки}
                        {bp:=bx+ColMax*SizeOf(a[1,1])}


Добавлено через 6 минут и 36 секунд
И ещё
Код

    mov  ax, ds:[bp+si] {t:=a[i,j]}
    xchg ax, ds:[bx+si] {a[i,j]:=a[i-1,j]}
    mov  ds:[bp+si], ax {a[i-1,j]:=t}
на
    mov  al, ds:[bp+si] {t:=a[i,j]}
    xchg al, ds:[bx+si] {a[i,j]:=a[i-1,j]}
    mov  ds:[bp+si], al {a[i-1,j]:=t}

PM   Вверх
mandarinka27
Дата 28.2.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я просто не сразу обратила внимание, что массивы разного типа. А когда пошагова стала проверять увидела.
PM MAIL   Вверх
Mikl_
Дата 1.3.2010, 06:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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


 




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


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

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