public override void Assemble()
        {
            MachineCode mc = new MachineCode();
            string line;
            int previousIndex = 0;
            while ((line = _codeReader.ReadLine()) != null)
            {
                if (_sicxeCommentRegExp.IsMatch(line)) continue;
                else if (_sicxeStatementRegExp.IsMatch(line))
                {
                    Match m = _sicxeStatementRegExp.Match(line);
                    List<string> arguments = new List<string>();

                    if (m.Groups[3].Success) arguments.Add(m.Groups[3].Value);
                    if (m.Groups[4].Success)
                    {
                        foreach (Capture g in m.Groups[4].Captures)
                        {
                            arguments.Add(g.Value);
                        }
                    }

                    _code.Add(
                      StatementTypeTable[
                        ((m.Groups[2].Value[0] == '+') ? m.Groups[2].Value.Substring(1) : m.Groups[2].Value)
                      ].Create(m.Groups[1].Value, m.Groups[2].Value, arguments));
                    _code[_code.Count - 1].OnePass(this);
                    Console.WriteLine(_code[_code.Count - 1].ToString());
                }
                else
                {
                    throw new Error("The line:" + line + " is wrong. Please check it.");
                }
            }
        }
        private void SecondPass()
        {
            MachineCode mc = new MachineCode();
            int previousIndex = 0;
            for(int i = 0 ; i < _code.Count ; i++)
            {
                _code[i].SecondPass(this);

                if (_code[i].Relocation != null && _code[i].Relocation.Count >= 1 )
                {
                    mc.MRecord.AddRange(_code[i].Relocation);
                }
                if (_code[i].Code != null && _code[i].Code[0] != "")
                {
                    if (_code[i].Code[0][0] == 'H' || _code[i].Code[0][0] == 'E' ||
                        _code[i].Code[0][0] == 'D' || _code[i].Code[0][0] == 'R' )
                    {
                        if (_previousOutputAddress != NoAddress)
                        {
                            mc.TRecord[mc.TRecord.Count - 1] += string.Format("{0:X}", _code[i - 1].Location - _previousOutputAddress + _code[i - 1].Length).PadLeft(2, '0');
                            for (int j = previousIndex; j < i; j++)
                            {
                                mc.TRecord[mc.TRecord.Count - 1] += _code[j].Code[0];
                            }
                            _previousOutputAddress = NoAddress;
                        }
                        if (_code[i].Code[0][0] == 'H')
                        {
                            mc.HRecord = _code[i].Code[0];
                        }
                        else if (_code[i].Code[0][0] == 'E')
                        {
                            mc.ERecord = _code[i].Code[0];
                        }
                        else if (_code[i].Code[0][0] == 'D')
                        {
                            mc.DRecord = _code[i].Code[0];
                        }
                        else if (_code[i].Code[0][0] == 'R')
                        {
                            mc.RRecord = _code[i].Code[0];
                        }
                    }
                    else
                    {
                        _code[i].Code[0] = _code[i].Code[0].Substring(1);
                        if (_previousOutputAddress == NoAddress)
                        {
                            mc.TRecord.Add("");
                            _previousOutputAddress = _code[i].Location;
                            mc.TRecord[mc.TRecord.Count-1] += string.Format("T{0}", string.Format("{0:X}", _previousOutputAddress).PadLeft(6, '0'));
                            previousIndex = i;
                        }
                        else if ((_code[i-1].Location - _previousOutputAddress + _code[i-1].Length) + _code[i].Length >= 0x20 ||
                            _code[previousIndex].BlockLocation != _code[i].BlockLocation)
                        {
                            mc.TRecord[mc.TRecord.Count-1] += string.Format("{0:X}", _code[i-1].Location - _previousOutputAddress + _code[i-1].Length).PadLeft(2, '0');
                            for (int j = previousIndex; j < i; j++)
                            {
                                mc.TRecord[mc.TRecord.Count-1] += _code[j].Code[0];
                            }
                            mc.TRecord.Add("");
                            _previousOutputAddress = _code[i].Location;
                             mc.TRecord[mc.TRecord.Count-1] += string.Format("T{0}", string.Format("{0:X}", _previousOutputAddress).PadLeft(6, '0'));
                            previousIndex = i;
                        }
                    }
                }
                else
                {
                    if (_code[i].Length > 0 || _code[previousIndex].BlockLocation != _code[i].BlockLocation)
                    {
                        if (_previousOutputAddress != NoAddress)
                        {
                            mc.TRecord[mc.TRecord.Count - 1] += string.Format("{0}", string.Format("{0:X}", _code[i - 1].Location - _previousOutputAddress + _code[i - 1].Length).PadLeft(2, '0'));
                            for (int j = previousIndex; j < i; j++)
                            {
                                mc.TRecord[mc.TRecord.Count - 1] +=  _code[j].Code[0];
                            }
                            _previousOutputAddress = NoAddress;
                        }
                    }
                }
            }
            mc.Write(_codeWriter);
        }