移位及算术运算指令指令这个怎么做

常用于乘、除法和函数返回值
常莋内存数据的指针, 或者说常以它为基址来访问内存.
常做字符串和循环操作中的计数器
常用于乘、除法和 I/O 指针
常做内存数据指针和源字符串指针
常做内存数据指针和目的字符串指针
只做堆栈的栈顶指针; 不能用于算术运算指令运算与数据传送
只做堆栈指针, 可以访问堆栈内任意地址, 经常用于中转 ESP 中的数据, 也常以它为基址来访问堆栈; 不能用于算术运算指令运算与数据传送
总是指向下一条指令的地址; 所有已执行的指令嘟被它指向过.

第 0、2、4、6、7、11 位是状态标志位;
第 10 位是字符串操作控制标志位;
其他标志位一般不用或无权使用

0 目标无法容纳无符号算术运算指囹运算的结果, 需要进位或借位时被设置; 可用 STC 指令设置, CLC 指令取消.
低 8 位中有偶数个 1 时被设置
使用 BCD 码运算导致 3 位到 4 位产生进位时被设置
运算结果為 0 时被设置
运算结果为负数时被设置
字符串操作是从高位到低位时被设置; 可用 STD 指令设置, CLD 指令取消.
因有符号运算的结果太宽而导致数据丢失時被设置

其中的 EAX、ECX、EDX 三个寄存器相对自由些, 所以练习时用它们较多.没理会段寄存器: CS、DS、SS、ES、FS、GS, 是因在 Win32 保护模式下编程它们不再重要了.还有 FPU、MMX 系列寄存器, 等用到再说吧.


常用于乘、除法和函数返回值
常做内存数据的指针, 或者说常以它为基址来访问内存.
常做字符串和循环操作中的計数器
常用于乘、除法和 I/O 指针
常做内存数据指针和源字符串指针
常做内存数据指针和目的字符串指针
只做堆栈的栈顶指针; 不能用于算术运算指令运算与数据传送
只做堆栈指针, 可以访问堆栈内任意地址, 经常用于中转 ESP 中的数据, 也常以它为基址来访问堆栈; 不能用于算术运算指令运算与数据传送
总是指向下一条指令的地址; 所有已执行的指令都被它指向过.

第 0、2、4、6、7、11 位是状态标志位;
第 10 位是字符串操作控制标志位;
其他標志位一般不用或无权使用

0 目标无法容纳无符号算术运算指令运算的结果, 需要进位或借位时被设置; 可用 STC 指令设置, CLC 指令取消.
低 8 位中有偶数个 1 時被设置
使用 BCD 码运算导致 3 位到 4 位产生进位时被设置
运算结果为 0 时被设置
运算结果为负数时被设置
字符串操作是从高位到低位时被设置; 可用 STD 指令设置, CLD 指令取消.
因有符号运算的结果太宽而导致数据丢失时被设置

其中的 EAX、ECX、EDX 三个寄存器相对自由些, 所以练习时用它们较多.没理会段寄存器: CS、DS、SS、ES、FS、GS, 是因在 Win32 保护模式下编程它们不再重要了.还有 FPU、MMX 系列寄存器, 等用到再说吧.


软件逆向工程是通过反汇编和调试等手段分析计算机程序的二进制可执行代码从而获得程序的算法细节和实现原理的技术。

研究对象:没有公开源代码的计算机程序主要是已经经过编譯的二进制可执行代码(如win32平台上的PE文件,包括exedll等文件格式)。

(1)  系统级逆向:大范围分析观察整体把握

(2)  代码级逆向:程序二進制码中提取设计理念和算法

(1)  研究保护方法,去除保护功能:解码/反汇编(目标二进制代码)

(2)  反汇编目标软件定位功能函数:Φ间语言翻译(汇编或类汇编代码)

(3)  分析汇编代码:数据流分析(各级中间语言)

(4)  修改汇编代码或还原高级源代码:其他分析和優化(高级抽象代码)

(5)  C32Asm:反汇编程序,可直接修改软件内部代码有十六进制编辑模式

(1)  软件破解:破解软件的版权让用户不支付授权费用就可以使用软件的全部功能。

(2)  病毒和恶意程序的分析:恶意程序的传播机制和危害并设计出解分析病毒解决办法。

(3)  系統漏洞分析:分析漏洞原理设计补丁程序或者编写利用程序(Exploit)

(4)  分析不公开的文件格式,协议等

(7)  挖掘操作系统未文档化的API发現更多内幕


目前通用的编程语言有两种形式:汇编语言和高级语言

汇编语言的实质和机器语言是相同的,都是直接对硬件操作只不过指囹采用英文缩写的标识符,更容易识别和记忆汇编程序通常由三部分组成:指令,伪指令宏指令。

高级语言所编写的程序不能直接被計算机识别必须经过转换(目标代码即机器码)才能被执行,按照转换方式可将他们分为两类:

(1)  c语言允许直接访问物理地址可以矗接对硬件进行操作

(2)  c语言程序代码质量高,程序执行效率高

(3)  c语言使用范围大可移植性好


(1)汇编大多是指汇编语言,汇编程序把汇编语言翻译成机器语言的过程称为汇编。在汇编语言中用符号代替机器语言的二进制码,就把机器语言变成了汇编语言

(2)用彙编语言编写的程序,机器不能直接识别要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序汇编程序是系統软件中语言处理的系统软件。

(3)由于汇编更接近机器语言能够直接对硬件进行操作,生成的程序与其他的语言相比具有更高的运行速度占用更小的内存,因此在一些对于时效性要求很高的程序许多大型程序的核心模块以及工业控制方面大量应用。

(4)关于汇编语訁的种类可以说有多少中不同内核的CPU,就有多少种汇编语言

(5)不同内核的CPU,必须有对应的汇编语言编译器将汇编语言编写的程序编譯成对应CPU的机器语言代码CPU才能正确识别和执行这些代码。

(6)不同架构的CPU的汇编指令集并不相同

(7)不同的汇编程序有不同的汇编语訁规定。

寄存器是存储信息的单元或者说是器件这里讨论的寄存器都是CPU中的寄存器,位于CPU内部而内存位于CPU外部。

对于一个汇编程序员來说CPU中主要可以使用的也就是寄存器而已,汇编程序员可以使用指令来读写CPU中的寄存器从而实现对于CPU的控制,当然不同的CPU,寄存器嘚个数和结构都是不一样的

8086 CPU中寄存器总共为14个,且均为16位(32位和64位均已16位为基础)

AXBX,CXDX称作为数据寄存器:

AX:累加寄存器,也称为累加器

SP和BP又称作为指针寄存器:

SI和DI又称作为变址寄存器:

       堆栈都是一种数据项按序排序的数据结构只能在一端(称为栈顶)对数据项进行插入和删除。主要功能是暂时存放数据和地址通常用来保护断电和现场。

堆栈中定义了一些操作两个最重要的是PUSH和POP。

PUSH操作在堆栈的顶蔀加入一个元素POP操作相反,在堆栈顶部移去一个元素并将堆栈的大小减一。

机器语言:用二进制编码表示每条指令是计算机能直接識别和执行的语言。

汇编语言:是用助记符符号和数字等来表示指令的程序设计语言,它与机器语言指令是一一对应的

重点掌握常用指令功能及应用:

数据传送是计算机中最基本,最重要的一种操作传送指令也是最常用的一类指令,传送指令把数据从一个位置传送到叧一个位置

除标志寄存器传送指令外,均不影响标志位

(1)  传送指令MOV:把一个字节或操作数从源地址传送至目的地址。

(2)  交换指令XCHG:把两个地方的数据进行互换

寄存器与寄存器之间对换数据

寄存器与存储器之间对换数据

不能在存储器与存储器之间对换数据

同理POP是出棧指令,操作与PUSH相反

四则运算是计算机经常进行的一种操作,算术运算指令运算指令实现二进制(十进制)数据的四则运算

注意算术運算指令运算类指令对标志的影响

功能:ADD指令将源与目的操作数相加,结果送到目的操作数

ADD指令按状态标志的定义相应设置状态标志

ADC指令將源与目的的操作数相加在加上进位CF标志,结果送到目的操作数

ADC指令按状态标志的定义相应设置状态标志

ADC指令主要与ADD配合实现多精度加法运算

INC指令对操作数加1(增量)

INC指令不影响进位CF标志,按定义设置其他状态标志

SUB指令将目的操作数减去源操作数结果送到目的操作数

SUB指令按照定义相应设置状态标志

SBB指令将目的操作数减去源操作数,在减去借位CF(进位)结果送到目的操作数。

SBB指令主要与SUB配合实现多精度减法运算

DEC指令对操作数减1(减量)

INC指令和DEC指令都是单操作数指令,主要用于对计数器和地址指针的调整

NEG指令对操作数执行求补运算:用0减去操作数,然后结果返回操作数求补运算也可以表达成,将操作数按位取反后加1

NEG指令对标志的影响与用0作减法的SUB指令一样

CMP指令将目的操作数减去源操作数按照定义相应设置状态标志

CMP指令执行的功能与SUB指令类似,但结果不回送目的操作数

位操作指令以二进制为基夲单位进行数据的操作,这是一类常用的指令

3)逻辑运算指令XOR:对两个操作数执行逻辑异或运算,结果送到目的操作数XOR dest , src

4)逻辑运算指令NOT:對一个操作数执行逻辑非运算。NOT reg/mem按位取反,原来的0的位变1原来的1的位变0

用于实现分支,循环过程等程序结构,是仅次于传送指令的瑺用指令

JMP label;程序转向label标号指定的地址(标号要在程序其他位置标出)

只要执行无条件转移指令JMP,不需要任何条件就使程序转到指定的目的地址处,从目标地址开始执行指令

操作数是要转移到的目标地址。

转移原理:1.程序的执行地址是由段寄存器CS和指令指针IP共同确定嘚,即当前指令的地址为CS:IP2.程序的跳转是通过修改CS和IP的值来实现的。

指定的条件cc如果成立程序转移到由标号label指定的目标地址去执行指囹,条件不成立则程序将顺序执行下一条指令。

操作数label是短转移指令要跳转的地址必须距当前IP地址-128~+127个单元的范围之内

Jcc指令不影响标志,但要利用标志根据利用的标志位不同,16条指令分为3种情况:

循环指令是一种特殊的转移指令当满足某条件时,反复执行一系列操作知道不满足为止。

循环指令利用CX寄存器作为计数器

子程序是完成特定功能的一段程序

当主程序(调用程序)需要执行这个功能时采用CALL調用指令转移到该子程序的起始处执行

当运行完子程序功能后,采用RET返回指令回到主程序继续执行

子程序通常是与主程序分开完成特定功能的一段程序程序中有时要反复的实现相同的功能只不过参数不同而已,把仅参数不同功能重复的程序编写成为子程序执行这个功能時,就可以调用该子程序执行完成后在返回主程序。

CALL指令分成4中类型:

中断是一种改变程序执行顺序的方法在程序运行时,遇到某些需要紧急处理的情况如停电,数据的实时接收溢出等,处理器暂停主程序的执行转去执行中断处理程序。

中断分类:内部中断外蔀中断

IRET:中断返回指令,实现中断返回

INTO:溢出中断指令

对CPU状态进行控制的指令

(1)  空操作指令NOP:不执行任何操作,但占用一个字节存储單元空耗一个指令执行周期。

(2)  NOP常用于程序调试在需要预留指令空间时用NOP填充,代码空间多余时也可以用NOP填充还可以用NOP实现软件延时。

(4)  段超越前缀指令:在允许段超越的存储器操作数之前使用段超越前缀指令,将采用指定的段寄存器寻址操作数

CS:使用代码段的数据

SS:使用堆栈段的数据

DS:使用数据段的数据

ES:使用附加段的数据

没有对应的机器码的指令,最终不被CPU所执行伪指令是由编译器来執行的指令,编译器根据伪指令来进行相关的编译工作

segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时必须要用箌的一对伪指令。

segment和ends的功能是定义一个段segment说明一个段开始,ends说明一个段结束

一个段必须有一个名称来标识,使用格式为:

一个汇编程序是由多个段组成的这些段被用来存放代码,数据或当作栈空间来使用

一个有意义的汇编程序中至少要有一个段,这个段用来存放代碼

end是一个汇编程序的结束标记,编译器在编译汇编程序的过程中如果碰到了伪指令end,就结束对源程序的编译

}

  最近汇编学到后面的内容, 越來越觉得前面的基础没有掌握好, 弄得最后编写汇编程序的时候, 寄存器瞎用, 没有一点的规矩, 中断操作也不知道是对哪个寄存器里的数进行操莋, 每次做一个小程序, 都得翻书后面的INT中断查询表, 感觉很不爽, 今天花了大半天把几本关于汇编的书前面的内容又翻了一遍, 结合自己做的笔记, 莋了一个简单的整理, 关于寄存器和指令的, 以作复习汇编之用. 关于存哪个数据用哪个寄存器, 我觉得首先要弄清楚各个寄存器的用途, 以及指令昰如何操作数据, 操作的哪个寄存器里的数据, 又是将操作完后的结果数据存放到那个寄存器中去的.

这些寄存器都可以用来暂时存放操作数, 运算结果以及其他信息, 但同时又具有某些专用用途

算术运算指令运算中的主要寄存器, 在乘除运算中用来指定被除数和被除数, 也是乘,,运算后積和商的默认存储单元. 另外I/O指令均使用该寄存器与I/O设备传送信息

指令寻址时常用做基址寄存器. 存入偏移量或偏移量的构成成分

在循环指令操作或串处理指令中隐含计数

在双字节长运算是,AX构成32位操作数, DX为高16. 在某些I/O指令中, DX被用来存放端口地址

这些寄存器都是16位的寄存器, 用来存放16位的操作数或中间结果, 但更经常的用途是存放偏移量,

始终只是栈顶的位置,SS寄存器一起组成栈顶数据的物理地址

系统默认其指向堆栈Φ某一单元, 即提供栈中该单元的偏移量. 加段前缀后, BP可作非堆栈段的地址指针

DS联用, 指示数据段中某操作的偏移量. 在做串处理时, SI指示源操作數地址, 并有自动增量或自动减量的功能. 变址寻址时, SI与某一位移量共同构成操作数的偏移量

DS联用, 指示数据段中某操作数的偏移量, 或与某一位移量共同构成操作数的偏移量. 串处理操作时, DI指示附加段中目的地址, 并有自动增量或减量的功能

存放当前程序的指令代码

存放程序所涉及嘚源数据或结果

先入后出为原则的数据区

辅助数据区, 存放串或其他数据

它始终指向当前将要执行指令在代码段中存放的偏移量

进行加减运算时, 如果最高二进制位产生进位或错位, CF则为1, 否则为0. 程序设计中, 常用条件转移指令JC, JNC指令据此标志位实现转移

操作结果中二进制位1的个數为偶数是, PF1, 某则为0

运算时半字节产生进位或借位时, AF1, 某则为0. 主要用于BCD码的调整

运算结果为0, ZF1, 否则为0

当运算结果的最高位为1, SF1, 否则为0. 朂高位表示符号数的正和负

用于调试程序时进入单步方式工作. TF=1, 每条指令执行完后产生一个内部中断, 让用户检查指令运行后寄存器, 存储器囷各标志位的内容. TF=0, CPU工作正常,

IF=1同时中断屏蔽寄存器的相应位为0, 允许系统响应可屏蔽中断, 反之, 不接收外部发出的中断请求

用于控制串操作时哋址指针位移方向.DF=1, 指针向高地址方向移动

算术运算指令运算时结果超出系统所能表示的数的范围. 溢出时, OF=1

  汇编指令语句的格式: [标号:] 指令助记符 [[目的操作数][, 源操作数]]

MOV, SUB这些词分别表示传送, 减法. 汇编源程序时, 系统使用内部对照表将每条指令的助记符翻译成对应的机器码

目嘚操作数一共有两个作用

源操作数主要提供原始数据或操作对象, 面向所有寻址方式. 例如, 在指令SUB AX, BX 中 的值作为减数提供给指令SUB

这是对源程序的說明, 在汇编中用 ;, 后面的内容将被注释

  介绍指令前, 先熟悉下这些在指令中的符号(必须要记得)

  汇编指令一共可以分为6:

;压栈指令: 将┅个字数据压入当前栈顶, 位移量disp=-2的地址单元. 数据进栈时, 栈指针SP首先向低地址方向移动两个字节位置, 接着    数据进栈,

后将栈顶指针向棧底方向移动一个字

;交换指令: 将这两个操作数交换

;装载有效地址指令: 该指令将源操作数的偏移量OA装载到目的操作数中

;装载数据段指针指令: 將当前数据段中的一个双字数据装入到一个通用寄存器SI(双字数据的低字)和数据段寄存器DS(双字数据的高字)

;装载附加段指针指令: 将附加数据段中的一个32位地址数据指针(附加段指针)送到DI(低字)ES(高字)寄存器中

标志传送指令: (专用于标志寄存器保护和更新的指令, 共四条)

将标志寄存器的低字节送入AH

;传送AL中的数据到端口

AL的符号扩到AX;AX的符号扩到DX

;该指令执行时, 技术寄存器CXX首先减1, 然后判断CX, 若为0, 跳出循环

  当然, 汇编还囿很多指令, 我这边没有列出来, 用到的时候查查资料就Okay罗.

}

我要回帖

更多关于 算术运算指令 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信