Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在给定汇编代码的C代码中找到变量之间的间隙值?_C_Gcc - Fatal编程技术网

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

如何在给定汇编代码的C代码中找到变量之间的间隙值?,c,gcc,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是一个短变量 代码 为doSub过程生成的程序集代码 w和x w的大小为5*9=45,但x需要对齐4字节,因此间隙将为3字

给定: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是一个短变量
代码 为doSub过程生成的程序集代码 w和x

w
的大小为
5*9=45
,但
x
需要对齐
4
字节,因此间隙将为
3
字节。也可以在组件中看到
x
的访问偏移量
48

y和p

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

p和z

p
的大小为
4
,因此在偏移量
24
处结束
q
位于偏移量
96
(见组件),
z
的大小
9*8=72
,因此
z
96-72=24
开始。因此,间隙为
0
。(双精度<代码>的对齐方式可能会有所不同,因此会从装配代码向后工作。)

z和q

由于
q
是一个短字符,并且只与
2
字节对齐,因此
z

\include>之后没有间隙
#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));
printf(“w到x:%lu\n”,offsetof(str1,x)-offsetof(str1,w)); printf(“y到p:%lu\n”,offsetof(str2,p)-offsetof(str2,y)); printf(“p到z:%lu\n”,offsetof(str2,z)-offsetof(str2,p)); printf(“z到q:%lu\n”,offsetof(str2,q)-offsetof(str2,z));

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

您询问的是依赖于编译器的结构打包规则。你可以在谷歌上查找这些资料。
offsetof()
返回
size\u t
;正确的格式是每个C99的
%zu
(使用
z
表示
size\u t
而不是
l
表示
long
)。
# t in %rdi, u in %rsi
doSub:
    movswl   96(%rsi), %edx
    movl     20(%rsi), %eax
    subl     %edx, %eax
    movl     %eax, 48(%rdi)
    ret
#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));