【问题标题】:What is C equivalent?什么是 C 等价物?
【发布时间】:2014-05-08 00:20:14
【问题描述】:

如何将这段汇编代码翻译成 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;

【问题讨论】:

  • 我在想f.d = sizeof(foo)
  • @FredLarson: 如果y 关注xx - y 的大小为y
  • @Jack:它正在计算两个标签地址之间的差异。如果您选择将这些视为 C 中的结构,则结果将是第一个结构的大小,假设它们在内存中是相邻的。
  • @Michael:谢谢。实际上我已经尝试过了,但它在 C 版本中给出了不同的结果。那么错误应该来自另一个来源。我做了 struct 因为它适合 fread()/fwrite() 调用,并且并非所有成员都具有相同的类型大小,例如 int (dd) 和 short(dw)。还有什么方法可以代替?
  • 结构包含的成员是否比您显示的更多?如果是这样,编译器可能会插入一些填充来对齐某些成员。您可以尝试将__attribute__ ((__packed__)) 添加到结构中(或者如果您不使用 gcc,则编译器使用的任何内容)。

标签: c linux assembly 32-bit


【解决方案1】:

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

在“裸”汇编中(没有任何花哨的技巧,如结构),在不手动计数的情况下执行此操作的唯一方法是确定结构的第一个和最后一个字节的地址之间的差异,加上一个。或者,在这种情况下,结构的第一个字节的地址与结构过去结构的第一个字节的地址之间的差异。

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

struct foo f;

// ...

f.d = sizeof(struct foo);

或者,

struct foo f;

// ...

f.d = sizeof(f);

【讨论】:

  • 那么,如果我有两个相邻的标签名为a,b,c,d 那么x = a - d = sizeof(A) + sizeof(B) + sizeof(C) + sizeof(D) 对吗?
  • 如果你的意思是x = d - a,那么x = sizeof(a) + sizeof(b) + sizeof(c)。在这种情况下,您没有“跳过”d,因此您也没有添加 sizeof(d)。如果这仍然令人困惑:想想栅栏,其中a,b,c,d 是栅栏帖子,sizeof 术语是这些帖子之间的板。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 2010-12-07
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2010-09-17
相关资源
最近更新 更多