《汇编语言》 读书笔记

《汇编语言》 读书笔记

汇编语言挺重要的,主要是讲清楚计算机运行程序时将程序转化为机器指令,因为机器指令才是真正驱动计算机执行的命令。

汇编语言

什么是汇编语言?这么说,计算机能读懂的其实只有二进制代码,也就是一连串的0和1,我们要让计算机进行各种各样的工作,其实就是编出一系列的0和1,过去式用打孔0和1的纸,然后计算机通过高低电平来处理。

但是,怎么说,我们写机器码实在是太繁琐了,稍微一个错误就要找很久,所以就有了汇编指令。汇编指令就是写出一些指令,这些指令通过汇编编译器解释成机器码,计算机就能读懂,也能执行。

存储器

cpu是计算机的核心部件,控制整个计算机的运作并进行运算,但是要让cpu执行什么,又要执行什么数据呢?需要向它提供指令和数据。指令和数据就放在内存中
这点在以后很重要。

而磁盘又是什么呢?磁盘不同于内存,磁盘里的数据要先读到内存中,然后再被cpu使用。

指令和数据在内存或者磁盘中没有任何区别,都是二进制信息。

存储器

在这里插入图片描述
存储器的一个单位是一个字节,这在后面很重要。

CPU对存储器的读写在这里插入图片描述

也因为此,需要cpu和存储器(内存)的通信就有下面三条总线:
地址线负责沟通cpu所需要取或存的数据
数据线来传送数据
控制线来控制要写还是读

在这里插入图片描述

内存地址空间

什么是内存地址空间?比如说,一个CPU的地址总线宽度为10,那么可以寻址1024个内存单元,这1024个可寻到的内存单元就构成这个CPU的内存地址空间。

在这里插入图片描述
在这里插入图片描述

内存地址空间

上述的存储器,在物理上都是独立的器件,但是在以下两点上相同。

  • 都与CPU的总线相连
  • CPU对他们进行读或写的时候都通过控制线发出内存读写命令

在这里插入图片描述
这一点很重要,也就是说,在CPU看来,所有物理存储器都被看做一个由若干存储单元组成的逻辑存储器。每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间。我们所说的内存地址空间就是这个逻辑存储器。

在这里插入图片描述

寄存器

cs ip 指令

ss sp 栈

cx 循环次数

ds [] ds 默认存放要访问内存的段地址

程序加载后,ds存放着程序所在内存区的段地址

ax ,dx 存放除数,乘数的数和结果

si,di 可存放任何数

cx与jcxz一起用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i0PoiBfG-1653289029935)(E:\Typora notebook\other\watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQ29kZVN0YXJz56CB5pif5Lq6,size_15,color_FFFFFF,t_70,g_se,x_16)]
寄存器是一种很贵的电子元器件,但是它在cpu里面可以存储数据,而且可以以极快的速度操作。所以寄存器在cpu中特别重要。

我们汇编学习的大部分知识都与寄存器有很大关系。首先,必须明确,寄存器是在cpu当中而且我们是通过改变各种寄存器中的内容来实现对CPU的控制。

寄存器都是16位的,也就是两个字节,一个字。
但是为了兼容,8086CP的AX,BX,CX.DX都可以当成独立的八位寄存器来用。

在这里插入图片描述

物理地址

这里的知识是接下来知识的基础

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
正因为地址线为20位,所以需要将两个16位地址总线合成20位的地址总线,所以才有了接下来的段位移,偏移位移,段寄存器,偏移寄存器的知识。

段的概念

这里也很重要。

在这里插入图片描述
在这里插入图片描述
为什么段长度最大为64KB.

因为偏移地址为4位,0000.每位其实可以表示一个十六进制数,也就是说每位为4比特(4比特可以表示1个16进制数),所以总共可以有16比特来存储地址信息。16比特的寻址能力为2的16次方为64kb

段寄存器在这里插入图片描述

每个寄存器都为16位,可以写成16个2进制数,或者4个16进制数。

CS IP

现在的计算机的基本工作流程(或者说cpu)就是取址执行。怎么理解呢?
这么理解吧:

就是说:指令和数据都在内存中。CPU指向一定的内存地址,然后去内存地址中取,然后拿到CPU中运算,运算出结果后到内存中。

所以这也是为什么内存那么重要的原因。也因此,硬盘中的数据要先到内存才能给cpu执行。

所以CS IP指向的就是CPU要执行的指令的所在处。

CS IP通过地址加法器,得到地址总线,然后通过地址总线往内存中读指令,通过数据总线将指令(数据)送到指令缓冲器中,然后在执行控制器中运行。

在这里插入图片描述
在这里插入图片描述
第二点很重要,IP=IO+所读取指令的长度,从而指向下一条指令。虽然不指定指令长度如何得知,但是CPU就是知道。

在这里插入图片描述
这个常识也很重要。在后面的计算机启动过程中会反复提到,启动时CS=FFFFH,IP=0000H.

在这里插入图片描述

代码段

在这里插入图片描述
这里在后面也反复用到,如何让CPU执行我们放在代码段中的指令,必须将CS设置为 代码段的段地址,将IP设置为代码段的起始地址

而后面也会提到,如果是在同个代码段中的话,要执行代码段中某段代码时,IP就可以设置为该代码在代码段中的偏移地址。

内存中字的存储

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TkJEmf71-1653289029936)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220219095042924.png)]

这个一直很模糊, 这样看吧,比如说4E20要存放在内存中。

首先,必须知道,4E是高二位,20是低二位。知道这点就好了。

是现有20,然后再进位再有4E。

然后高位放在内存高位,低位放在内存低位,于是20放在内存0处,4E放在内存1处。

访问内存空间

我们前面讲到,程序和数据都是存放在内存中,所以cpu最重要的功能就是访问内存中的数据。那么如何访问内存呢?

这就要讲到下面要提的DS寄存器。

CPU要访问内存单元,同样需要给出内存单元的地址,需要由段地址和偏移地址组成。8086CPU有一个DS寄存器,就是专门拿来存放要访问内存数据的段地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DMhfjHsv-1653289029936)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220219095429496.png)]

ds寄存器不支持直接传数据进去,所以得先将数据传到一个寄存器,再将寄存器传到ds寄存器,

mov al,【0】的意思是什么呢?

就是将ds存储的段位移加上偏移位移0 合成地址,然后将内存中该地址的数据送到al中,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D44ORuRG-1653289029936)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220219095722222.png)]

很简单,也就是【】说明了操作的是内存单元,段地址默认放在ds中,偏移地址就是【】中的数。

数据段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CQGGkO5f-1653289029937)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220219100012576.png)]

如果要将内存中的一段内存当成数据段,就用ds存放数据段的段地址。然后再用偏移表示数据段的某些具体位置。

前面讲了段地址默认放在寄存器ds中,这种将某些数据默认放在寄存器中的操作,在栈这里也体现了淋漓尽致。

8086CPU提供相关指令来以栈的方式访问内存空间。这意味着,在编程的时候,可以将一段内存当作栈来使用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z6CJo736-1653289029937)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220219100422470.png)]

那么最重要的问题是CPU如何知道10000H~1000FH这段空间被当作栈来使用?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dgqkvCgD-1653289029938)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220219100538007.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fgtOXu8E-1653289029938)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220219100559407.png)]

所以也很简单,就是SS:SP随时指向栈顶元素。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VBR80pOI-1653289029938)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220219100846578.png)]

很重要的一点是:入栈时,栈顶从高地址向低地址方向增长。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OopplLn6-1653289029938)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220219101018944.png)]

栈顶时刻指向下一个要存放数据的位置的前一个位置。

栈顶超界的问题

8086CPU解决不了栈顶超界的问题,就是说栈已经满了,你还继续插,它检测不出来,可能会对内存其它位置进行数据覆盖,很危险。栈底已经空了,它继续出栈,也检测不出来,可能对其它位置的数据清空,也很危险。所以需要我们直接使用的时候注意不能出现栈超界的错误。

PUSH POP

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WB3u3yNa-1653289029939)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220219101433315.png)]

push ,pop时就自动取栈顶元素进行操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ic2uhMyc-1653289029939)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220219101903565.png)]

初始时,栈顶指向要插入数据的‘’上‘’(或者说高)一个单元,要插入数据的地址应该为FFFE(因为插入一个字),所以它的上一个单元为FFFE+2就为0.(因为为4位)

所以插入时,先将SP-2,从0变为FFFE。

内存中段的综述

将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是我们自己的安排。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PF6M3nsL-1653289029939)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220219102354907.png)]

到现在,我们学了什么寄存器

CS,IP,DS,SS,SP

CS,IP指向cpu下一条要执行的指令

DS 【】指向访问内存的位置

SS,SP指向栈顶=

一个源程序写出到执行的过程

第一步:编写汇编源程序

这一步就是简单的编写,用文本编辑器(记事本等)写出来就可以。

第二步:对源程序进行编译连接

使用汇编语言编译程序对源程序中的源程序进行编译,产生目标文件;再用连接程序对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TmovxhOB-1653289029940)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225114040858.png)]

第三步:执行可执行文件中的程序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Teokg5jz-1653289029940)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225114116450.png)]

源程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D64qau03-1653289029940)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225114156883.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c2aEUvXh-1653289029940)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225114303458.png)]

定义一个段,并为其起一个段名xxx,segment到ends里面就存放着这个段的代码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CpIqfmmk-1653289029941)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225114420517.png)]

assume cs:codesg 因为我们下面定义了codeseg这个段

然后现在assume这条指令的意思就是==将段寄存器和某一个具体的段相联系。==所以上面那句话的意思就是将cs寄存器和codeseg段联系起来,就可以通过cs找到codeseg段,(一个段本质上就是内存中的一个段地址)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WexbJgCg-1653289029941)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225114823176.png)]

源程序转化为汇编程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U3P6Kgq7-1653289029941)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225114914242.png)]

编译连接就是将汇编源程序编译程计算机可以读懂的机器码

谁将可执行文件中的程序装载进入内存并使它运行?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LlOmNJIR-1653289029941)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225121300420.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V6VyvyTg-1653289029942)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225121310019.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EIxsCgeI-1653289029942)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225121335007.png)]

程序执行过程中的追踪

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0PUQzati-1653289029942)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225121917247.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0E0K20jM-1653289029942)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225121932981.png)]

上图很重要!!!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KPON7app-1653289029943)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225122852331.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K4k4y8OM-1653289029943)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225123133787.png)]

其实也不复杂,总结起来就一句话:

程序的代码所在内存区的段地址放在DS寄存器中

从ds中取出程序的段地址SA

而真正的程序代码所在的段地址就是(SA+10H)

所以CS:IP 指向的使(SA+10H):0

原因就是程序代码所在位置的前256字节用来存放程序短前缀PSP

256字节。

标号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eGPLPhuZ-1653289029943)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225115114794.png)]

这个标号很重要!!! 就是刚刚说的,汇编源程序中的一些标号,代表的都是一个地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0cCEZCYY-1653289029944)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225115231545.png)]

[BX]和loop指令

【bx】是什么呢?

其实就类似于【0】。【0】表示内存单元,它的偏移地址为0,而段地址默认放在段寄存器ds中。

而【bx】同样也表示一个内存单元,它的偏移地址在bx中,如下面的指令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MTVWvLkW-1653289029944)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225101700645.png)]

loop指令与循环有关。

()的含义

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y8rJOfsm-1653289029944)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225101754330.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8gLN02sP-1653289029944)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225101854650.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ppkKsdtc-1653289029945)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225102018031.png)]

[BX]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3o77NGBC-1653289029945)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225102205000.png)]

loop指令

loop就是循环的指令,循环次数与寄存器cx有关!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XsX0Uqze-1653289029945)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225102801593.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f198HF5G-1653289029945)(D:\桌面文件\屏幕截图 2022-02-25 102912.png)]

在s和loop s 中间的语句就是循环的语句,而cx寄存器代表的就是循环的次数。

原理是这样:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fbOfsDjz-1653289029946)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225103124988.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CglwSjJs-1653289029946)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225103747785.png)]

r命令查看寄存器内容

u命令查看被Debug加载如内存的程序

p命令自动重复执行loop中的内容

Debug和汇编译器masm对指令的不同处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g5pJAxN2-1653289029946)(D:\桌面文件\屏幕截图 2022-02-25 105146.png)]

也就是在debug中,【0】可以表示为段地址在ds中

而偏移地址为0的内存地址

而在汇编源程序中,【0】被表示为数据0.

那么有什么方法让汇编源程序的【】也表示为偏移地址呢?

可以的,但是要在其前面加上一个显式的段寄存器。

比如说mov al,ds:【bx】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QUnF1cmk-1653289029947)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225105500260.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6mM8pVur-1653289029947)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225110242505.png)]

也就是说【bx】如果【】里面是寄存器的内容的话就无所谓

如果【idata】是数据的话,那么要让其表示偏移位移,就要显式地在其前面写出段位移。

loop和【bx】的联合应用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0AylftbN-1653289029947)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225110513876.png)]

段前缀

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZXbT2me3-1653289029947)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225110623933.png)]

更深刻地理解汇编

我们可以利用汇编指令往内存空间中写入数据。但是在不能确定一段内存空间是否存放重要的数据或代码时,不能随意向其中写入内容。

注意,虽然时使用汇编,但是我们还是在操作系统地环境中工作,操作系统管理所有的资源,也包括内存。如果需要我们向内存空间写入数据的话,要使用操作系统给我们分配的空间,而不应该用地址任意指定内存单元。

不过要理解深层的本质,使用汇编,就是在操作系统之下的底层,直接操作硬件,直接操作cpu,操作内存的操作。

不过,其实系统为我们分配了一段相对安全的地址,就是

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MB9z196g-1653289029948)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225111329392.png)]

段前缀的使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UwikfHZe-1653289029948)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225111723718.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wG51abis-1653289029948)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220225111731480.png)]

第六章 包含多个段的程序

转移指令的运用

根据偏移量转移 jmp short /jmp near ptr s(s为标号)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CkcjTRHf-1653289029949)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227100827960.png)]

应用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Qkgmncr-1653289029949)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227101146672.png)]

注意哦,按它上面这么讲,实现转移的标号是要在代码段中的

也就是说要先在代码段中有标号,然后才能实现转移指令的转移

原理呢?其实就是计算出要转移的标号和jum 指令的位移,然后将IP添加偏移就对了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0vYzXQpR-1653289029949)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227104617901.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hOhQ4cV4-1653289029949)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227104627244.png)]

jmp short 和jmp near ptr 的不同就是 偏移为8位还是16位

根据目的地址转移 jmp far ptr s(s为标号)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F09OMN7j-1653289029950)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227105058914.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YXI7bUfD-1653289029950)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227105106313.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r8p3nrPV-1653289029950)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227105250188.png)]

jmp word ptr 内存单元地址(段内转移)

功能:将IP改为内存存放中的第一个字

jmp dword ptr 内存单元地址(段间转移)

从内存单元地址开始存放着两个字。高地址处的字转移的目的地址的段地址,设置为CS,低地址处事转移的目的偏移地址,设置为IP。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HFcSaqx7-1653289029950)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227105744241.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LdFwCdq7-1653289029951)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227105805922.png)]

jcxz指令 有条件的转移指令

功能:设置一个cx值,当cx==0时就执行转移指令,如果cx不为0就不执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M8CIzE6w-1653289029951)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227110315583.png)]

loop指令 也是有条件的转移指令

和jcxz指令有点类似,不过loop会自动将cx减1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q5U8vPva-1653289029951)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227110523002.png)]

不过jcxz是cx==0执行,而loop是cx!=0才执行。

转移指令的总结

基础转移: jmp short s,jmp near ptr ,jmp far ptr s

内存转移:jmp word ptr 内存单元

jmp dword ptr 内存单元地址

CALL 和RET指令

RET和RETF指令

RET指令简单的说就是 拿栈内的数据来设置IP。

而RETF的指令就是拿栈内的数据来设置CS和IP。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Scz93AF-1653289029951)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227114952151.png)]

CALL指令

CALL指令说白了就是和RET相反。

RET是拿栈内的数据来设置CS,IP

CALL指令是将当前CS,IP的值推入栈,然后再实现跳转命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yxkOOhBI-1653289029952)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227115202930.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RgkjMjrf-1653289029952)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227115227064.png)]

CALL和RET的配合使用

怎么辨析这两个的区别咧,其实很简单,就是看后面有没有跳转的标号,有的话就是call,就是先将cs,ip的值进栈,然后再转移。没用的就是ret,就是单纯将栈内的值拿出来当cs,ip,也不需要跳转。

div和mov 乘除指令

mul指令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4AwNC2zc-1653289029952)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227154145939.png)]

乘法:

相乘的数,如果都是八位,一个放在AL中,另一个放在reg或内存单元中。

如果都是十六位,那么一个默认放在AX中,另一个放在16位reg或内存单元中。

相乘时直接 mul reg 或者mul 内存单元。

结果:八位乘法,结果默认放在AX中,16位乘法,高位默认在DX中,低位在AX中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JUsrlXOl-1653289029953)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227154417803.png)]

除法:

被除数:默认放在AX 或者AX和DX

除数有8位和16位,存放在一个reg或者内存单元中。

如果除数为8位,被除数则为16位,默认在AX中存放。

如果除数为16位,被除数则为32位,DX存放高16位,AX存放低16位。

结果:AL存储商,AH存储余数,

如果除数位16位,AX存储商DX存储余数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nCZbc4wI-1653289029953)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227154825296.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kQ5V9CZW-1653289029953)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227160132138.png)]

显示字符串

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Okh7C5HM-1653289029953)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227161919427.png)]

标志寄存器

ZF表示结果是否为0

ZF表示相应操作后,结果是否为0

结果为0,则ZF为1

结果为1,则ZF为0

PF 表示结果bit位是否为偶数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hojlC93y-1653289029954)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227165833524.png)]

SF 表示结果是否为负

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6tDLaBZ9-1653289029954)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227170053990.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hrA5M6Zb-1653289029954)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227170144534.png)]

CF表示结果是否需要借位

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZzMQ6YfL-1653289029954)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227170941829.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wcgHVxfg-1653289029955)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220227170923401.png)]

OF表示结果是否超出范围

检测比较结果的条件转移指令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GnVvwx9K-1653289029955)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220228165623457.png)]

我懂什么意思了。

cmp 会根据两个寄存器里的值的大小关系来设置cpu的标志寄存器

而je等指令就根据cpu的标志寄存器来判断执行什么命令

所以必须现有cmp再有je

必须cmp先设置标志,je才能起作用。

DF标志和串传送指令

rep movsb

rep是字符串操作指令MOVS,CMPS等的前缀,在CX不等于0的情况下,对字符串执行重复操作.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bhyhhFMT-1653289029955)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220228171039424.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tYhTr4WP-1653289029956)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220228171146508.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nAhMQcDL-1653289029956)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220228171959520.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qUuA9kWg-1653289029956)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220228172301903.png)]

pushf 和popf

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iZ7SsSka-1653289029956)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220228172406343.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SAcYZMNn-1653289029957)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220228172443530.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CL8heBu9-1653289029957)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220301162732256.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lyyWRrJI-1653289029957)(C:\Users\spaceman\AppData\Roaming\Typora\typora-user-images\image-20220301190411450.png)]

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嗨!对于逆向学习汇编语言的学习笔记,我可以给你一些基本的指导。首先,汇编语言是一种低级语言,它与计算机的底层硬件密切相关。逆向工程则是通过分析和理解已编译的程序来获取程序的内部信息。 以下是一些学习汇编语言和逆向工程的建议: 1. 学习基础知识:了解计算机体系结构、寄存器、内存和指令集等基础概念是必要的。可以先阅读相关的书籍或在线教程,掌握这些基本概念。 2. 掌握汇编语言的语法和指令集:每种计算机体系结构都有自己的汇编语言语法和指令集。选择一种你感兴趣的体系结构(如x86、ARM等),并学习它的汇编语言。 3. 练习编写和调试汇编代码:通过编写简单的汇编代码来熟悉语法和指令集。使用调试器来单步执行代码并观察寄存器和内存的变化。 4. 分析已编译程序:选择一个目标程序进行逆向分析。使用反汇编器将程序转换为汇编代码,并分析代码的逻辑和功能。这有助于理解程序的结构和运行过程。 5. 使用调试器进行动态分析:通过调试器来动态地执行程序,并观察程序在运行时的行为。使用断点、内存查看器和寄存器查看器等工具来分析程序的状态和数据。 6. 学习逆向工程工具和技术:了解常用的逆向工程工具和技术,如IDA Pro、OllyDbg、Ghidra等。掌握这些工具的使用可以提高你的逆向分析能力。 7. 参考优秀资源:阅读与逆向工程和汇编语言相关的书籍、论文和博客,关注相关的社区和论坛。与其他逆向工程师交流经验也是很有帮助的。 记住,逆向工程是一个需要耐心和实践的过程。持续学习和实践将帮助你提高逆向分析的技能。祝你在学习汇编语言和逆向工程的过程中取得好成果!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值