汇编基础(二)

1、ret指令

ret指令用栈中的数据,修改IP的内容,从而实现近转移!

CPU执行ret指令时,进行2步操作:i>、(IP) = ((ss)*16 + (sp))、ii>、(sp) = (sp)+2

CPU执行ret指令,相当于:pop IP;

CPU执行retf指令,相当于pop IP pop CS;

2、call 标号

CPU执行call指令时,进行如下的2步操作:

(1)、(sp) = (sp)-2 ((ss)*16+(sp)) = (IP):

(2)、(IP) = (IP) + 16位位移;

3、mul指令

mul是乘法指令,相乘的2个数,要么都是8位的,要么都是16位的;

一般都是对AX寄存器来进行操作;

4、标志寄存器

flag(就是标志寄存器)是将要学到的最后一个寄存器;

8086CPU的标志寄存器都是16位的,其中存储的信息通常被称为程序状态字(PSW);

8086CPU的指令集中,add、sub、mul、div、inc、or、and等都是运算指令,影响标志寄存器;

mov、push、pop等,大都是传送指令,对标志寄存器没有影响;

flag是按位起作用的,它的每一个位都有专门的含义,记录特定的信息;

其结构模型图:

flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何意义,而0、2、4、6、7、8、9、10、11位都具有特殊的含义.

(1)、ZF:零标志位,它记录相关指令执行后,结果为0,ZF=1,结果不为0,ZF=0;

例:

mov ax, 1
sub ax, 1

指令执行后,结果为0,则ZF=1;

(2)、PF:奇偶标志位,记录指令执行后,结果的所有二进制位中1的个数;为偶数个,PF=1;为奇数个,PF=0;

(3)、SF:符号标志位,记录指令执行后,结果为负,SF=1,结果为正,SF=0;

(4)、CF:进位标志位,向最高位的进位,就放到这个寄存器中;

(5)、OF:溢出标志位,对有符号运算数而言,溢出位就保留在这里;

CF和OF的区别:

CF是对无符号数运算有意义的标志位,OF是对有符号运算而言的标志位;

(6)、DF:方向标志位;

pushf:将标志寄存器的值压栈;

popf:从栈中弹出数据,送入标志寄存器中;

5、中断

中断是CPU处理外部突发事件的一个重要技术;

中断向量表:CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址;

从内存0000:0000到0000:03FF的1024个单元中存放着中断向量表;

单步中断:CPU在执行一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程,单步中断的中断类型码为1;

6、int

int:内中断,int n,n是中断类型码,n就是引发中断过程,中断向量表里面放的是地址;通过n这个序号索引到这个地址,执行中断规定的格式---->中断过程;

BIOS和DOS提供的中断,都用ah来传递内部子程序的编号;

DOS编程中,默认以"$"结尾("$"本身并不显示,只起到边界作用);

7、端口

CPU可以直接读写3个地方的数据:i>、CPU内部的寄存器;ii>、内存单元;iii>、端口;

  通过端口,计算机才可以直接访问硬件;通过端口,计算机才可以和网络互相的传输数据;

端口的读写指令只有2个:in和out分别用于从端口读取数据和往端口写入数据;

shl:逻辑左移指令,将最后一位写入CF中,最低位用0补充;

shr:逻辑右移指令,将最后一位写入CF中,最高位用0补充;

8、外中断

外中短信息:可屏蔽中断和不可屏蔽中断;跟标志寄存器IF密切相关;

端口和中断机制,是CPU进行I/O的基础;

9、指令系统总结

(1)、数据传送指令:mov、push、pop、pushf、popf....实现的是寄存器与内存/寄存器之间的单个数据传送;

(2)、算术运算指令:add、sub、adc、sbb、inc、dec、cmp....实现寄存器和内存数据的算数运算;

他们的执行结果影响标志寄存器:sf、zf、sf、pf、af....

(3)、逻辑指令:and、or、not、shl、shr...

计算结果(除not)都影响标志寄存器;

(4)、转移指令:可以修改IP,CS;

i>、无条件转移指令:jmp

ii>、条件转移指令:jcxz、je、jb、ja....

iii>、循环指令:loop;

iv>、过程:call、ret、retf;

v>、中断:int、iret

(5)、处理机控制指令........

(6)、串处理指令:movsb、cmps....

10、直接定址表

思路:建立一张表,在表中存入要查找的数据即可;为了加快运算速度而采用查表的方法;

  根据存储的地址不同,方便实现不同子程序的调用;

时间: 2024-10-12 17:14:11

汇编基础(二)的相关文章

加壳学习笔记(二)-汇编基础

7.简单的汇编语法:   堆栈平衡  PUSH,POP功能: 把操作数压入或取出堆栈语法: PUSH 操作数 POP 操作数格式: PUSH r PUSH M PUSH data POP r POP mPUSHF,POPF,PUSHA,POPA功能: 堆栈指令群格式: PUSHF POPF PUSHA POPAADD,ADC功能: 加法指令语法: ADD OP1,OP2 ADC OP1,OP2格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data影响标志: C,P,A,

[A8 学习笔记] A8 汇编基础

A8 处理器工作模式 这点和以往的 arm7 arm11 是一致的.有8个工作模式: 用户模式是通常的ARM程序的执行状态,并用于执行大多数应用程序 快速中断(FIQ)模式是用于处理快速中断 中断(IRQ)模式是用于通用的中断处理 管理模式是一个操作系统保护模式 中断模式是当数据出错或者预取指令出错时进入的模式 系统模式是操作系统的一个特权用户模式 未定义的模式进入一个未定义指令异常发生时 监控方式为安全扩展安全模式安全监控代码. 除了用户模式模式统称为特权模式.特权模式用于服务中断或异常,或访

Html5开发——html+css基础二(个人博客一)

今天没有写完,而且写的还有点问题,所以今天就先不上传代码了(ps:快写完了才发现布局有问题,导致代码太多,感觉写的不是很好,所以今天先分析一下布局) 第一步先写一个大的div用来放ABC三个部分,这个大的div居中! 第二步分别写ABC三个部分,ABC三个部分分别使用浮动(float)来定位.A和B都各使用了一张非常小的图片,通过重复(repeat)属性生成A和B 第三步C部分分别写好3~16这几个模块,在通过组合利用浮动定位.分组如下: E:3 F:4.7.10.13 G:5.8.11.14

Scala 中的函数式编程基础(二)

主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. 2. Higher Order Functions 把其他函数作为参数或者作为返回值,就是 higher order functions,python 里面也可以看到这样使用的情形.在酷壳上的博客有一个例子就是将函数作为返回值. 2.1 匿名函数 在 python 里边叫 lambda 函数,常常与 map(

Python全栈开发【基础二】

Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 编码与进制转换 Python 运算符 1.算术运算: 2.比较运算: 3.赋值运算: 4.逻辑运算:  5.成员运算: 基本数据类型 1.数字 int(整型) 1 class int(object): 2 """ 3 int(x=0) -> integer 4 int(x, base=10) -&g

R语言基础(二) 可视化基础

> which.max(apply(x[c("x1","x2","x3")], 1, sum))49 > x$num[which.max(apply(x[c("x1","x2","x3")], 1, sum))][1] 2005138149 > hist(x$x1) > plot(x$x1,x$x2) > table(x$x1) 80 81 82 83 84

汇编基础:二进制和十六进制

理解二进制和十六进制的最佳方法是先透彻的领悟十进制计数系统.十进制(Decimal)系统是基于10的计数系统(词根Deci-表示10)."基于10"指的是由10个数位(Digit)0到9来表示数. 使用"位置(Place Value)",可以用不多的几个数位(如10个十进制数位)来表示很大的数.所有计数系统的位置从最右边开始,是基数的0次幂.从右往左,基数的幂依次增加1: X4X3X2X1X0 基数是10时,前5个位值是: 104103102101100 对任何基数

Bootstrap &lt;基础二十五&gt;警告(Alerts)

警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个可选的关闭按钮.为了创建一个内联的可取消的警告框,请使用 警告(Alerts) jQuery 插件. 您可以通过创建一个 <div>,并向其添加一个 .alert class 和四个上下文 class(即 .alert-success..alert-info..alert-warning..ale

图像处理之基础---二维卷积运算原理剖析

卷积运算(Convolution)是通过两个函数f 和g 生成第三个函数的一种数学算子,表示函数f 与经过翻转和平移与g 的重叠部分的累积.如果将参加卷积的一个函数看作区间的指示函数,卷积还可以被看作是“滑动平均”的推广.假设: f(x),g(x)是R1上的两个可积函数,并且积分是存在的.这样,随着 x 的不同取值,这个积分就定义了一个新函数h(x),称为函数f 与g 的卷积,记为h(x)=(f*g)(x). 两个向量卷积,说白了就是多项式乘法.下面用个矩阵例子说明其工作原理: a和d的卷积就是