~george-edison55/7basic/trunk

« back to all changes in this revision

Viewing changes to CELFAssemblyOutput.cpp

  • Committer: Nathan
  • Date: 2010-09-29 20:58:50 UTC
  • Revision ID: nathan@nathan-laptop-20100929205850-iosfb9bbpo0vphma
Moving output code - Part 9

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
                                            { X86_JG, "jg" },
27
27
                                            { X86_JGE, "jge" },
28
28
                                            { X86_JMP, "jmp" },
29
 
                                            { X86_JNE, "jne" } };
 
29
                                            { X86_JNE, "jne" },
 
30
                                            { X86_FLD, "fld" },
 
31
                                            { X86_FSTP, "fstp" },
 
32
                                            { X86_FADDP, "faddp" },
 
33
                                            { X86_FSUBRP, "fsubrp" },
 
34
                                            { X86_FMULP, "fmulp" },
 
35
                                            { X86_FDIVRP, "fdivrp" },
 
36
                                            { X86_FCOMPP, "fcompp" },
 
37
                                            { X86_FSTSW, "fstsw" },
 
38
                                            { X86_LEA, "lea" } };
30
39
 
31
40
// This array holds the register number to
32
41
// name table
127
136
 
128
137
        AppendString(stream.str().c_str());
129
138
        AppendString("v_0  resb 4\n");
130
 
        AppendString("V_4  resb 8\n");
 
139
        AppendString("v_4  resb 8\n");
131
140
 
132
141
        // Now we will output the multitude of instructions
133
142
        // for the executable.
181
190
    return std::string(name);
182
191
}
183
192
 
 
193
std::string CELFAssemblyOutput::RegisterFloatLiteral(float fVal)
 
194
{
 
195
    // Basically we just set the precision and add it.
 
196
 
 
197
    char name[64];
 
198
 
 
199
    snprintf(name,64,"f_%d", m_strindex);
 
200
 
 
201
    m_data << name << " dq ";
 
202
    m_data.precision(9);
 
203
    m_data.setf(std::ios::fixed);
 
204
    m_data << fVal << std::endl;
 
205
 
 
206
    m_strindex++;
 
207
 
 
208
    return std::string(name);
 
209
}
 
210
 
184
211
void CELFAssemblyOutput::WriteParam(CInstructionParameter * p)
185
212
{
186
213
    switch(p->iType)
206
233
    case PT_REGISTER_BYTE_POINTER:
207
234
        m_str << "byte [" << g_RegMappingTable[p->value.iRegister].szName << "]";
208
235
        break;
 
236
    case PT_DWORD_SYMBOL:
 
237
        m_str << "dword [" << p->value.pString << "]";
 
238
        break;
 
239
    case PT_DWORD_SYMBOL_4:
 
240
        m_str << "dword [" << p->value.pString << " +4]";
 
241
        break;
 
242
    case PT_DWORD_VALUE:
 
243
        m_str << "dword [v_" << p->value.iOffset << "]";
 
244
        break;
 
245
    case PT_DWORD_VALUE_4:
 
246
        m_str << "dword [v_" << p->value.iOffset << " +4]";
 
247
        break;
 
248
    case PT_QWORD:
 
249
        m_str << "qword [v_" << p->value.iOffset << "]";
 
250
        break;
 
251
    case PT_ST_VAL:
 
252
        m_str << "ST" << p->value.iST;
 
253
        break;
209
254
    }
210
255
}