Re: [問題] 需要高手挑戰的詭異問題

作者: Litfal (Litfal)   2016-09-09 16:41:00
※ 引述《erspicu (.)》之銘言:
: 沒任何問題,但這次有使用到指標與比較進階的struct
: [StructLayout(LayoutKind.Explicit, Size = 2)]
: struct RegWord
: {
: [FieldOffset(1)]
: public byte H; //heigh byte
: [FieldOffset(0)]
: public byte L; //low byte
: [FieldOffset(0)]
: public ushort X; //word
: }
: 除了編譯器或是 .net framework本身bug外,想不出別的理由....
: 資訊更新一:應該跟指標的使用問題有關係 但應該不是我的問題
: 後來把 Main.cs 中
: fixed (byte* P = &Reg_A.L) { Table_ByteRegs[0] = P; }
: fixed (byte* P = &Reg_C.L) { Table_ByteRegs[1] = P; }
: fixed (byte* P = &Reg_D.L) { Table_ByteRegs[2] = P; }
: fixed (byte* P = &Reg_B.L) { Table_ByteRegs[3] = P; }
: fixed (byte* P = &Reg_A.H) { Table_ByteRegs[4] = P; }
: fixed (byte* P = &Reg_C.H) { Table_ByteRegs[5] = P; }
: fixed (byte* P = &Reg_D.H) { Table_ByteRegs[6] = P; }
: fixed (byte* P = &Reg_B.H) { Table_ByteRegs[7] = P; }
: 這種寫法除掉改用別方式來處理register解碼與對應 就ok了
: 改用下面這種方式 但直接靠array來mapping指標操作解碼對應
: 不知到快了 switch有多少倍去....
恕刪一些原文
想在C#裡面玩轉指標,當然不建議用 Managed 記憶體。
也就是,不會像下面這樣直接用 new 的方式宣告結構。
RegWord Reg_A = new RegWord(); // Managed
而是會配置 Unmanaged 記憶體 來玩弄,
宣告會改成指標,建構式使用 Marshal.AllocHGlobal 來初始化。
RegWord* Reg_A;
public Apr8086Core()
{
Reg_A = (RegWord*)Marshal.AllocHGlobal(sizeof(RegWord));
}
然後就會跳一堆錯誤XD。
但很好解決,把結構存取方式由 .member 改成 ->member即可,跟 C 一模一樣。
沒錯,你有三個成員,就跑三次取代就好。變得像這樣:
// target_ea = Reg_A.X + Reg_SI; // old
target_ea = Reg_A->X + Reg_SI; // new
指標表更簡單,連 fixed 都不用了,也跟 C 一模一樣。
Table_WordRegs[0] = &Reg_A->X;
Table_ByteRegs[0] = &Reg_A->L;
Table_ByteRegs[4] = &Reg_A->H;
記得要實作 Dispose 與 解構式,釋放宣告的 Unmanaged 記憶體。
作者: erspicu (.)   2016-09-09 17:52:00
水喔 這招好用..
作者: ryanwang (irene)   2016-09-14 10:48:00
感謝分享...筆記~~~
作者: ssas1115577 (Holey)   2016-09-17 05:21:00
筆記中

Links booklink

Contact Us: admin [ a t ] ucptt.com