CSCW2-Newly To Assembly

AT&T风格x86-64汇编指令

操作数指示符

操作数格式

寻址模式
ADDRESS_OR_OFFSET(%BASE_OR_OFFSET,%INDEX,MULTIPLIER)

它所表示的地址可以这样计算出来:

FINAL ADDRESS = ADDRESS_OR_OFFSET + BASE_OR_OFFSET + MULTIPLIER * INDEX

其中ADDRESS_OR_OFFSET和MULTIPLIER必须是常数,BASE_OR_OFFSET和INDEX必须是寄存器。在有些寻址方式中会省略这4项中的某些项,相当于这些项是0。

  • 直接寻址(Direct Addressing Mode)。只使用ADDRESS_OR_OFFSET寻址,例如movl ADDRESS, %eax 把ADDRESS地址处的32位数传送到eax 寄存器。
  • 变址寻址(Indexed Addressing Mode) 。上一节的movl data_items(,%edi,4), %eax 就属于这种寻址方式,用于访问数组元素比较方便。
  • 间接寻址(Indirect Addressing Mode)。只使用BASE_OR_OFFSET寻址,例如movl (%eax), %ebx,把eax寄存器的值看作地址,把这个地址处的32位数传送到ebx寄存器。注意和movl %eax, %ebx区分开。
  • 基址寻址(Base Pointer Addressing Mode)。只使用ADDRESS_OR_OFFSET和BASE_OR_OFFSET寻址,例如movl 4(%eax), %ebx ,用于访问结构体成员比较方便,例如一个结构体的基地址保存在eax 寄存器中,其中一个成员在结构体内的偏移量是4字节,要把这个成员读上来就可以用这条指令。
  • 立即数寻址(Immediate Mode)。就是指令中有一个操作数是立即数,例如movl $12, %eax 中的$12 ,这其实跟寻址没什么关系,但也算作一种寻址方式。
  • 寄存器寻址(Register Addressing Mode)。就是指令中有一个操作数是寄存器,例如movl $12, %eax 中的%eax ,这跟内存寻址没什么关系,但也算作一种寻址方式。在汇编程序中寄存器用助记符来表示,在机器指令中则要用几个Bit表示寄存器的编号,这几个Bit也可以看作寄存器的地址,但是和内存地址不在一个地址空间。

ref:
http://docs.linuxtone.org/ebooks/C&CPP/c/ch18s04.html

数据传送指令

数据传送指令:

数据传送指令

常用的三条指令:

  • mov S,D
  • push S
  • pop D

算术和逻辑运算指令

算术和逻辑运算指令:

算术和逻辑运算指令

常用的三条指令:

  • inc D
  • add S,D
  • sub S,D

过程调用指令

过程调用指令:

过程调用指令

常用的三条指令:

  • call Lable
  • leave
  • ret

上面这三条指令每一条都相当于几条指令。

call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。

leave指令使栈做好返回的准备,等价于下面的代码序列:

mov %rbp,%rsp
pop %rbp

ret指令从栈中弹出地址,并跳转到这个位置。