Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var
- best, size, i, k, n: longint;
- vec: array [1..100] of longint;
- prog: array [1..100] of string;
- reg: array [1..255] of char;
- letter: char;
- va, vd, vk: array[1..100] of longint;
- procedure push(x: longint);
- begin
- inc(size);
- vec[size] := x;
- reg[x] := letter;
- letter := char(ord(letter) + 1);
- end;
- function peek: longint;
- begin
- peek := vec[size];
- end;
- procedure pop;
- begin
- letter := char(ord(letter) - 1);
- reg[vec[size]] := chr(0);
- dec(size);
- end;
- function get_command(a, k, d, p: longint): string;
- var ca, cd, ck, cp: char;
- begin
- ca := reg[a];
- cp := reg[p];
- if d > 0 then begin
- cd := reg[d];
- if k > 1 then begin
- ck := chr(k + ord('0'));
- get_command := 'lea e' + cp + 'x, [e' + cd + 'x + ' + ck + '*e' + ca + 'x]';
- end else begin
- get_command := 'lea e' + cp + 'x, [e' + cd + 'x + e' + ca + 'x]';
- end;
- end else begin
- if k > 1 then begin
- ck := chr(k + ord('0'));
- get_command := 'lea e' + cp + 'x, [' + ck + '*e' + ca + 'x]';
- end;
- end;
- end;
- procedure save_program;
- var a, d, k, p: longint;
- begin
- for i := 1 to best do begin
- a := va[i];
- d := vd[i];
- k := vk[i];
- p := a * k + d;
- prog[i] := get_command(a, k, d, p);
- end;
- end;
- procedure rec;
- var i, ai, di, ki, a, d, k, p: longint;
- begin
- if size - 1 >= best then exit;
- if peek = n then begin
- best := size - 1;
- save_program;
- exit;
- end;
- for di := size downto 0 do begin
- if di = 0 then d := 0 else d := vec[di];
- for ai := size downto 1 do begin
- a := vec[ai];
- for ki := 3 downto 0 do begin
- k := 1 shl ki;
- if (k = 1) and (d = 0) then continue;
- p := a * k + d;
- if (p <= peek) or (p > n) then continue;
- push(p);
- va[size - 1] := a;
- vd[size - 1] := d;
- vk[size - 1] := k;
- rec;
- pop;
- end;
- end;
- end;
- end;
- begin
- read(n);
- letter := 'a';
- for i := 1 to 255 do reg[i] := chr(0);
- push(1);
- best := 100;
- rec;
- writeln(best);
- for i := 1 to best do begin
- writeln(prog[i]);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement