如何在给定汇编代码的C代码中找到变量之间的间隙值?
给定:A=5和B=9,两者之间的差距是多少如何在给定汇编代码的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字
- w和x
- y和p
- p和z
- z和q
- w和x=w之间的间隙是大小为30的字符数组,但在32位处理器中x是7+1位的整数
- y和p=y之间的间隙是一个大小为6的短数组,但p是一个整数
- p和z=p之间的间隙是一个整数,但z是大小为6的双数组
- z和q=z之间的间隙是维度为6的双数组,但q是一个短变量
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));