2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение26.12.2017, 01:14 
Заслуженный участник


26/05/14
981
Turbo Pascal 4.0 делает EXE размером 1360 для пустой программы.

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение26.12.2017, 01:24 


24/12/17
16
slavav в сообщении #1278764 писал(а):
Turbo Pascal 4.0 делает EXE размером 1360 для пустой программы.

Ну это для пустой-то. А для моего кода, что Turbo7, что Turbo4 1936 байт. Правда если я в командной строке пишу просто TPC spiral.pas для Turbo4, то получается 1792 байта, но при попытки выполнить подобным образом откомпилированную программу, она начинает дико лагать. Матрица выводится буквами, программа зависает и т.д. Но не работает как нужно. Если бы знать с чем это связано...

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение26.12.2017, 01:31 
Заслуженный участник


20/08/14
11126
Россия, Москва
Та ассемблерная вставка делает ровно следующее:
Используется синтаксис Pascal
procedure WriteChar(c: Byte);
var r: registers;
begin
  r.ah := 2; r.dl := c; msdos(r);
end;
И вся эта функция компилится в 28 байтов. Плюс 4-5 байтов на каждый вызов.

Если же в основной программе вызывать сразу msdos() вместо WriteChar(), то каждый вызов тратит 20 байтов.
В связи с этим у меня давно есть ещё одно предложение: не выводить по одному символу, а записывать их в буфер и потом вывести сразу всю строку, тоже через вызов msdos().

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение26.12.2017, 01:33 


24/12/17
16
Dmitriy40 в сообщении #1278768 писал(а):
Та ассемблерная вставка делает ровно следующее:
Используется синтаксис Pascal
procedure WriteChar(c: Byte);
var r: registers;
begin
  r.ah := 2; r.dl := c; msdos(r);
end;
И вся эта функция компилится в 28 байтов. Плюс 4-5 байтов на каждый вызов.

Я понимаю, но вот тем не менее нельзя. Условие задачи не позволяет.

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение26.12.2017, 01:55 
Заслуженный участник


20/08/14
11126
Россия, Москва
Antropiy в сообщении #1278769 писал(а):
Я понимаю, но вот тем не менее нельзя. Условие задачи не позволяет.
Что значит нельзя?! Я же привёл на что можно заменить ассемблерную вставку чтобы получить чистый паскалевский код.

Кроме того, Вы совершенно напрасно всю программу засунули в with r do, это аннулирует оптимизацию компилятора и заставляет его хранить все данные в памяти (а не в регистрах, да!), что размер кода точно не уменьшает.

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение27.12.2017, 00:28 


24/12/17
16
Смог ужать программу до 1904 байт. Порог в 1900 почти пройден.
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
{$S-}
uses dos;
var
 m: array [1..81] of word;
 s: integer;
 r: registers;
 f: boolean;
begin
  r.ah := 7;
  msdos(r);
  r.di := r.al - 48;
  r.ah := 2;
  r.bx := r.di;
  r.es := r.di;
  s := 1;
  repeat
   inc(r.cx);
   inc(r.si,s);
   if r.cx = r.es then begin
     if abs(s) = 1
      then begin
       s := r.di;
       dec(r.bx);
      end else begin
       s := 1;
       f := not f;
      end;
    if f then s := -s;
    r.es := r.cx + r.bx;
   end;
   m[r.si] := r.cx;
  until r.bx = 0;
  repeat
   inc(r.bx);
   r.dl := m[r.bx] div 10 + 48;
   msdos(r);
   r.dl := m[r.bx] mod 10 + 48;
   msdos(r);
   r.dl := 32;
   if r.bx mod r.di = 0 then r.dl := 10;
   msdos(r);
 until r.bx = r.cx;
end.
 

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 07:52 


24/12/17
16
Решил попробовать компилятор Turbo Pascal 5.5 В командной строке набираю TPC SPIRAL.PAS и на выходе получается фаил размером 1696 байт. Всё бы ничего, но это фаил не работает. Он запускается и может либо вывести матрицу буквами, либо зависнуть, либо из-за этой программы dosbox вылетает. Качал несколько разных версий компилятора и все выдают одно и тоже. С чем это может быть связано? Какие параметры стоит прописать, чтобы программа нормально скомпилировалась?

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 11:12 
Заслуженный участник


26/05/14
981
Есть шанс что она не может нормально исполнятся в современной Windows. Попробуйте DOS в виртуальной машине.

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 13:14 


24/12/17
16
slavav в сообщении #1279401 писал(а):
Есть шанс что она не может нормально исполнятся в современной Windows. Попробуйте DOS в виртуальной машине.

Но ведь, это в виртуалке и запускается. DosBox же.

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 13:47 
Заслуженный участник


26/05/14
981
DosBox - не виртуальная машина, а эмулятор (там даже MS-DOS не настоящий). Возможно, виртуальная машина будет больше похожа на оригинальное железо тех лет.

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 21:33 


24/12/17
16
slavav в сообщении #1279446 писал(а):
DosBox - не виртуальная машина, а эмулятор (там даже MS-DOS не настоящий). Возможно, виртуальная машина будет больше похожа на оригинальное железо тех лет.

Спасибо за совет. Помогла смена эмулятора на DOSemu. Он корректно работает с фалами скомпилированными tpc 5.5. На данный момент программа уже весит 1696 байт.

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 21:38 
Заслуженный участник


26/05/14
981
Вау!
А сколько весит пустая программа в тех же условиях?

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 22:44 


24/12/17
16
slavav в сообщении #1279591 писал(а):
Вау!
А сколько весит пустая программа в тех же условиях?

1312 байт вроде как.

-- 28.12.2017, 22:46 --

А вообще проги было задано три написать, но как вторые две версия спиральки уменьшать я знаю)
Сейчас
паскаль - 1696
EXE на TASM - 633
COM-файл - 114

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 23:00 
Заслуженный участник


26/05/14
981
Код и данные занимают $1696 - 1312 = 384$ байта. Надо делать дизассемблер.

 Профиль  
                  
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение03.01.2018, 02:45 


24/12/17
16
Так. С паскалевским кодом я, допустим разобрался, но вот с com-файлом... Уменшил, как мог, но надо ещё меньше. Желательно меньше 114 байт. В упор не вижу что здесь можно ещё оптимизировать, чтобы программа стала ещё меньше. Сейчас программа весит 115 байт.
код: [ скачать ] [ спрятать ]
Используется синтаксис ASM
code segment
org 100h
assume cs:code, ds:code
start:
 mov ah, 2
 mov dl, 78
 int 21h
 mov dl, 61
 int 21h
 dec ah
 int 21h
 sub ax, 304
 xor cx, cx
 mov di, ax
 mov dx, di
 mov si, 2
 l1:
  inc cx
  cmp cx, dx
  jne c1
   cmp si, 2
   jne c2
    mov si, di
    shl si, 1
    dec ax
    jmp c3
   c2:
    mov si, 2
    neg bp
   c3:
    add dx, ax
  c1:
  mov m[bx], cx
  cmp bp, 0
  jl c5
   add bx, si
   jmp c6
  c5:
   sub bx, si
  c6:
   cmp al, ah
 jne l1
 mov cx, di
 xor bl, bl
 mov ah, 2
 outstr:
  push cx
  mov cx, di
  mov dl, 10
  outel:
   int 21h
   mov ax, m[bx]
   mov dl, 10
   div dl
   or ax, 12336
   mov dx, ax
   mov ah, 2
   int 21h
   mov dl, dh
   int 21h
   mov dl, 32
   add bl, ah
  loop outel
  pop cx
 loop outstr
 ret
 m dw ?
code ends
end start

 

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group