读书人

关于gnu-asm中基址变址寻址方式的格式

发布时间: 2012-04-17 15:06:33 作者: rapoo

关于gnu-asm中基址变址寻址方式的格式问题
比如在intel格式中这样的语句:MOV EDX,[EBX][ESI]在at&t格式中怎么写呢?我尝试过movl (%ebx,%esi), %edx,但是反汇编程序以后得到的结果却是movl (%ebx,%esi,1),此时不是基址变址寻址方式了,而是基址比例变址寻址方式了,请问如何实现基址变址寻址方式呢?

[解决办法]
(%ebx,%esi,1)==ebx+esi*1==(%ebx,%esi)

比例是1,好像没问题吧?
[解决办法]
GAS中就没有什么基址加变址的说法,只有一种通用的访存格式:value(offset, register, factor),但它已经把Intel的所有的基变址寻址方式都包含进来了。
[解决办法]
就本质上来说,我认为所有这些寻址方式都是立即数+基址+变址乘以比例因子的特殊形式。
[解决办法]
对于x86指令系统,用到了两个寄存器算地址的只有SIB字节
这个字节就是
struct
{
char base:3,index:3,scale:2;
}
对于[EBX][ESI],可以是base=3,index=6,scale=0,也可以是base=6,index=3,scale=0
不管如何,scale是一定有的

读书人网 >汇编语言

热点推荐