当前位置: 代码迷 >> 汇编语言 >> 关于gnu-asm中基址变址寻址方式的格式有关问题
  详细解决方案

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

热度:9143   发布时间:2013-02-26 00:00:00.0
关于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是一定有的
  相关解决方案