Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Assembler]. Найти ошибку 
:(
    Опции темы
inisider
Дата 30.3.2008, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот есть такой код на Паскале, надо сделать асм. вставки.Я их сделал, но теперь программа работает неправильно.
Код

const
     cuthalf = 100;
var
   buf  : array[0..((cuthalf*2)-1)] of Integer;
   a, b : string[cuthalf];

function min3(a, b, c: integer): integer;
var
   Result : Integer;
begin
  Result := a;
  if b < Result then
    Result := b;
  if c < Result then
    Result := c;
  min3 := Result;
end;

function LeveDist(s, t: string): integer;
var
  i, j, m, n   : integer;
  cost, Result : integer;
  flip         : boolean;
begin
  s := copy(s, 1, cuthalf - 1);
  t := copy(t, 1, cuthalf - 1);
  m := length(s);
  n := length(t);
  if m = 0 then
    Result := n
  else if n = 0 then
    Result := m
  else
  begin
    flip := false;
    for i := 0 to n do
      buf[i] := i;
    for i := 1 to m do
    begin
      if flip then
        buf[0] := i
      else
        buf[cuthalf] := i;
      for j := 1 to n do
      begin
        if s[i] = t[j] then
          cost := 0
        else
          cost := 1;
        if flip then
          buf[j] := min3((buf[cuthalf + j] + 1),
            (buf[j - 1] + 1),
            (buf[cuthalf + j - 1] + cost))
        else
          buf[cuthalf + j] := min3((buf[j] + 1),
            (buf[cuthalf + j - 1] + 1),
            (buf[j - 1] + cost));
      end;
      flip := not flip;
    end;
    if flip then
      Result := buf[cuthalf + n]
    else
      Result := buf[n];
  end;
  LeveDist := Result;
end;

Begin

   readln(a);
   readln(b);
   writeln('leveDist=', leveDist(a,b));

End.



Вот код со вставками на ассемблере
Код

uses crt;
const
     cuthalf = 100;
var
   buf  : array[0..((cuthalf*2)-1)] of Integer;
   a, b : string[cuthalf];
   i : integer;

function min3(a, b, c: integer): integer;
begin
asm
        mov ax,a
        mov bx,b
        mov cx,c
        cmp ax,bx
        jl @@1
        cmp ax,bx
        @@1:
        cmp ax,cx
        jl @@2
        mov ax,cx
        @@2:
        mov @Result,ax
end;
end;

function LeveDist(s, t: string): integer;
var
  i, j, m, n   : integer;
  cost, Result : integer;
  flip         : boolean;
  p:char;
begin
  s := copy(s,1,cuthalf-1);
  t := copy(t,1,cuthalf-1);
  asm
      { m := length(s) }
      mov al,byte ptr s
      mov m, 0
      mov byte ptr m ,al
      { n := length(t) }
      xor al,al
      mov n, 0
      mov al, byte ptr t
      mov byte ptr n, al
      { if ( m = 0 ) }
      cmp m, 0
      jnz @check_n
      { then Result := n }
      mov ax, n
      jmp @finish
    @check_n:
      cmp n, 0
      jnz @go_for_cmp
      { else Result := m }
      mov ax, m
      jmp @finish
    @go_for_cmp:
      {for i := 0 to n do}
      mov flip, 0
      mov i, 0
      jmp @go_to_cycle_1
    @cycle_1:
      inc word ptr i
     @go_to_cycle_1:
      mov ax, i
      mov di, ax
      shl di, 1
      mov word ptr [buf+di], ax
      mov ax, i
      cmp ax, n
      jnz @cycle_1
      {for i:= 1 to m do }
      mov i, 1
    @cycle_2:
      cmp flip, 1    { 00 - false, 01- true }
      jnz @else { tyt mojet bit' drygaya metka}
      mov ax, i
      mov word ptr [buf], ax
      jmp @need_for_cycle_3
     @else:
      mov ax, i
      mov word ptr buf[cuthalf], ax
     @need_for_cycle_3:
      { for j := 1 to n do }
      mov j, 1
      @cycle_3:
      {if (s[i] = t[j] }
      push ds
      mov di, i
      shl di, 1
      lds si, dword ptr s[di]
      pop ds

      push es
      push si
      mov si, j
      shl si, 1
      les di, dword ptr t[si]
      pop si
      pop es

      mov ax, word ptr ds:[si]
      cmp word ptr es:[di], ax
      jnz @else1
      mov cost, 0
      jmp @1
     @else1:
      mov cost, 1
     @1:
      cmp flip, 1
      jnz @2
      push word ptr buf[cuthalf+j]+1
      push word ptr buf[j-1]+1
      mov ax, word ptr buf[cuthalf+j-1]
      add ax, cost
      push ax
      call min3
      mov word ptr buf[j], ax
      jmp @go_for_end_cycle3
     @2:
      push word ptr buf[j]+1
      push word ptr buf[cuthalf+j-1]+1
      mov ax, word ptr buf[j-1]
      add ax, cost
      push ax
      call min3
      mov word ptr buf[cuthalf+j],ax
     @go_for_end_cycle3:
      inc j
      mov ax, word ptr n
      cmp word ptr j, ax
     jnz @cycle_3
      not flip

      inc i
      mov ax, word ptr m
      cmp word ptr i, ax
      jnz @cycle_2



      cmp flip, 1
      jnz @3
      mov ax, word ptr buf[cuthalf+n]
      jmp @finish
     @3:
      mov ax, word ptr buf[n]


    @finish:
      mov @Result,ax

end;





end;

Begin   clrscr;


   readln(a);
   readln(b);
   writeln('levedist=',levedist(a,b));

End.



Это сообщение отредактировал(а) inisider - 31.3.2008, 08:43
PM MAIL   Вверх
SandyProgrammer
Дата 30.3.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подсветкой кода пользуйтесь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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