《汇编语言》 读书笔记
汇编语言挺重要的,主要是讲清楚计算机运行程序时将程序转化为机器指令,因为机器指令才是真正驱动计算机执行的命令。
汇编语言
什么是汇编语言?这么说,计算机能读懂的其实只有二进制代码,也就是一连串的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)]