C_Sharp 板


LINE

https://www.dropbox.com/s/cit9jl96hzg4lui/Apr8086-needcheck0907.zip?dl=0 这是老电脑 8086的模拟器初步实作 目前只能算是完成CPU的部分(极少数指令尚未完成) 要问的是一个跟模拟器实作层面无关的问题 应该确认是编译器或是 .net framework潜在的bug 只要在专案 x86\CPU.cs 里头的 cpu_exec() 内加入 debug_inf = Reg_B.X.ToString() + Reg_C.X.ToString(); 这样一行 ln 266 (目前观察到只要对register物件内容有ToString()的动作或是相关字串操作 就很容易有问题) x86\CPU.cs cpu_exec() switch case 0x83: 内的 MessageBox.show 内容 ln 2418开始下面几行 就会从 a:0 4 b:4 c:4 d:04 e:00 f: 0400 变成 a:0 4 b:4 c:4 d:00 e:00 f: 0000 (测试方式可以启动程式UI後,点击 DEBUG 的 button 就会测试运作 , MessageBox到 f: 後就可以把程式关闭掉) 实际上目前是简化问题 , 有时候a b c里头的value 会随着开启程式时间不同, 跳乱数...... (前面几次开关城市 测试 a: b: c: 内容都正常,有可能哪次突然跳乱数) 由於开发需要检测每次执行指令各register状态,甚至输出log,之前撰写GameBoy 也是用一样的方式输出各register内容, 没任何问题,但这次有使用到指标与比较进阶的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 (ushort* p = &Reg_ES) { Table_SegRegs[0] = p; } fixed (ushort* p = &Reg_CS) { Table_SegRegs[1] = p; } fixed (ushort* p = &Reg_SS) { Table_SegRegs[2] = p; } fixed (ushort* p = &Reg_DS) { Table_SegRegs[3] = p; } fixed (ushort* p = &Reg_A.X) { Table_WordRegs[0] = p; } fixed (ushort* p = &Reg_C.X) { Table_WordRegs[1] = p; } fixed (ushort* p = &Reg_D.X) { Table_WordRegs[2] = p; } fixed (ushort* p = &Reg_B.X) { Table_WordRegs[3] = p; } fixed (ushort* p = &Reg_SP) { Table_WordRegs[4] = p; } fixed (ushort* p = &Reg_BP) { Table_WordRegs[5] = p; } fixed (ushort* p = &Reg_SI) { Table_WordRegs[6] = p; } fixed (ushort* p = &Reg_DI) { Table_WordRegs[7] = p; } 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有多少倍去.... byte Table_ByteRegsGet(int reg) { switch (reg) { case 0: return Reg_A.L; case 1: return Reg_C.L; case 2: return Reg_D.L; case 3: return Reg_B.L; case 4: return Reg_A.H; case 5: return Reg_C.H; case 6: return Reg_D.H; case 7: return Reg_B.H; } return 0; } void Table_ByteRegsSet(int reg, byte val) { switch (reg) { case 0: Reg_A.L = val; break; case 1: Reg_C.L = val; break; case 2: Reg_D.L = val; break; case 3: Reg_B.L = val; break; case 4: Reg_A.H = val; break; case 5: Reg_C.H = val; break; case 6: Reg_D.H = val; break; case 7: Reg_B.H = val; break; } } --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.254.20.56
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1473217109.A.BD5.html ※ 编辑: erspicu (60.248.56.181), 09/07/2016 16:39:20 ※ 编辑: erspicu (60.248.56.181), 09/07/2016 16:45:57
1F:→ fo40225: 你在fixed区块内把指标的值保留在阵列里 出了fixed 09/08 00:49
2F:→ fo40225: 那个位址值就不保证了 只要GC一动作 你的指标就废了 09/08 00:49
3F:→ fo40225: ToString() 会配置物件 很容易触发0代GC 09/08 00:49
4F:→ fo40225: 使用vs 侦错 视窗 记忆体 把位址打上去 在init後下断点 09/08 00:51
5F:→ fo40225: init最後面写个回圈 new object() 然後观察回圈前後 09/08 00:53
6F:→ fo40225: 阵列里所记录的位址 记忆体会被改变的 09/08 00:54
对喔 fixed {} 的目的应该就是为了确保在某区块范围内指标使用的正确性 出了范围就不一定了... 但总是觉得这样有点不合理 照理来说物件生成後指标应该就是固定了 但因为GC特性 指标会被改变掉 这种用ARRAY塞指标 来达成快速解码对应的方式是参考 C专案来的 看来在C#行不通 用其他的hash物件或是siwtch达成虽可行 但就是没array操控指标方便 以後再看看更好的方式 感谢.. ※ 编辑: erspicu (36.239.98.135), 09/08/2016 10:27:29
7F:推 Litfal: C#不太适合处理这种实值指标、或是需要很精确控制记忆体 09/09 15:55
8F:→ Litfal: 的状况 09/09 15:55







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP