Вот есть такой код на Паскале, надо сделать асм. вставки.Я их сделал, но теперь программа работает неправильно. Код на Паскале Код (Text): 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.
pan1ka А почему на Паскале function min3(a, b, c: integer): integer; var Result : Integer; begin ... min3 := Result; end; А на ассемблере function min3(a, b, c: integer): integer; begin asm mov @Result,ax end; end; Что-то не стыкуется.
Забыл написать, что ф-ия мин. на ассемблере работает правильно, я ее проверял и отладил, а вот 2-я почему не правильно считает пока что не пойму
zoool А разве компилятор это не делает (сохраняет и восстанавливает используемые регистры)? Все-таки ассемблерная вставка...
вроде должен делать...ошибка не в этом, я что-то неправильно переделал , но вот что не могу понять...
Та ошибка там была я просто не тот вариант кинул=(, больше в мин. ф-ии не должно быть !!! ошибка в поиске расстояние между ф-ми ( ЛевеДист которая)