什么是C等价物?

时间:2014-03-28 13:40:36

标签: c linux assembly 32-bit

如何将这段装配转换为C代码?

装配

foo:
   dd 1
   dd 2
   dd 3
   dd baa - foo
  dw 5
  dw 6
  ; ....  
baa:
  db 00
  db 00
 ;...

C

struct foo
{
  int a;
  int b;
  int c;
  int d;
  short e;
  shot f; 
};

struct baa
{
  int a;
  int b;
};

然后:

foo f;
baa b;

f.a = 1;
f.b = 2;
f.c = 3;
f.d = ?? // how do I translate this?
f.e = 5;
f.f  = 6;

b.a = 0;
b.b = 0;

1 个答案:

答案 0 :(得分:4)

这里的意图是(可能是!)来计算foo结构的大小。

在“裸”组件中(没有像结构那样的花哨技巧),没有手动计数的唯一方法是确定结构的第一个和最后一个字节的地址加1。或者,在这种情况下,结构的第一个字节的地址与第一个字节的地址过去结构之间的差异。

在C中,您有sizeof运算符,它确定(在编译时)类型实例的大小。这样可以更好地捕捉意图。在你的情况下,你会说

struct foo f;

// ...

f.d = sizeof(struct foo);

或者,

struct foo f;

// ...

f.d = sizeof(f);