提示:本章的实验二是有关于汇编代码,需要大家能看懂汇编代码,所以这一期总结一些汇编指令、寻址方式等内容。
传递参数:%rdi,%rsi,%rdx,%rcx,%r8,%r9
任何函数的返回值传递:%rax
栈指针:%rsp
调用者保存:%rax,%rdi,%rsi,%rdx,%rcx,%r8,%r9,%r10,%r11
被调用者保存:%rbx,%r12,%r13,%r14,%rbp,%rsp
格式:mov A,B
功能:数据传送指令,有很多种表示形式。用于将数据从A传输到B
格式:add A,B
功能:加法操作。相当于B=B+A;
格式:sub A,B
功能:减法操作。相当于B=B-A;
格式: push A
功能:压栈指令,本条指令共执行两个操作。先将栈顶指针寄存器%rsp的值减小8,然后再将xxx存入当前%rsp寄存器所指向的栈内存区域。
格式: pop A
功能:出栈指令,本条指令共执行两个操作。先将%rsp寄存器所指向的内存单元中的数据出栈到xxx(这里的xxx应为寄存器),然后再将栈顶指针寄存器%rsp的值增加8。
格式:jmp A
功能:能为跳转到A值所指的位置处继续执行。跳转操作相当于修改%rip的值。此指令只是执行单纯的跳转,并不保存任何返回地址。
格式:call A
功能:功能为调用A值所指的位置处的函数代码。此指令是先将返回地址(即下一条指令的地址)压栈,再跳转到A值所指位置处执行。
格式:ret
功能:功能为从当前的函数返回,相当于C语言中的return;。执行过程相当于先将返回地址出栈,再到该返回地址处继续执行。
格式:cmp A,B
功能:计算A-B,不保存计算结果,但根据计算结果改写条件码(也叫做标志位)。一般搭配条件指令进行使用。
格式:jg X
功能:条件指令,一般搭配cmp进行使用。该指令的功能是,在cmp A,B中,若A>B,则跳转到X处执行;否则,跳过该指令运行下一条指令。
例如:mov $0x3f,%eax
将0x0000003f这个数值装进%rax的低4个字节,%rax高4个字节被自动清0。是否为立即数寻址重点查看有无$符号。
例如:mov 0x6001f0,%rax
将0x6001f0单元为起始地址的内容传送至%rax中。
例如:mov (%rcx),%rax
将%rcx的值作为地址,去该地址处取数据,传送至%rax中。
例如:mov 0x3c(%rbp),%rax
将%rbp的值 + 0x3c作为地址,将该地址所存储的内容传送至%rax
例如:mov 0x4006c8(%rbx, %rcx, 8),%rax
将0x4006c8 + %rbx + %rcx*8 作为地址,将该地址所存储的内容传送至%rax。