Java教程

《深入理解计算机系统》——如何分析汇编指令

本文主要是介绍《深入理解计算机系统》——如何分析汇编指令,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

汇编指令的相关基础知识

文章目录

  • 汇编指令的相关基础知识
  • 前言
  • 一、寄存器种类及其功能
  • 二、常用汇编指令解析
    • 1.mov指令
    • 2.add指令
    • 3.sub指令
    • 4.push指令
    • 5.pop指令
    • 6.jmp指令
    • 7.call指令
    • 8.ret指令
    • 9.cmp指令
    • 10.jg指令
  • 三、寻址方式
    • 1.立即数寻址
    • 2.直接寻址
    • 3.间接寻址
    • 4.变址寻址
    • 5.BIS(有时也叫做BSI寻址)

前言

提示:本章的实验二是有关于汇编代码,需要大家能看懂汇编代码,所以这一期总结一些汇编指令、寻址方式等内容。


一、寄存器种类及其功能

在这里插入图片描述

传递参数:%rdi,%rsi,%rdx,%rcx,%r8,%r9
任何函数的返回值传递:%rax
栈指针:%rsp
调用者保存:%rax,%rdi,%rsi,%rdx,%rcx,%r8,%r9,%r10,%r11
被调用者保存:%rbx,%r12,%r13,%r14,%rbp,%rsp

二、常用汇编指令解析

1.mov指令

格式:mov A,B
功能:数据传送指令,有很多种表示形式。用于将数据从A传输到B

2.add指令

格式:add A,B
功能:加法操作。相当于B=B+A;

3.sub指令

格式:sub A,B
功能:减法操作。相当于B=B-A;

4.push指令

格式: push A
功能:压栈指令,本条指令共执行两个操作。先将栈顶指针寄存器%rsp的值减小8,然后再将xxx存入当前%rsp寄存器所指向的栈内存区域。

5.pop指令

格式: pop A
功能:出栈指令,本条指令共执行两个操作。先将%rsp寄存器所指向的内存单元中的数据出栈到xxx(这里的xxx应为寄存器),然后再将栈顶指针寄存器%rsp的值增加8。

6.jmp指令

格式:jmp A
功能:能为跳转到A值所指的位置处继续执行。跳转操作相当于修改%rip的值。此指令只是执行单纯的跳转,并不保存任何返回地址。

7.call指令

格式:call A
功能:功能为调用A值所指的位置处的函数代码。此指令是先将返回地址(即下一条指令的地址)压栈,再跳转到A值所指位置处执行。

8.ret指令

格式:ret
功能:功能为从当前的函数返回,相当于C语言中的return;。执行过程相当于先将返回地址出栈,再到该返回地址处继续执行。

9.cmp指令

格式:cmp A,B
功能:计算A-B,不保存计算结果,但根据计算结果改写条件码(也叫做标志位)。一般搭配条件指令进行使用。

10.jg指令

格式:jg X
功能:条件指令,一般搭配cmp进行使用。该指令的功能是,在cmp A,B中,若A>B,则跳转到X处执行;否则,跳过该指令运行下一条指令。

三、寻址方式

1.立即数寻址

例如:mov $0x3f,%eax
将0x0000003f这个数值装进%rax的低4个字节,%rax高4个字节被自动清0。是否为立即数寻址重点查看有无$符号。

2.直接寻址

例如:mov 0x6001f0,%rax
将0x6001f0单元为起始地址的内容传送至%rax中。

3.间接寻址

例如:mov (%rcx),%rax
将%rcx的值作为地址,去该地址处取数据,传送至%rax中。

4.变址寻址

例如:mov 0x3c(%rbp),%rax
将%rbp的值 + 0x3c作为地址,将该地址所存储的内容传送至%rax

5.BIS(有时也叫做BSI寻址)

例如:mov 0x4006c8(%rbx, %rcx, 8),%rax
将0x4006c8 + %rbx + %rcx*8 作为地址,将该地址所存储的内容传送至%rax。


这篇关于《深入理解计算机系统》——如何分析汇编指令的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!