关于pe导出表的一个问题
罗云斌老师讲pe的导出表的时候有这么一段代码:
mov edi,@lpAddressOfNameOrdinals
repnz scasw
.if ZERO? ;找到函数名称
sub edi,@lpAddressOfNameOrdinals
sub edi,2
shl edi,1
add edi,@lpAddressOfNames
首先,由于AddressOfNameOrdinals指定的数组是word类型的,所以查找指令用的是scasw而不是scasb或scasd,当查找结束后,如果标志位为0则表示查找成功,这时edi的值指向找到的项目后面一个word的位置,将edi减去数组的基址并减去2(一个word的长度),得到的就是找到的项目的位置偏移。由于这个数组是word类型的,而AddressOfNames指向的数组是dword类型的,所以还要将偏移乘以2来修正一下(使用shl edi,1指令),用修正后的偏移在AddressOfNames表中就可以得到指向函数名称字符串的RVA了。
"由于这个数组是word类型的,而AddressOfNames指向的数组是dword类型的,所以还要将偏移乘以2来修正一下(使用shl edi,1指令)"这一句我没搞懂, 为什么通过shl 就可以将word类型修正成dword类型啊? 还请大家不吝赐教, 不胜感激.