1 寄存器寻址
movl %eax, %edx edx = eax;
将寄存器eax赋值给edx
2 立即数寻址
movl $0x123, %edx edx = 0x123
将一个立即数放入寄存器
3 直接寻址
movl 0x123, %edx edx =*(int32_t*)0x123
将一个立即数所指的地址中的内容放到寄存器
4 间接寻址
movl (%ebx), %edx edx = *(int32_t*)ebx;
将一个寄存器内容(地址)所在的内容放到寄存器
5 变址寻址
movl 4(%ebx), %edx edx = *(int32_t*)(ebx+4);
在4的基础上加上偏移
b,w,l,q 分别代表8位,16位,32位和64位
一些常见命令举例:
0x000000000040062d <main+1>: mov %rsp,%rbp
//rbp = rsp
0x0000000000400630 <main+4>: sub $0x10,%rsp
//rsp -= rsp - 0x10
0x0000000000400634 <main+8>: movl $0xa,-0xc(%rbp)
//*(rbp-0xc) = 0xa
0x000000000040063b <main+15>: lea -0xc(%rbp),%rax
//rax = rbp - 0xc.
0x000000000040063f <main+19>: mov %rax,-0x8(%rbp)
//(rbp-0x8) = rax
0x0000000000400643 <main+23>: mov -0x8(%rbp),%rax
//rax = *(rbp-0x8)
0x0000000000400647 <main+27>: movl $0xb,(%rax)
//*rax = 0xb
0x000000000040064d <main+33>: mov -0x8(%rbp),%rdx
//rdx = *(rbp-0x8)
0x0000000000400651 <main+37>: lea -0xc(%rbp),%rsi
//rsi = rbp - 0xc
10x080485ae <+14>: lea 0x18(%esp),%eax
//eax = esp + 0x18
0x080485b2 <+18>: add $0xf,%eax
//eax = eax + f
0x080485b5 <+21>: mov %eax,0x8(%esp)
//*(esp + 0x8) = eax
0x080485b9 <+25>: lea 0x18(%esp),%eax
//eax = esp + 0x18
.0x080485bd <+29>: mov %eax,0x4(%esp)
//*(esp + 0x4) = eax
.0x080485c1 <+33>: movl $0x80486b4,(%esp)
//*esp = 0x80486b4