1 #include "x86-codegen.h"
4 /* don't run the resulting program, it will destroy your computer,
5 * just objdump -d it to inspect we generated the correct assembler.
9 unsigned char code
[16000];
10 unsigned char *p
= code
;
11 unsigned char *target
, *start
, *end
;
12 unsigned long mem_addr
= 0xdeadbeef;
15 printf (".text\n.align 4\n.globl main\n.type main,@function\nmain:\n");
17 x86_prolog (p
, 16, X86_CALLER_REGS
);
19 x86_cmpxchg_reg_reg (p
, X86_EAX
, X86_EBP
);
20 x86_cmpxchg_membase_reg (p
, X86_EAX
, 12, X86_EBP
);
22 x86_xchg_reg_reg (p
, X86_EAX
, X86_EBP
, 4);
23 x86_xchg_reg_reg (p
, X86_EAX
, X86_EBP
, 1); // FIXME?
24 x86_xchg_membase_reg (p
, X86_EAX
, 12, X86_EBP
, 4);
25 x86_xchg_membase_reg (p
, X86_EAX
, 12, X86_EBP
, 2);
26 x86_xchg_membase_reg (p
, X86_EAX
, 12, X86_EBX
, 1); // FIXME?
28 x86_inc_reg (p
, X86_EAX
);
29 x86_inc_mem (p
, mem_addr
);
30 x86_inc_membase (p
, X86_ESP
, 4);
35 x86_dec_reg (p
, X86_EAX
);
36 x86_dec_reg (p
, X86_ECX
);
37 x86_dec_mem (p
, mem_addr
);
38 x86_dec_membase (p
, X86_ESP
, 4);
40 x86_not_reg (p
, X86_EDX
);
41 x86_not_reg (p
, X86_ECX
);
42 x86_not_mem (p
, mem_addr
);
43 x86_not_membase (p
, X86_ESP
, 4);
44 x86_not_membase (p
, X86_ESP
, 0x4444444);
45 x86_not_membase (p
, X86_EBP
, 0x4444444);
46 x86_not_membase (p
, X86_ECX
, 0x4444444);
47 x86_not_membase (p
, X86_EDX
, 0);
48 x86_not_membase (p
, X86_EBP
, 0);
50 x86_neg_reg (p
, X86_EAX
);
51 x86_neg_reg (p
, X86_ECX
);
52 x86_neg_mem (p
, mem_addr
);
53 x86_neg_membase (p
, X86_ESP
, 8);
55 x86_alu_reg_imm (p
, X86_ADD
, X86_EAX
, 5);
56 x86_alu_reg_imm (p
, X86_ADD
, X86_EBX
, -10);
57 x86_alu_reg_imm (p
, X86_SUB
, X86_EDX
, 7);
58 x86_alu_reg_imm (p
, X86_OR
, X86_ESP
, 0xffffedaf);
59 x86_alu_reg_imm (p
, X86_CMP
, X86_ECX
, 1);
60 x86_alu_mem_imm (p
, X86_ADC
, mem_addr
, 2);
61 x86_alu_membase_imm (p
, X86_ADC
, X86_ESP
, -4, 4);
62 x86_alu_membase_imm (p
, X86_ADC
, X86_ESP
, -12, 0xffffedaf);
64 x86_alu_mem_reg (p
, X86_SUB
, mem_addr
, X86_EDX
);
65 x86_alu_reg_reg (p
, X86_ADD
, X86_EAX
, X86_EBX
);
66 x86_alu_reg_mem (p
, X86_ADD
, X86_EAX
, mem_addr
);
67 x86_alu_reg_imm (p
, X86_ADD
, X86_EAX
, 0xdeadbeef);
68 x86_alu_reg_membase (p
, X86_XOR
, X86_EDX
, X86_ESP
, 4);
69 x86_alu_membase_reg (p
, X86_XOR
, X86_EBP
, 8, X86_ESI
);
71 x86_test_reg_imm (p
, X86_EAX
, 16);
72 x86_test_reg_imm (p
, X86_EDX
, -16);
73 x86_test_mem_imm (p
, mem_addr
, 1);
74 x86_test_membase_imm (p
, X86_EBP
, 8, 1);
76 x86_test_reg_reg (p
, X86_EAX
, X86_EDX
);
77 x86_test_mem_reg (p
, mem_addr
, X86_EDX
);
78 x86_test_membase_reg (p
, X86_ESI
, 4, X86_EDX
);
80 x86_shift_reg_imm (p
, X86_SHL
, X86_EAX
, 1);
81 x86_shift_reg_imm (p
, X86_SHL
, X86_EDX
, 2);
83 x86_shift_mem_imm (p
, X86_SHL
, mem_addr
, 2);
84 x86_shift_membase_imm (p
, X86_SHLR
, X86_EBP
, 8, 4);
89 x86_shift_reg (p
, X86_SHL
, X86_EAX
);
90 x86_shift_mem (p
, X86_SHL
, mem_addr
);
92 x86_mul_reg (p
, X86_EAX
, 0);
93 x86_mul_reg (p
, X86_EAX
, 1);
94 x86_mul_membase (p
, X86_EBP
, 8, 1);
96 x86_imul_reg_reg (p
, X86_EBX
, X86_EDX
);
97 x86_imul_reg_membase (p
, X86_EBX
, X86_EBP
, 12);
99 x86_imul_reg_reg_imm (p
, X86_EBX
, X86_EDX
, 10);
100 x86_imul_reg_mem_imm (p
, X86_EBX
, mem_addr
, 20);
101 x86_imul_reg_membase_imm (p
, X86_EBX
, X86_EBP
, 16, 300);
103 x86_div_reg (p
, X86_EDX
, 0);
104 x86_div_reg (p
, X86_EDX
, 1);
105 x86_div_mem (p
, mem_addr
, 1);
106 x86_div_membase (p
, X86_ESI
, 4, 1);
108 x86_mov_mem_reg (p
, mem_addr
, X86_EAX
, 4);
109 x86_mov_mem_reg (p
, mem_addr
, X86_EAX
, 2);
110 x86_mov_mem_reg (p
, mem_addr
, X86_EAX
, 1);
111 x86_mov_membase_reg (p
, X86_EBP
, 4, X86_EAX
, 1);
113 x86_mov_regp_reg (p
, X86_EAX
, X86_EAX
, 4);
114 x86_mov_membase_reg (p
, X86_EAX
, 0, X86_EAX
, 4);
115 x86_mov_reg_membase (p
, X86_EAX
, X86_EAX
, 0, 4);
116 x86_mov_reg_memindex (p
, X86_ECX
, X86_EAX
, 34, X86_EDX
, 2, 4);
117 x86_mov_reg_memindex (p
, X86_ECX
, X86_NOBASEREG
, 34, X86_EDX
, 2, 4);
118 x86_mov_memindex_reg (p
, X86_EAX
, X86_EAX
, 0, X86_EDX
, 2, 4);
119 x86_mov_reg_reg (p
, X86_EAX
, X86_EAX
, 1);
120 x86_mov_reg_reg (p
, X86_EAX
, X86_EAX
, 4);
121 x86_mov_reg_mem (p
, X86_EAX
, mem_addr
, 4);
123 x86_mov_reg_imm (p
, X86_EAX
, 10);
124 x86_mov_mem_imm (p
, mem_addr
, 54, 4);
125 x86_mov_mem_imm (p
, mem_addr
, 54, 1);
127 x86_lea_mem (p
, X86_EDX
, mem_addr
);
129 x86_widen_memindex (p
, X86_EDX
, X86_ECX
, 0, X86_EBX
, 2, 1, 0);
134 x86_fp_op_mem (p
, X86_FADD
, mem_addr
, 1);
135 x86_fp_op_mem (p
, X86_FSUB
, mem_addr
, 0);
136 x86_fp_op (p
, X86_FSUB
, 2);
137 x86_fp_op_reg (p
, X86_FMUL
, 1, 0);
141 x86_fnstcw (p
, mem_addr
);
142 x86_fnstcw_membase (p
, X86_ESP
, -8);
144 x86_fldcw_membase (p
, X86_ESP
, -8);
149 x86_fld_membase (p
, X86_ESP
, -8, 1);
150 x86_fld_membase (p
, X86_ESP
, -8, 0);
151 x86_fld80_membase (p
, X86_ESP
, -8);
152 x86_fild_membase (p
, X86_ESP
, -8, 1);
153 x86_fild_membase (p
, X86_ESP
, -8, 0);
158 x86_fst (p
, mem_addr
, 1, 0);
159 x86_fst (p
, mem_addr
, 1, 1);
160 x86_fst (p
, mem_addr
, 0, 1);
162 x86_fist_pop_membase (p
, X86_EDX
, 4, 1);
163 x86_fist_pop_membase (p
, X86_EDX
, 4, 0);
165 x86_push_reg (p
, X86_EBX
);
166 x86_push_membase (p
, X86_EBP
, 8);
167 x86_push_imm (p
, -1);
168 x86_pop_reg (p
, X86_EBX
);
178 x86_jump32 (p
, mem_addr
);
179 x86_patch (start
, target
);
182 x86_patch (start
, target
);
183 x86_jump_reg (p
, X86_EAX
);
184 x86_jump_membase (p
, X86_EDX
, 16);
186 x86_jump_code (p
, target
);
188 x86_branch8 (p
, X86_CC_EQ
, 54, 1);
189 x86_branch32 (p
, X86_CC_LT
, 54, 0);
190 x86_branch (p
, X86_CC_GT
, target
, 0);
191 x86_branch_disp (p
, X86_CC_NE
, -4, 0);
193 x86_set_reg (p
, X86_CC_EQ
, X86_EAX
, 0);
194 x86_set_membase (p
, X86_CC_LE
, X86_EBP
, -8, 0);
196 x86_call_code (p
, printf
);
197 x86_call_reg (p
, X86_ECX
);
215 x86_cmov_reg (p
, X86_CC_GT
, 1, X86_EAX
, X86_EDX
);
216 x86_cmov_membase (p
, X86_CC_GT
, 0, X86_EAX
, X86_EDX
, -4);
219 x86_epilog (p
, X86_CALLER_REGS
);
222 for (i
= 0; i
< size
; ++i
)
223 printf (".byte %d\n", (unsigned int) code
[i
]);