亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? objmodule_c.cpp

?? 單片機宏匯編器的源程序。給一些愛好者作為學習編譯原理和 C 程序設計的例子.
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//---------------------------------------------------------------------------
//-------- OBJModule_C.cpp ---------------------------------------------------
//---------------------------------------------------------------------------

#include "OBJModule_H.h"
#include "LabelManiger_H.h"
#include "MAsmber_H.h"
#include "ASM_Segment_H.h"
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//
//                    OBJ模塊生成器
//
//---------------------------------------------------------------------------
#define DebugKit(str)    //DebugMsg(str)

//------ 構造器 -------------------------------------------------------------
OBJmodule::OBJmodule(MacroAsmber& m, const Jstring& Mname)
                            : masm(m),
                              TRN_ID(0xFD),REG_MSK(0x01),
                              ExtSymDefHead(NULL),ExtSymSum(0),
                              Debug(false)
{ ModuleName = Mname;     // 模塊名,默認為不帶擴展名的文件名
  ModuleName.ToUp();      // 轉成大寫。
   SrcfilePt = masm.AsmFn;  // 源程序文件指針
   OBJfilePt = masm.objFilePt; // 目標程序文件指針

  // 創建默認的絕對段,段ID為零。
  SegDefTail = SegDefHead = new ASM_Segment(SEG_CODE);
  SegDefTail = SegDefTail->next = new ASM_Segment(SEG_DATA);
  SegDefTail = SegDefTail->next = new ASM_Segment(SEG_XDATA);
  SegDefTail = SegDefTail->next = new ASM_Segment(SEG_IDATA);
  SegDefTail = SegDefTail->next = new ASM_Segment(SEG_BIT);

} // end constructor
//---------------------------------------------------------------------------

//------ 析構器 -------------------------------------------------------------
OBJmodule::~OBJmodule()
{ for( register ASM_Segment* p; SegDefHead;
       p = SegDefHead->next, delete SegDefHead, SegDefHead = p ); // endfor
} // end destructor
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 往目標模塊添加一個新段。
//---------------------------------------------------------------------------
ASM_Segment* OBJmodule::AddSegment(Tokenfield &tkn)
{ SegDefTail->next = new ASM_Segment;

  ASM_Segment& NewSeg = *(SegDefTail->next);
  NewSeg.SegID    = SegDefTail->SegID + 1;
  NewSeg.SegType  = tkn.Token2;
  NewSeg.RelType  = tkn.loc[1];
  NewSeg.Name     = tkn.Name;
  SegDefTail = SegDefTail->next; // 往鏈尾添加。
  return SegDefTail;
} // end AddSegment
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// 圖示:
//struct ExtSymDef
//{  int8u IDBLK;
//  int16u ExtID;
//  JLabelNode* LabPt;
//   ExtSymDef* next;
//}; // end ExtSymDef
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// 返回SymID。
//---------------------------------------------------------------------------
int16u OBJmodule::AddExtSymDef(JLabelNode* LBpt)
{ ExtSymDef* extSym = new ExtSymDef;

  extSym->IDBLK = IDBLK_EXT_OPND;       // (0x02)
  extSym->LabPt = LBpt;
  extSym->ExtID = ExtSymSum++;          // 分配ExtID。
  extSym->next  = NULL;

  if(ExtSymDefHead)
   { register ExtSymDef* t = ExtSymDefHead;   // find tail
     for( ; t->next; t = t->next ); // end for
     t->next = extSym;                // 從尾部插入
   } // endif
  else
   { ExtSymDefHead = extSym; }        // 從尾部插入

  return extSym->ExtID;
} // end AddExtSymDef
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void OBJmodule::WriteModuleHeader() // 寫一個模塊頭到文件
{ OBJrecord MHR(0x02);  // Module Header Record
  MHR.AddJstr(ModuleName);
  MHR.AddByte(TRN_ID);
  MHR.AddByte(0x00);    // unused byte
  OBJfilePt->WriteARecord(MHR);
} // end WriteModuleHeader
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
void OBJmodule::WriteModuleENDrec() // 寫一個模塊尾到文件
{ OBJrecord MER(0x04);  // Module END Record
  MER.AddJstr(ModuleName);
  MER.AddWord(0x0000);  // unused 2 bytes
  MER.AddByte(REG_MSK);
  MER.AddByte(0x00);    // unused byte
  OBJfilePt->WriteARecord(MER);
} // end WriteModuleENDrec
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void OBJmodule::WriteScopeDefMB() // 寫一個模塊ScopeDef到文件(Module Block)
{ OBJrecord SDR(0x10);     // Scope Definition Record
  SDR.AddByte(0x00);       // BLK TYP = module block
  SDR.AddJstr(ModuleName); // Block Name
  OBJfilePt->WriteARecord(SDR);
} // end WriteScopeDefrec
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void OBJmodule::WriteSRCNamesRec()
{ OBJrecord SNR(0x24);      // Source Name Record
  SNR.AddByte(0x00);
  SNR.AddWord(0x0000);      // unused 3 bytes
  SNR.AddJstr(SrcfilePt->FileName); // Source file name
  OBJfilePt->WriteARecord(SNR);
} // end WriteSRCNamesRec
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void OBJmodule::WriteScopeDefME() // 寫一個模塊ScopeDef到文件(Module End)
{ OBJrecord SDR(0x10);     // Scope Definition Record
  SDR.AddByte(0x03);       // BLK TYP = module END
  SDR.AddJstr(ModuleName); // Block Name
  OBJfilePt->WriteARecord(SDR);
} // end WriteScopeDefME
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 把模塊中的一系列段的段定義寫到文件中。
//---------------------------------------------------------------------------
void OBJmodule::WriteSegDefRecords()
{ for(ASM_Segment* p = SegDefHead;  p;  p = p->next)
   { WriteASegDefRec(p); } // end for
} // end WriteSegDefRecords
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 產生一個Debug的符號記錄組。
//---------------------------------------------------------------------------
inline void OBJmodule::GenDebugSymbolRecs()
{ WriteDebugSegSymRec();   // Debug Segment Symbol
  WriteDebugPubSymRec();   // Debug Public Symbol
  WriteDebugLocalSymRec(); // Debug Local Symbol
} // end GenDebugSymbolRecs
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 寫一個模塊到文件。
//---------------------------------------------------------------------------
void OBJmodule::WriteModuleToOBJFile()
{ WriteModuleHeader();     // 寫一個模塊頭記錄。

  WriteSegDefRecords();    // 寫段定義記錄。
  WriteAnExtDefRec();      // 寫一個外部變量定義記錄。
  WriteAPubDefRec();       // 寫一個公共變量定義記錄。

  WriteScopeDefMB();       // Scope Begin
  WriteSRCNamesRec();      // Source file name

  GenDebugSymbolRecs();    // 產生Debug的符號記錄組。
  GenContentFixLineNo();   //

  WriteScopeDefME();       // Scope Begin
  WriteModuleENDrec();     // 寫一個模塊尾記錄。
} // end WriteModuleToOBJFile
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 寫一個段定義記錄。[0FH] Segment Definition Record
// 如果是一個空段,不寫入。
// 至少包括一個段。
//---------------------------------------------------------------------------
void OBJmodule::WriteASegDefRec(ASM_Segment* segpt)
{ if(segpt->IsEmpty()) { return; }
  OBJrecord rec(0x0f); // [0FH] Segment Definition Record

  rec.AddWord(segpt->SegID);
  rec.AddByte(segpt->SegInfo());
  rec.AddByte(segpt->RelType);
  rec.AddByte(0x00);      // unused
  rec.AddWord(segpt->SegBase);
  rec.AddWord(segpt->SegSize);
  rec.AddJstr(segpt->Name);

  OBJfilePt->WriteARecord(rec);
} // end WriteASegDefRec
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// 寫一個外部變量定義記錄。(外部變量個數<65535)
// 如果沒有外部變量,則本記錄不寫入。
//---------------------------------------------------------------------------
void OBJmodule::WriteAnExtDefRec()
{ OBJrecord EDR(0x19);     // External Definition Record [19H]
  int16u count = 0;
  for( register ExtSymDef* SymPt = ExtSymDefHead;
           SymPt;                     // conditions <==> (SymPt != NULL)
               SymPt = SymPt->next )
   { EDR.AddByte(SymPt->IDBLK);           // ID BLK
     EDR.AddWord(SymPt->ExtID);           // ExtID
     EDR.AddByte(SymPt->LabPt->getTyp());   // SYM INFO
     EDR.AddByte(0x00);                   // unused
     EDR.AddJstr(SymPt->LabPt->LName);    // Name
     ++count;

     if(EDR.GetLEN()> MaxObjRecLength)
      { OBJfilePt->WriteARecord(EDR); EDR.ReNew(0x19); } // endif
   } // end for
  if(count)     // <==> if(count != 0)
   { OBJfilePt->WriteARecord(EDR); } // endif
} // end WriteAnExtDefRec
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 寫一個公共(PUBLIC)變量定義記錄。(公共變量個數<65535)
// 如果沒有PUBLIC變量,則本記錄不寫入。
//---------------------------------------------------------------------------
void OBJmodule::WriteAPubDefRec()
{ LabelManager &LM = *(masm.LabMger);
  JLabelNode* tp;

  LM.InitListPtr(tp);
  int16u count = 0;

  OBJrecord PDR(0x17);     // Public Definition Record [17H]
  for( ; LM.GetAPublicLabel(tp); tp = tp->next)
   { PDR.AddWord(tp->RefSeg->SegID);     // SEGID
     PDR.AddByte(tp->getTyp());          // SYM INFO
     PDR.AddWord(tp->Value);             // Offset
     PDR.AddByte(0x00);                  // unused
     PDR.AddJstr(tp->LName);             // Name
     ++count;

     if(PDR.GetLEN()> MaxObjRecLength)
      { OBJfilePt->WriteARecord(PDR); PDR.ReNew(0x17); } // endif
   } // end for
  if(count)     // <==> if(count != 0)
   { OBJfilePt->WriteARecord(PDR); } // endif
} // end WriteAPubDefRec
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 寫一個Debug的段標號記錄。   (個數<65535)
// 如果沒有SEG變量,則本記錄不寫入。
//---------------------------------------------------------------------------
void OBJmodule::WriteDebugSegSymRec()
{ if( !Debug ) { return; } // endif
  OBJrecord DSR(0x23);     // Debug Segment symbol Record [23H]
  DSR.AddByte(0x02);       // DEF TYP =[Segment symbols] (0x02)

  ASM_Segment* sgp;

  for(sgp = SegDefHead->next;
          sgp && sgp->SegID == 0;
              sgp = sgp->next); // 從非絕對段開始。

  if(sgp == NULL) { return; } // endif
   // 如果沒有可再定位段,返回,本記錄不寫入。
  for(  ; sgp; sgp = sgp->next )
   { DSR.AddWord(sgp->SegID);            // SEGID
     DSR.AddByte(sgp->SegInfo());        // SEG INFO
     DSR.AddWord(sgp->SegBase);          // Offset
     DSR.AddByte(0x00);                  // unused
     DSR.AddJstr(sgp->Name);             // SEG Name
   } // end for
  OBJfilePt->WriteARecord(DSR);
} // end WriteDebugSegSymRec
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 寫一個Debug的PUBLIC標號記錄。   (個數<65535)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲免费在线观看视频| 日韩**一区毛片| 亚洲一二三专区| 蜜桃av一区二区| 成人h动漫精品一区二| 3d动漫精品啪啪一区二区竹菊| 欧美精品一区二| 五月婷婷久久丁香| av亚洲精华国产精华精华| 日韩视频免费直播| 亚洲一区二区三区国产| 成人午夜在线播放| 欧美mv日韩mv| 视频一区视频二区在线观看| aaa亚洲精品一二三区| 欧洲精品视频在线观看| 91最新地址在线播放| 久久久久久久久久电影| 中文字幕第一区综合| 视频一区二区三区入口| 91丝袜国产在线播放| 久久久精品国产99久久精品芒果| 亚洲成人精品影院| 一本大道久久a久久综合| 久久久久久免费毛片精品| 青青草一区二区三区| 欧美无人高清视频在线观看| 亚洲欧美另类图片小说| 99国产精品久久久久久久久久| 国产日韩亚洲欧美综合| 韩日av一区二区| 亚洲精品一区二区三区香蕉| 免费观看91视频大全| 欧美精品亚洲二区| 婷婷开心激情综合| 欧美高清视频不卡网| 欧美色爱综合网| 丝袜脚交一区二区| 欧美日韩国产在线播放网站| 亚洲一区在线免费观看| 日本韩国精品在线| 亚洲电影第三页| 欧美精品久久久久久久久老牛影院| 一区二区三区毛片| 欧美久久久久久久久| 午夜精品一区在线观看| 91精品欧美综合在线观看最新| 亚洲sss视频在线视频| 在线免费不卡视频| 日韩电影在线观看一区| 欧美一区午夜精品| 另类综合日韩欧美亚洲| 精品国精品自拍自在线| 国产剧情一区二区三区| 国产精品污污网站在线观看| 99精品国产视频| 亚洲综合一区二区三区| 欧美一区二区三区在线视频| 亚洲444eee在线观看| 免费观看在线色综合| 五月综合激情婷婷六月色窝| 亚洲成av人综合在线观看| 26uuu久久天堂性欧美| 成人app在线观看| 亚洲va欧美va人人爽| 欧美亚洲综合网| 麻豆成人91精品二区三区| 久久综合久久综合久久综合| av在线不卡电影| 亚洲福中文字幕伊人影院| 日韩一区二区精品| 成人精品一区二区三区中文字幕| 亚洲乱码国产乱码精品精可以看| 欧美精品tushy高清| 久久精品国产**网站演员| 国产精品女人毛片| 欧美日韩在线播放三区| 麻豆国产91在线播放| 一区二区三区蜜桃网| 国产精品久久久久影院老司| 经典三级在线一区| 亚洲免费三区一区二区| 欧美人妖巨大在线| 国产精品亚洲综合一区在线观看| 亚洲欧美国产毛片在线| 欧美美女一区二区三区| 成人av免费在线播放| 奇米精品一区二区三区在线观看 | 国产成人综合在线| 一区二区视频在线| 26uuu国产日韩综合| 91福利在线免费观看| 国产久卡久卡久卡久卡视频精品| 亚洲乱码日产精品bd| 久久欧美中文字幕| 欧美老肥妇做.爰bbww| 91在线观看成人| 国产一区二区三区免费| 午夜久久久久久电影| 亚洲色图视频网站| 久久久影视传媒| 日韩欧美亚洲国产精品字幕久久久| 日本久久一区二区| 午夜久久电影网| 日韩精品一区二区三区swag| 日韩精品欧美成人高清一区二区| 国产欧美日韩综合| 欧美一级高清大全免费观看| 色噜噜狠狠成人网p站| hitomi一区二区三区精品| 国产专区欧美精品| 蜜臀av性久久久久蜜臀aⅴ四虎| 自拍偷拍亚洲欧美日韩| 欧美高清在线视频| 国产三级一区二区三区| 日韩精品一区在线观看| 欧美一区二区大片| 91麻豆精品国产91久久久资源速度 | 久久不见久久见免费视频1| 亚洲一二三四久久| 一区二区在线观看免费视频播放| 中文字幕欧美激情一区| 久久久久久久久岛国免费| 中文字幕一区二区三区色视频| 欧美一二三四区在线| 久久精品视频一区| 国产精品中文字幕日韩精品| 成人免费在线播放视频| 欧美国产97人人爽人人喊| 欧美激情一区二区三区| 日本一区二区三级电影在线观看 | 国产精品美女久久久久久久久| 亚洲精品在线三区| 久久伊人中文字幕| 中文字幕不卡在线观看| 中文字幕一区日韩精品欧美| 亚洲色图.com| 亚洲一区二区三区免费视频| 天堂一区二区在线| 免费在线观看一区| 国产资源在线一区| www.视频一区| 91黄色免费版| 欧美挠脚心视频网站| 日韩精品中文字幕一区二区三区 | 亚洲一二三四在线| 视频一区中文字幕国产| 国产一区二区三区黄视频 | www国产精品av| 国产丝袜在线精品| 亚洲一区二区在线免费看| 天堂av在线一区| 国产盗摄一区二区三区| 色噜噜久久综合| 日韩一级欧美一级| 国产喷白浆一区二区三区| 亚洲女与黑人做爰| 毛片av一区二区三区| 不卡一区二区三区四区| 欧美四级电影在线观看| 久久一区二区视频| 亚洲欧美日韩成人高清在线一区| 午夜精品视频一区| 国产在线精品一区二区不卡了| 91丨九色porny丨蝌蚪| 日韩欧美亚洲另类制服综合在线| 国产精品欧美一区二区三区| 肉丝袜脚交视频一区二区| 国产91丝袜在线播放| 欧美精品精品一区| 国产精品成人一区二区三区夜夜夜| 五月婷婷欧美视频| 不卡的av电影在线观看| 日韩三级在线观看| 亚洲免费av在线| 国产精品自拍毛片| 在线电影国产精品| 亚洲欧美电影一区二区| 国产一区二区福利视频| 欧美视频在线一区二区三区 | 久久福利资源站| 日本高清免费不卡视频| 欧美极品美女视频| 美女mm1313爽爽久久久蜜臀| 色94色欧美sute亚洲线路二| 久久久久久久久伊人| 看片的网站亚洲| 欧美日高清视频| 亚洲伊人色欲综合网| av在线综合网| 国产精品天天摸av网| 国产中文字幕一区| 欧美成人猛片aaaaaaa| 亚洲国产成人91porn| 91美女片黄在线观看91美女| 国产精品网站在线播放| 高清久久久久久| 久久久国产精品不卡| 激情六月婷婷综合| 日韩欧美资源站|