如何从汇编代码推导struct成员类型并补全对应C代码的三目运算
推导步骤详解
1. 先确定结构体大小和数组寻址规则
给定的汇编代码中,首先计算matrixtotest[i][j]的地址偏移:
- 偏移计算过程:
3*i <<5 + 3*j*8 = 96*i +24*j - 二维数组的地址公式为:
基地址 + i * N * sizeof(struct mat) + j * sizeof(struct mat) - 对比系数可得:
sizeof(struct mat) = 24,N=4(因为96=24*4)
2. 推导struct各成员的类型
我们已知rdx + 计算得到的偏移就是&matrixtotest[i][j],根据汇编中对不同偏移的访问指令可以直接推导出成员类型:
- 偏移0对应成员
a:汇编指令movzwl (%rdx), %edx表示将偏移0处的2字节无符号数零扩展为4字节int,因此typeA为unsigned short(uint16_t) - 偏移2对应成员
b:汇编指令cmpb $10, 2(%rdx)表示对偏移2处的1字节数据做比较,因此typeB为char(uint8_t/int8_t) - 偏移8对应成员
c:汇编指令movq 8(%rdx), %rax表示读取偏移8处的8字节数据,因此typeC为long(int64_t)注:偏移3到7是结构体内存对齐产生的填充字节,没有实际存储成员
- 偏移16对应成员
d:汇编指令movl 16(%rdx),%eax表示读取偏移16处的4字节int数据,因此typeD为int(int32_t)注:偏移20到23是结构体对齐到24字节产生的填充字节
3. 推导randFunc的返回表达式
汇编的分支逻辑对应C代码的三目运算符__1__ ? __2__ : __3__:
__1__是分支判断条件:cmpb $10, 2(%rdx)+jg .L5表示当matrixtotest[i][j].b > 10时跳转到.L5分支,因此__1__为matrixtotest[i][j].b > 10__2__是条件为真的返回值:.L5分支直接返回偏移16处的成员d,因此__2__为matrixtotest[i][j].d__3__是条件为假的返回值:非跳转分支逻辑为c - a(先读c到rax,再读a到edx,做减法后返回结果),因此__3__为matrixtotest[i][j].c - matrixtotest[i][j].a
内容的提问来源于stack exchange,提问作者Megan Darcy
相关产品推荐
相关产品推荐

