Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2011, 19:03   #1
Olya1
 
Регистрация: 04.07.2011
Сообщений: 6
По умолчанию Доработка программы (паскаль и ассемблер)

Доброго времени суток, программисты
Возникла небольшая проблема и необходима ваша помощь У меня имеется программа, написанная на Pascal`e (имеются два файла с упорядоченными числами по возрастанию: F1 и F2. Осуществить их слияние в F3).
Программку то я сдала, но неугомонный преподаватель попросил немного её переделать. Надо небольшую часть написать на АСМ встроенному в Паскаль. Я обозначила *начало и *конец* границы кода, которые надо переписать на ассемблер. Я, к сожалению, вообще не разбираюсь в косвенной адресации сейчас, но честно обещаю в ней разобраться , а эту практику уже надо сдавать. Помогите пожалуйста рассчитаться с этим

Код:
program Project1;
const
Fn1 = 'file1.txt';
Fn2 = 'file2.txt';
Fn3 = 'file3.txt';
N = 100;
var
F1, F2, F3 : Text;
i, j, k, Num : Integer;
Arr : array[1..N] of Integer;
begin
Assign(F1, Fn1);
Assign(F2, Fn2);
Assign(F3, Fn3);
Rewrite(F1);
i := 0;
while i <= 10 do begin
if i > 0 then Writeln(F1);
Write(F1, i);
i := i + 2;
end;
Flush(F1);
Rewrite(F2);
i := 1;
while i <= 10 do begin
if i > 1 then Writeln(F2);
Write(F2, i);
i := i + 2;
end;
Flush(F2);
Reset(F1);
i := 0;
while not Eof(F1) do begin
i := i + 1;
Read(F1, Arr[i]);
end;
Reset(F2);
while not Eof(F2) do begin
Readln(F2, Num);
j := 1;
while (j <= i) and (Arr[j] < Num) do begin
j := j + 1;
end;
 
(*НАЧАЛО*)
 
if j > i then begin
Arr[j] := Num;
end else begin
for k := i downto j do begin
Arr[k + 1] := Arr[k];
end;
Arr[j] := Num;
end;
 
(*КОНЕЦ*)
 
i := i + 1;
end;
Rewrite(F3);
for j := 1 to i do begin
if j > 1 then Writeln(F3);
Write(F3, Arr[j]);
end;
Flush(F3);
Close(F1);
Close(F2);
Close(F3);
Writeln('Задача выполнена. Результаты записаны в файлы:');
Writeln(Fn1, ', ', Fn2, ', ', Fn3);
Readln;
end.
Olya1 вне форума Ответить с цитированием
Старый 04.07.2011, 20:15   #2
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Код:
asm
 mov  bx,j
 cmp  bx,i
 ja   Ex
 mov  cx,i
 mov  bx,cx
 shl  bx,1
loop:
 cmp  bx,j
 jb   Ex
 mov  ax,word ptr Arr[bx-2]
 mov  word ptr Arr[bx],ax
 sub  bx,2
 dec  cx
 jmp  loop
Ex:
 mov  ax,Num
 mov  bx,j
 shl  bx,1
 mov  word ptr Arr[bx-2],ax
end;
вроде так ... и объявите метки Loop и Ex
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 04.07.2011, 21:23   #3
Olya1
 
Регистрация: 04.07.2011
Сообщений: 6
По умолчанию

Спасибо большое, это почти то что нужно Но эта вставка некорректно сливает в f3. Там получается 0
1
3
4
4
5
5
6
7
9
10

Вместо 0 1 2 3 4 5 6 7 8 9 10. Сейчас ищу в дебаге, но что-то не найти ошибочку
Olya1 вне форума Ответить с цитированием
Старый 04.07.2011, 21:28   #4
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Извиняюсь, вместо
Код:
loop:
 cmp  bx,j
нужно
Код:
loop:
 cmp  сx,j
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 04.07.2011, 21:36   #5
Olya1
 
Регистрация: 04.07.2011
Сообщений: 6
По умолчанию

0 1 3 5 6 6 6 7 9 10 10
Olya1 вне форума Ответить с цитированием
Старый 04.07.2011, 23:11   #6
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

не поленился, запустил - результат от 0 до 10 ...
какой у вас паскаль? или стучите, контакты в подписи
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 04.07.2011, 23:25   #7
Olya1
 
Регистрация: 04.07.2011
Сообщений: 6
По умолчанию

запускала и через Pascal 7.1 и через Dosbox 0.72 . Вот такой код должен получиться, я права? Это я и с распечаткой сделала, чтобы проверить сразу. Не получается у меня 0 1 2 3 4 5 6 7 8 9 10
Код:
program Project1;
const
Fn1 = 'file1.txt';
Fn2 = 'file2.txt';
Fn3 = 'file3.txt';
N = 100;
var
F1, F2, F3 : Text;
i, j, k, Num, g : Integer;
Arr : array[1..N] of Integer;
begin
Assign(F1, Fn1);
Assign(F2, Fn2);
Assign(F3, Fn3);
Rewrite(F1);
i := 0;
while i <= 10 do begin
if i > 0 then Writeln(F1);
Write(F1, i);
i := i + 2;
end;
Flush(F1);
Rewrite(F2);
i := 1;
while i <= 10 do begin
if i > 1 then Writeln(F2);
Write(F2, i);
i := i + 2;
end;
Flush(F2);
Reset(F1);
i := 0;
while not Eof(F1) do begin
i := i + 1;
Read(F1, Arr[i]);
end;
Reset(F2);
while not Eof(F2) do begin
Readln(F2, Num);
j := 1;
while (j <= i) and (Arr[j] < Num) do begin
j := j + 1;
end;

asm
 mov  bx,j
 cmp  bx,i
 ja  @Ex
 mov  cx,i
 mov  bx,cx
 shl  bx,1
 @op1:
 cmp  cx,j
 jb   @Ex
 mov  ax,word ptr Arr[bx-2]
 mov  word ptr Arr[bx],ax
 sub  bx,2
 dec  cx
 loop @op1
 @Ex:
 mov  ax,Num
 mov  bx,j
 shl  bx,1
 mov  word ptr Arr[bx-2],ax
end;

i := i + 1;
end;
Rewrite(F3);
for j := 1 to i do begin
if j > 1 then Writeln(F3);
Write(F3, Arr[j]);
end;
reset(f3);
while not eof(f3) do begin
read (f3, g);
write(g, ' ');
end;


Close(f1);
Close(f2);
Close(f3);

writeln('REZULTAT');
Writeln(Fn1, ', ', Fn2, ', ', Fn3);

Readln;
end.
Olya1 вне форума Ответить с цитированием
Старый 04.07.2011, 23:44   #8
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

вставляю код вашей программы с первого поста с ассемблерной вставкой, он работает. Ваш действительно ерунду выдает ... хотите ищете, что вы с момента первого поста поменяли в программе или принимайте как есть
Код:
program Project1;
{label loop,Ex;}
const
Fn1 = 'file1.txt';
Fn2 = 'file2.txt';
Fn3 = 'file3.txt';
N = 100;
var
F1, F2, F3 : Text;
i, j, k, Num : Integer;
Arr : array[1..N] of Integer;
begin
Assign(F1, Fn1);
Assign(F2, Fn2);
Assign(F3, Fn3);
Rewrite(F1);
i := 0;
while i <= 10 do begin
if i > 0 then Writeln(F1);
Write(F1, i);
i := i + 2;
end;
Flush(F1);
Rewrite(F2);
i := 1;
while i <= 10 do begin
if i > 1 then Writeln(F2);
Write(F2, i);
i := i + 2;
end;
Flush(F2);
Reset(F1);
i := 0;
while not Eof(F1) do begin
i := i + 1;
Read(F1, Arr[i]);
end;
Reset(F2);
while not Eof(F2) do begin
Readln(F2, Num);
j := 1;
while (j <= i) and (Arr[j] < Num) do begin
j := j + 1;
end;

(*НАЧАЛО*)
asm
 mov  bx,j
 cmp  bx,i
 ja   @Ex
 mov  cx,i
 mov  bx,cx
 shl  bx,1
@loop:
 cmp  cx,j
 jb   @Ex
 mov  ax,word ptr Arr[bx-2]
 mov  word ptr Arr[bx],ax
 sub  bx,2
 dec  cx
 jmp  @loop
@Ex:
 mov  ax,Num
 mov  bx,j
 shl  bx,1
 mov  word ptr Arr[bx-2],ax
end;

(*КОНЕЦ*)

i := i + 1;
end;
Rewrite(F3);
for j := 1 to i do begin
if j > 1 then Writeln(F3);
Write(F3, Arr[j]);
end;
Flush(F3);
Close(F1);
Close(F2);
Close(F3);
Writeln('Задача выполнена. Результаты записаны в файлы:');
Writeln(Fn1, ', ', Fn2, ', ', Fn3);
Readln;
end.
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 04.07.2011, 23:52   #9
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

вот это откуда - loop @op1
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 04.07.2011, 23:55   #10
Olya1
 
Регистрация: 04.07.2011
Сообщений: 6
По умолчанию

Спасибо вам огромнейшее, век не забуду и честно выучу все это ! Не зря мне 3ку за экзамен поставили
Извините, что отняла у вас столько времени
Olya1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доработка программы Rydj Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 15.05.2011 15:31
Доработка программы akialex Помощь студентам 3 24.12.2009 21:09
Доработка программы Дмитрий Н. Общие вопросы Delphi 5 15.04.2009 20:17
Доработка программы!! Дмитрий Н. Компоненты Delphi 0 15.04.2009 11:26
Доработка программы... barmaJIei Фриланс 1 24.04.2008 21:23