具有高/低字节实现的16位寄存器

时间:2013-05-24 00:14:29

标签: c#

搜索失败了,所以我直接问它 在C#中有没有办法让16bit WORD分开访问? 像AX和另一个常见的寄存器 在c ++上它就像

union unsigned short
{
    struct
    {
        char low,high;
    } parts;
    u16 whole;
} a;
#define ax a.whole
#define al a.parts.low
#define ah a.parts.high

而且我会像

一样使用它
  

AX = 0x3d5f;   啊= 0×04;

等。所以问题是 - 有没有任何方法可以做到这一点没有类\结构,我喜欢使用它

  

AX.h = 0×04

或者那样。

2 个答案:

答案 0 :(得分:8)

您需要使用[StructLayout]属性,指定LayoutKind.Explicit,以便您可以直接控制字段的位置。然后,对于每个字段,使用[FieldOffset]控制其从结构开始的偏移量。像:

using System.Runtime.InteropServices;
...

[StructLayout(LayoutKind.Explicit)]
struct X86Register {
   [FieldOffset(0)] public byte   reg8;    // Like AL
   [FieldOffset(1)] public byte   reg8h;   // Like AH
   [FieldOffset(0)] public ushort reg16;   // Like AX
   [FieldOffset(0)] public uint   reg32;   // Like EAX
   [FieldOffset(0)] public ulong  reg64;   // Like RAX
}

答案 1 :(得分:0)

C#是一种面向对象的语言。如果没有类或结构,就没有办法做任何事情。

使用类,它可以像这样实现:

public class A
{
    private byte[] raw;

    public A()
    {
        raw = new byte[2];
    }

    public byte Low
    {
        get
        {
            return raw[0];
        }
        set
        {
            raw[0] = value;
        }
    }

    public byte High
    {
        get
        {
            return raw[1];
        }
        set
        {
            raw[1] = value;
        }
    }
}