1 // PUSH (2) Push Data Onto the Stack 8, 16, 32 1 Operand is the data being pushed on the stack
2 #PUSH32
3 uint32_t a = VM_GET_UINT_32;
4 REGS.SP -= 4;
5 if (REGS.SP <= REGS.IP)
6 {
7 return VMERROR_STACKOVERFLOW;
8 }
9 put_uint32_in_char_array(MEM, REGS.SP, a); // because the heap is decreasing, it's written to the upper 4 bytes - 2216805945
10 #test
11 IR { A = 0 IP = 0 BP = 32 SP = 32 }
12 IM { (32)0, 2216805945, 0, 0, 0, 0, 0, 0 }
13 FR { A = 0 IP = 8 BP = 32 SP = 28 }
14 FM { (32)0, 2216805945, 0, 0, 0, 0, 0, 2216805945 }
15 #end
16
17
18
19 BECOMES:
20
21
22
23 .
24 .
25 .
26 #define VMF_PUSH32 2
27 .
28 .
29 .
30 int vmf_PUSH32(vm* vm)
31 {
32 int ip_cnt = 4;
33
34 uint32_t a = VM_GET_UINT_32;
35 // should this be BP or SP?.... damn it's been too long...
36 REGS.SP -= 4;
37 if (REGS.SP <= REGS.IP)
38 {
39 return VMERROR_STACKOVERFLOW;
40 }
41 put_uint32_in_char_array(MEM, REGS.SP, a); // because the heap is decreasing, it's written to the upper 4 bytes - 2216805945
42
43 if (vm_error > 0)
44 {
45 return vm_error;
46 }
47 vm->model.registers.IP += ip_cnt;
48 return 0;
49 }
50 .
51 .
52 .
53 vm_functions[VMF_PUSH32] = vmf_PUSH32;
54 .
55 .
56 .
57 // vmf_PUSH32(0)
58 {
59 total++;
60 vm* i_vm = new vm();
61 vm* f_vm = new vm();
62
63 i_vm->model.registers.A.ui32 = 0;
64 i_vm->model.registers.B.ui32 = 0;
65 i_vm->model.registers.C.ui32 = 0;
66 i_vm->model.registers.D.ui32 = 0;
67 i_vm->model.registers.E.ui32 = 0;
68 i_vm->model.registers.F.ui32 = 0;
69 i_vm->model.registers.R.ui32 = 0;
70 i_vm->model.registers.BP = 32;
71 i_vm->model.registers.SP = 32;
72 i_vm->model.registers.IP = 0;
73 f_vm->model.registers.A.ui32 = 0;
74 f_vm->model.registers.C.ui32 = 0;
75 f_vm->model.registers.D.ui32 = 0;
76 f_vm->model.registers.E.ui32 = 0;
77 f_vm->model.registers.B.ui32 = 0;
78 f_vm->model.registers.F.ui32 = 0;
79 f_vm->model.registers.R.ui32 = 0;
80 f_vm->model.registers.BP = 32;
81 f_vm->model.registers.SP = 28;
82 f_vm->model.registers.IP = 8;
83 i_vm->model.mem = new unsigned char[32] {0, 0, 0, 0, 132, 33, 198, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
84 f_vm->model.mem = new unsigned char[32] {0, 0, 0, 0, 132, 33, 198, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 33, 198, 57};
85 i_vm->model.mem_size = 32;
86 f_vm->model.mem_size = 32;
87 int ret = vmf_PUSH32(i_vm);
88 if (ret != 0)
89 {
90 cout << "TEST FAILED (execute): vmf_PUSH32(0) returned " << ret << endl;
91 failures++;
92 }
93 else
94 {
95 string output = "";
96 if (!compare_vms(i_vm, f_vm, output))
97 {
98 cout << "TEST FAILED (compare): vmf_PUSH32(0) - " << output.c_str() << endl;
99 failures++;
100 }
101 }
102 delete i_vm;
103 delete f_vm;
104 }
105 .
106 .
107 .