作者Litfal (Litfal)
看板C_Sharp
标题Re: [问题] 需要高手挑战的诡异问题
时间Fri Sep 9 16:41:00 2016
※ 引述《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 记忆体。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.135.34.240
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1473410463.A.FD6.html
1F:推 erspicu: 水喔 这招好用.. 09/09 17:52
2F:推 ryanwang: 感谢分享...笔记~~~ 09/14 10:48
3F:推 ssas1115577: 笔记中 09/17 05:21