gbase 8a程序目前大部分是运行于x86架构下linux环境中,汇编语法是基于AT&T格式的,这与Intel汇编格式有一定的区别,最主要体现在三个方面:
1. 立即数:立即数前面需要加上$符号,例如,$0x3E,我们使用Imm表示立即数;
2. 寄存器:寄存器前面需要加上%符号,例如,%rax,我们使用R[Ea]表示寄存器;
3. 寻址模式:源操作数在左,目标操作数在右;
其中主要的寻址模式如下
寻址名称 | 格式 | 操作数值 | 示例 |
---|---|---|---|
立即数寻址 | $Imm | Imm | movq $12AE,%rax |
寄存器寻址 | Ea | R[Ea] | movq %rax,%rbx |
绝对寻址 | Imm | M[Imm] | movq 0x80093,%rbx |
间接寻址 | (Ea) | M[R[Ea]] | movq (%ebp),%esp |
基址+偏移量寻址 | Imm(Eb) | M[Imm+R[Eb]] | movq 0x8(%rdi),%rax |
变址寻址 | (Eb,Ei) Imm(Eb,Ei) | M[R[Eb]+R[Ei]] M[Imm+R[Eb]+R[Ei]] | movq (%rdi,%rax),%rcx movq 0x8(%rdi,%rax),%rcx |
比例变址寻址 (s为2、4、8...) | (,Ei,s) Imm(,Ei,s) (Eb,Ei,s) Imm(Eb,Ei,s) | M(R[Ei]*s) M(Imm+R[Ei]*s) M(R[Eb]+R[Ei]*s) M(Imm+R[Eb]+R[Ei]*s) | movq (,%rdi,0x2),%rcx movq 0x8(,%rdi,0x2),%rcx movq (%rbx,%rdi,0x2),%rcx movq 0x8(%rbx,%rdi,0x2),%rcx |