2014 dxdy logo

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

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




На страницу Пред.  1, 2
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение26.12.2017, 01:14 
Turbo Pascal 4.0 делает EXE размером 1360 для пустой программы.

 
 
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение26.12.2017, 01:24 
slavav в сообщении #1278764 писал(а):
Turbo Pascal 4.0 делает EXE размером 1360 для пустой программы.

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

 
 
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение26.12.2017, 01:31 
Та ассемблерная вставка делает ровно следующее:
Используется синтаксис 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 
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 
Antropiy в сообщении #1278769 писал(а):
Я понимаю, но вот тем не менее нельзя. Условие задачи не позволяет.
Что значит нельзя?! Я же привёл на что можно заменить ассемблерную вставку чтобы получить чистый паскалевский код.

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

 
 
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение27.12.2017, 00:28 
Смог ужать программу до 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 
Решил попробовать компилятор Turbo Pascal 5.5 В командной строке набираю TPC SPIRAL.PAS и на выходе получается фаил размером 1696 байт. Всё бы ничего, но это фаил не работает. Он запускается и может либо вывести матрицу буквами, либо зависнуть, либо из-за этой программы dosbox вылетает. Качал несколько разных версий компилятора и все выдают одно и тоже. С чем это может быть связано? Какие параметры стоит прописать, чтобы программа нормально скомпилировалась?

 
 
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 11:12 
Есть шанс что она не может нормально исполнятся в современной Windows. Попробуйте DOS в виртуальной машине.

 
 
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 13:14 
slavav в сообщении #1279401 писал(а):
Есть шанс что она не может нормально исполнятся в современной Windows. Попробуйте DOS в виртуальной машине.

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

 
 
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 13:47 
DosBox - не виртуальная машина, а эмулятор (там даже MS-DOS не настоящий). Возможно, виртуальная машина будет больше похожа на оригинальное железо тех лет.

 
 
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 21:33 
slavav в сообщении #1279446 писал(а):
DosBox - не виртуальная машина, а эмулятор (там даже MS-DOS не настоящий). Возможно, виртуальная машина будет больше похожа на оригинальное железо тех лет.

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

 
 
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 21:38 
Вау!
А сколько весит пустая программа в тех же условиях?

 
 
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 22:44 
slavav в сообщении #1279591 писал(а):
Вау!
А сколько весит пустая программа в тех же условиях?

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

-- 28.12.2017, 22:46 --

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

 
 
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение28.12.2017, 23:00 
Код и данные занимают $1696 - 1312 = 384$ байта. Надо делать дизассемблер.

 
 
 
 Re: Оптимальная по размеру спиральная матрица
Сообщение03.01.2018, 02:45 
Так. С паскалевским кодом я, допустим разобрался, но вот с 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


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group