如何使用给定的汇编代码在C代码中找到变量之间的间隙值?

时间:2016-04-07 22:33:40

标签: c gcc

鉴于:A = 5且B = 9,......之间的差距是什么?

  • w和x?
  • y和p?
  • p和z?
  • z和q?

在Chegg上找到了这个答案,但我不确定它是否正确。

  
      
  • w和x = w之间的间隙是一个大小为30的字符数组,但在32位处理器中x为7 + 1位的整数
  •   
  • y和p = y之间的间隙是大小为6的短数组,但p是整数
  •   
  • p和z之间的间隙= p是整数,但z是大小为6的双数组
  •   
  • z和q = z之间的间隙是维度6的双数组,但q是短变量
  •   

代码

typedef struct {
    char w[A][B];
    int x;
} str1;

typedef struct {
    short y[B];
    int p;
    double z[B];
    short q; 
} str2;

void doSub(str1 *t, str2 *u) {
    int v1 = u->p;
    int v2 = u->q;
    t->x = v1-v2;
}

为doSub过程生成的汇编代码

# t in %rdi, u in %rsi
doSub:
    movswl   96(%rsi), %edx
    movl     20(%rsi), %eax
    subl     %edx, %eax
    movl     %eax, 48(%rdi)
    ret

2 个答案:

答案 0 :(得分:1)

  

w和x

w的大小为5*9=45,但x需要4字节的对齐,因此差距将为3个字节。也可以在访问48的偏移x的程序集中看到。

  

y和p

y的大小为9*2=18p需要与4字节对齐,因此差距为2。也可以在汇编代码中看到访问偏移量20

  

p和z

p的尺寸为4,因此以偏移24结束。 q位于偏移96(在程序集中看到),z的大小为9*8=72,因此z96-72=24开始。因此,差距为0。 (double的对齐可能会有所不同,因此从汇编代码向后工作。)

  

z和q

由于q很短并且只与2个字节对齐,因此z之后没有差距。

答案 1 :(得分:0)

#include <stddef.h>

printf("w to x: %lu\n", offsetof(str1, x) - offsetof(str1, w));
printf("y to p: %lu\n", offsetof(str2, p) - offsetof(str2, y));
printf("p to z: %lu\n", offsetof(str2, z) - offsetof(str2, p));
printf("z to q: %lu\n", offsetof(str2, q) - offsetof(str2, z));

以任何有意义的方式依赖结果数字通常是一个坏主意。