почему программа работает неправильно?

Тема в разделе "WASM.BEGINNERS", создана пользователем pan1ka, 30 мар 2008.

  1. pan1ka

    pan1ka New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    5
    Вот есть такой код на Паскале, надо сделать асм. вставки.Я их сделал, но теперь программа работает неправильно.
    Код на Паскале
    Код (Text):
    1. const
    2. cuthalf = 100;
    3. var
    4. buf : array[0..((cuthalf*2)-1)] of Integer;
    5. a, b : string[cuthalf];
    6.  
    7. function min3(a, b, c: integer): integer;
    8. var
    9. Result : Integer;
    10. begin
    11. Result := a;
    12. if b < Result then
    13. Result := b;
    14. if c < Result then
    15. Result := c;
    16. min3 := Result;
    17. end;
    18.  
    19. function LeveDist(s, t: string): integer;
    20. var
    21. i, j, m, n : integer;
    22. cost, Result : integer;
    23. flip : boolean;
    24. begin
    25. s := copy(s, 1, cuthalf - 1);
    26. t := copy(t, 1, cuthalf - 1);
    27. m := length(s);
    28. n := length(t);
    29. if m = 0 then
    30. Result := n
    31. else if n = 0 then
    32. Result := m
    33. else
    34. begin
    35. flip := false;
    36. for i := 0 to n do
    37. buf[i] := i;
    38. for i := 1 to m do
    39. begin
    40. if flip then
    41. buf[0] := i
    42. else
    43. buf[cuthalf] := i;
    44. for j := 1 to n do
    45. begin
    46. if s[i] = t[j] then
    47. cost := 0
    48. else
    49. cost := 1;
    50. if flip then
    51. buf[j] := min3((buf[cuthalf + j] + 1),
    52. (buf[j - 1] + 1),
    53. (buf[cuthalf + j - 1] + cost))
    54. else
    55. buf[cuthalf + j] := min3((buf[j] + 1),
    56. (buf[cuthalf + j - 1] + 1),
    57. (buf[j - 1] + cost));
    58. end;
    59. flip := not flip;
    60. end;
    61. if flip then
    62. Result := buf[cuthalf + n]
    63. else
    64. Result := buf[n];
    65. end;
    66. LeveDist := Result;
    67. end;
    68.  
    69. Begin
    70.  
    71. readln(a);
    72. readln(b);
    73. writeln('leveDist=', leveDist(a,b));
    74.  
    75. End.
    76. ---------------------------------
    77.  
    78. Вот код со вставками
    79.  
    80. uses crt;
    81. const
    82. cuthalf = 100;
    83. var
    84. buf : array[0..((cuthalf*2)-1)] of Integer;
    85. a, b : string[cuthalf];
    86. i : integer;
    87.  
    88. function min3(a, b, c: integer): integer;
    89. begin
    90. asm
    91. mov ax,a
    92. mov bx,b
    93. mov cx,c
    94. cmp ax,bx
    95. jl @@1
    96. cmp ax,bx
    97. @@1:
    98. cmp ax,cx
    99. jl @@2
    100. mov ax,cx
    101. @@2:
    102. mov @Result,ax
    103. end;
    104. end;
    105.  
    106. function LeveDist(s, t: string): integer;
    107. var
    108. i, j, m, n : integer;
    109. cost, Result : integer;
    110. flip : boolean;
    111. p:char;
    112. begin
    113. s := copy(s,1,cuthalf-1);
    114. t := copy(t,1,cuthalf-1);
    115. asm
    116. { m := length(s) }
    117. mov al,byte ptr s
    118. mov m, 0
    119. mov byte ptr m ,al
    120. { n := length(t) }
    121. xor al,al
    122. mov n, 0
    123. mov al, byte ptr t
    124. mov byte ptr n, al
    125. { if ( m = 0 ) }
    126. cmp m, 0
    127. jnz @check_n
    128. { then Result := n }
    129. mov ax, n
    130. jmp @finish
    131. @check_n:
    132. cmp n, 0
    133. jnz @go_for_cmp
    134. { else Result := m }
    135. mov ax, m
    136. jmp @finish
    137. @go_for_cmp:
    138. {for i := 0 to n do}
    139. mov flip, 0
    140. mov i, 0
    141. jmp @go_to_cycle_1
    142. @cycle_1:
    143. inc word ptr i
    144. @go_to_cycle_1:
    145. mov ax, i
    146. mov di, ax
    147. shl di, 1
    148. mov word ptr [buf+di], ax
    149. mov ax, i
    150. cmp ax, n
    151. jnz @cycle_1
    152. {for i:= 1 to m do }
    153. mov i, 1
    154. @cycle_2:
    155. cmp flip, 1 { 00 - false, 01- true }
    156. jnz @else { tyt mojet bit' drygaya metka}
    157. mov ax, i
    158. mov word ptr [buf], ax
    159. jmp @need_for_cycle_3
    160. @else:
    161. mov ax, i
    162. mov word ptr buf[cuthalf], ax
    163. @need_for_cycle_3:
    164. { for j := 1 to n do }
    165. mov j, 1
    166. @cycle_3:
    167. {if (s[i] = t[j] }
    168. push ds
    169. mov di, i
    170. shl di, 1
    171. lds si, dword ptr s[di]
    172. pop ds
    173.  
    174. push es
    175. push si
    176. mov si, j
    177. shl si, 1
    178. les di, dword ptr t[si]
    179. pop si
    180. pop es
    181.  
    182. mov ax, word ptr ds:[si]
    183. cmp word ptr es:[di], ax
    184. jnz @else1
    185. mov cost, 0
    186. jmp @1
    187. @else1:
    188. mov cost, 1
    189. @1:
    190. cmp flip, 1
    191. jnz @2
    192. push word ptr buf[cuthalf+j]+1
    193. push word ptr buf[j-1]+1
    194. mov ax, word ptr buf[cuthalf+j-1]
    195. add ax, cost
    196. push ax
    197. call min3
    198. mov word ptr buf[j], ax
    199. jmp @go_for_end_cycle3
    200. @2:
    201. push word ptr buf[j]+1
    202. push word ptr buf[cuthalf+j-1]+1
    203. mov ax, word ptr buf[j-1]
    204. add ax, cost
    205. push ax
    206. call min3
    207. mov word ptr buf[cuthalf+j],ax
    208. @go_for_end_cycle3:
    209. inc j
    210. mov ax, word ptr n
    211. cmp word ptr j, ax
    212. jnz @cycle_3
    213. not flip
    214.  
    215. inc i
    216. mov ax, word ptr m
    217. cmp word ptr i, ax
    218. jnz @cycle_2
    219.  
    220.  
    221.  
    222. cmp flip, 1
    223. jnz @3
    224. mov ax, word ptr buf[cuthalf+n]
    225. jmp @finish
    226. @3:
    227. mov ax, word ptr buf[n]
    228.  
    229.  
    230. @finish:
    231. mov @Result,ax
    232.  
    233. end;
    234.  
    235.  
    236.  
    237.  
    238.  
    239. end;
    240.  
    241. Begin clrscr;
    242.  
    243.  
    244. readln(a);
    245. readln(b);
    246. writeln('levedist=',levedist(a,b));
    247.  
    248. End.
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    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;

    Что-то не стыкуется.
     
  3. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    описание переменной Result лишнее ;)
     
  4. pan1ka

    pan1ka New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    5
    Забыл написать, что ф-ия мин. на ассемблере работает правильно, я ее проверял и отладил, а вот 2-я почему не правильно считает пока что не пойму
     
  5. zoool

    zoool New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2007
    Сообщения:
    412
    регистры кто сохранять будет?
     
  6. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    zoool
    А разве компилятор это не делает (сохраняет и восстанавливает используемые регистры)? Все-таки ассемблерная вставка...
     
  7. pan1ka

    pan1ka New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    5
    вроде должен делать...ошибка не в этом, я что-то неправильно переделал , но вот что не могу понять...
     
  8. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    pan1ka
     
  9. pan1ka

    pan1ka New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2008
    Сообщения:
    5
    Та ошибка там была я просто не тот вариант кинул=(, больше в мин. ф-ии не должно быть !!! ошибка в поиске расстояние между ф-ми ( ЛевеДист которая)