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