部分汇编总结

学习汇编

源程序编译成程序

汇编源程序:分为伪指令(编译器处理)和汇编指令(编译为机器码)
程序:源程序中最终由计算机执行、处理的指令或数据
程序最先以汇编语言的形式存在于源程序中,经编译、连接后转变为机器码,存储可执行文件中
部分汇编总结_第1张图片
数据格式
部分汇编总结_第2张图片
大多数GCC生成的汇编代码指令都有一个字符的后缀,表明操作数的大小。

数据传送指令有四个变种:
movb:传送字节
movw:传送字
movl:传送双字
movq:传送四字

操作数指示符:
部分汇编总结_第3张图片
基本语法

内存寻址在指令中可以表示成如下的通用格式:

ADDRESS_OR_OFFSET(%BASE_OR_OFFSET,%INDEX,MULTIPLIER)

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

目标地址 = ADDRESS_OR_OFFSET + BASE_OR_OFFSET + MULTIPLIER * INDEX

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

1.直接寻址

根据以上公式,只使用ADDRESS_OR_OFFSET寻址,例如movl ADDRESS,
%eax把ADDRESS地址处的32位数传送到eax寄存器。

2.变址寻址

movl data_items(,%edi,4), %eax就属于这种方式,用于访问数组很方便。

3.间接寻址

只使用BASE_OR_OFFSET寻址,例如movl (%eax),
%ebx,把eax寄存器的值看作地址,把这个地址处的32位数传送到ebx寄存器。

4.基址寻址

只使用ADDRESS_OR_OFFSET和BASE_OR_OFFSET寻址,例如movl 4(%eax),
%ebx,用于访问结构体成员比较方便,例如一个结构体的基地址保存在eax寄存器中,其中一个成员在结构体内偏移量是4字节,要把这个成员读上来就可以用这条指令。

5.立即数寻址

就是指令中有一个操作数是立即数,例:movl $3, %eax。

6.寄存器寻址

就是指令中有一个操作数是寄存器。在汇编程序中寄存器用助记符来表示,在机器指令中则要用几个Bit表示寄存器的编号,这几个Bit与可以看做寄存器的地址,但是和内存地址不在一个地址空间。

部分汇编总结_第4张图片
压栈和出栈:部分汇编总结_第5张图片

压栈:
subq $8,%rsp
movq %rbp,(%rsp)

出栈:
movq (%rsp),%rax
addq $8,%rsp
算术和逻辑操作:
部分汇编总结_第6张图片

部分汇编总结_第7张图片

你可能感兴趣的:(计算机系统基础)