强大的80X86常用汇编指令集

合集下载

实验一 Debug常用命令及80x86指令的使用

实验一 Debug常用命令及80x86指令的使用

实验一 Debug常用命令及80x86指令的使用实验目的:通过实验掌握下列知识:1、DEBUG常用命令: A,U,D,E,R,T,G,Q。

2、80x86寄存器: AX/EAX,BX/EBX,CX/ECX,DX/EDX,FLAG,IP/EIP3、80x86常用指令: MOV/MOVSX/MOVZX,ADD/ADC,SUB/SBB,DAA,XCHG等。

内容及步骤:一、DEBUG 命令使用:1、打 DEBUG 进入 DEBUG 控制,显示提示苻 '_ '。

2、用命令 E 18E4:100 'A' 将'A'的ASCII码填入内存。

3、用命令 D 18E4:100 观察内存中的16进制码及屏幕右边的ASCII字符。

4、用命令 E 18E4:100 41 重复上二项实验,观察结果并比较。

5、用命令 E 18E4:100 30 31 32 …… 3F将30H-3FH写入地址为100开始的内存单元中,再用D命令观察结果,看键入的16进制数是什么字符的ASCII码?6、用R 命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内容。

7、用R命令将AX,BX内容改写为1050H及23A8H。

二、808x86常用指令练习1、传送指令1)用A命令在内存100H处键入下列内容:MOV AX,1234MOV BX,5678XCHG AX,BXMOV AH,35MOV AL,48MOV DX,75ABXCHG AX,DX2)用U命令检查键入的程序并记录,特别注意左边的机器码。

3)用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。

并注意标志位有无变化。

4)用G命令运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。

并注意标志位有无变化。

2、加减法指令:1)用A命令在内存100H处键入下列内容:MOV AH,34MOV AL,22ADD AL,AHSUB AL,78MOV CX,1284MOV DX,5678ADD CX,DXSUB CX,AXSUB CX,CX2)用U命令检查键入的程序及对应的机器码。

80X86汇编语言电子教案(3-2-MOV指令)

80X86汇编语言电子教案(3-2-MOV指令)

提供的基本寻址方式可以分为三类立即寻址寄存器寻址存储器寻址与存储器有关的寻址的有效地址由以下四种成分组成1位移量存放在指令中的一个81632位的数2基址存放在基址寄存器中的内容3变址存放在变址寄存器中的内容4比例因子386及后继机型增加的一个术语1无比例因子8086286386及后继机型共有位移量直接寻址基址或变址位移量基址或变址—基址变址寻址2带比例因子386及后继机型位移量变址比例因子比例变址寻址比例因子基址+比例因子说明这些寻址方式不仅可以用于源操作数的寻址也可以用于目的操作数的寻址唯一例外的是立即寻址只能用于源操作数例MOV [BX][DI]AX 则源操作数为寄存器寻址目的操作数为基址变址寻址存储器寻址时所确定的内存地址既可以是字节字也可以是双字地址那么上述指令的目的操作数的宽度是多少呢指令中操作数要具有明确的类型寄存器寻址类型确定存储器操作数寻址类型由变量的类型属性确定其它情况类型下操作数类型由指令中其它操作数的类型或指令缺省类型来确定确定的操作数为字类型指令指示对一定操作对象进行何种操作的命令指令系统计算机CPU的指令集合称为指令系统一指令集说明学习要求指令的基本功能二数据传送指令1通用数据传送指令2累加器专用传送指令3地址传送指令4标志寄存器传送指令5类型转换指令特点负责把数据地址或立即数传送到寄存器或存储单元中1通用数据传送指令1传送指令传送指令执行操作DSTSRC DST SRC 的类型要一致双字字节MOV AXMOV AH MOV AX MOV BXMOV MAST[BP][DI]MOV BL MOV BYTE PTR [BX]MOV DSMOV ES MOV AXMOV [BX]MOV DS例MOV EAX MOV ES 哪些指令为非法形式例MOV AXMOV AHMOV AXMOV BXMOV MAST[BP][DI]MOV BLMOV BYTE PTR [BX]MOV DSMOV ESMOV AXMOV [BX]MOV DS寄存器寄存器字寄存器寄存器字节存储器寄存器字存储器寄存器寄存器存储器字节立即数寄存器立即数存储器字节寄存器段寄存器存储器段寄存器段寄存器寄存器存储器存储器段寄存器段寄存器MOV ES立即数段寄存器MOV EAX存储器寄存器双字MOV CS AXMOV 5ALMOV EAX BX都是非法指令如为了使指令字不要过长规定双操作数指令的两个操作数中只能有一个使用存储器寻址方式因此不允许双存储器操作在有通用性MOV [BX]2带符号扩展传送指令有符号数的扩展MOVSX386及后继机型可用格式MOVSX DST, SRC执行操作本指令有两种格式REG1REG源操作数可以是或存储单元的内容目的操作数必须是功能传送时将源操作数符号扩展送入目的寄存器可以是位MOVSX3带零扩展传送指令无符号数的扩展MOVZX386及后继机型可用格式MOVZX DST, SRC执行操作本指令有两种格式REG1REG源操作数目的操作数MOVSX功能传送时将高位扩展为送入目的寄存器可以是位MOVSX例1MOVSX EAX 2MOVZX EAX 若执行前DATA =0FFE0H DATA 为字单元1EAX =0FFFFFFE0H 2EAX=0000FFE0H一般的双操作数指令源目的操作数的长度一致MOVZX MOVSX 指令的源操作数的长度一定要小于目的操作数的长度如MOVSX DXALMOVZX EBXAL 4堆栈操作指令堆栈PC 机的堆栈是在内存中开辟的一端固定一端活动的存储区采用的工作方式栈顶SP 或ESP 址由低注意 1.信息的存入和取出都是从栈顶开始中栈顶由指示当堆栈地址长度为位时堆栈操作使用SP 当堆栈地址长度为位时堆栈操作使用ESP为了将清楚堆栈操作指令我们分8086/8088803868086/8088 PUSH/POP进栈指令执行操作出栈指令执行操作例SP→SP→例SP→SP→ES)=2367H, (SP)=0100H,试画出堆栈的变化情况(SP)=100H12H12H例都是非法指令80386SP SP 2 ESP ESP 2 SP SP 4 ESP ESP 4 1616位位在实方式下803868086为编写80386及后继的程序可利用位通用寄存器可使用新增指令可采用新增的寻址方式但是段的最大长64KB 当存储单元的地址偏移超过64KB 时不会引起地址的反绕而导致段跨越异常在实方式下80386的兼容最大段为64称为位段在保护方式下段长可达4G 称为位段在实方式下运行的程序只能使用位段尽管在实方式下只能使用位段但可以使用位操作数也可以使用位形式表示的存储单元地址例MOV EAX关于实方式程序的几点说明为单位指令可以有四种格式不允许它使用立即数寻址方式指令允许三种格式能为字节类型5PUSHA/PU格式PUSHA286及后继PUSHAD386及后继执行操作PUSHA位通用寄存器依次入栈入栈次序为AX CX DX BX指令执行前的SP BP SI DISP SP-16PUSHAD位通用寄存器依次入栈入栈次序为EAX ECX EDX EBX指令执行前的ESP EBP ESI EDIESP ESP-326POPA/POP格式执行操作POPA位通用寄存器依次出栈出栈次序为DI SI BP SP BX DX CX AXSP SP+16POPAD位通用寄存器依次出栈出栈次序为EDI E SI EBP ESP EBX EDX ECX EAXESP ESP+32PUSHA POPA PUSHAD不影响标志位例例7交换交换指令执行操作OPR1OPR1OPR1例如XCHG EAX,EBX ; EAX 字AL 为要查找数据在表格2累加器专用传送指令EAX AX 传送信息IN OUT 输出程序设计中讲解换码指令格式执行操作累加器EAX AX AL例MOV BX, OFFSET TABLE ; (BX)=0040H长度不超过256)或EBX下标→(AL)3地址传送指令1LEA REG, SRC ;2LDS REG, SRC ;3LES REG, SRC ;4LFS REG, SRC ;5LGS REG, SRC ;6LSS REG, SRC ;把首地址偏移地址传送指令执行操作位有效地址位有效地址位有效地址截取低位有效地址零扩展后存入则MOV BX LEA BXBX =3412H BX=0100HBLOCK的区别假设0100H BLOCK =3412H 例值而不是该地址所在的存储单元的内容必须注意取地址到和寄存器指令执行操作或SREG ←位寄存器REG 不能是段R R LFS 段址偏移地址偏移地址段址例LDS SI, [10H]例LES DI, [BX]例TABLE DW 40H, 3000H , 2000HLSS ESP TABLE ;ESP=30000040H; (SS) =2000H4标志寄存器传送指令执行操作送标志寄存器指令执行操作(FLAGS标志进栈指令执行操作PUSHF: (SP)标志出栈指令执行操作LAHFSAHF例PUSHF TF=1TF15类型转换CBW AL的符号扩展到AH形成中的字CWD/CWDECWD AX的符号扩展到DX形成DX AX双字CWDE AX的符号扩展到EAX形成EAX双字CDQ EAX的符号扩展到EDX形成EDX EAXBSWAP 486及后继机型可用格式BSWAP R32 R32位寄存器操作将位寄存器的字节次序变反即14字节互换23字节互换指令合法的指令格式堆栈操作指令的指令与指令的区别掌握XCHG XLAT MOVSX MOVZX类型转换其余堆栈操作指令标志操作指令MOVSX作业。

汇编80X86伪指令系统

汇编80X86伪指令系统

80X86伪指令系统一.伪指令概述构成汇编语言程序的语句可以分为三种:指令性语句(指令语句)、指示性语句(伪指令语句)和指令语句(宏调用语句)。

指令语句,又称可执行语句,表示计算机具有的一个基本能力。

比如数据传送,数据相加、相减等。

伪指令语句,又称命令语句,告诉汇编程序如何对程序进行汇编。

比如段定义、储存单元分配等。

一个汇编语言程序经汇编,连接和装入内存后,在执行程序之前:1.指示性语句的功能已经完成,故又称伪操作。

2.指令性语句的功能尚未完成,需控制CPU去执行,才能完成。

二、伪指令详解符号定义语句1.等值语句格式:符号名EQU 需等值的表达式功能:用符号名等值指定的表达式;其中表达式可以是任何有效的操作数,汇编时用语句中的表达式代替程序中符号所在的地方。

说明:▲可用于定义符号常量,方便修改程序。

▲某表达式多次出现时,用等值伪操作可以方便编程。

▲等值语句表达式的种类(1)常数或数值表达式COUNT EQU 10NUM EQU 89*3+5-9(2)地址表达式ADD1 EQU V AR2+10H(3)变量或标号CON EQU V AR▲在EQU语句右边出现的标号需在EQU语句以前进行定义。

2.等号语句格式:符号=需等值的表达式功能:把等号“=”右边表达式的值或符号赋给等号“=”左边的符号。

表达式可以是任何有效的操作数。

说明:EQU语句与“=”的区别:在同一源程序中,EQU语句定义的符号不能被重新赋值或者说不能被重新定义,同一符号只能定义一次,符号的数值不能被改变。

“=”定义的符号可以被重新赋值,同一符号的数值在同一个程序中可以改变。

数据定义语句格式:变量名类型助记符操作数[ ,操作数, ……]功能:用于在内存中为常数、初始数据或者变量分配储存单元。

说明:(1)变量名指示内存操作数所占用的内存单元地址(符号地址),在程序中,可以通过变量,名对内存单元进行访问。

变量名为用户自定义标识符,表示初值表首元素的逻辑地址。

80x86指令格式

80x86指令格式
(3) 存储器操作数缺省数据类型,在16位指令模式时为字类型,在32位指令模式时为双字类型,在使用中如要改变字类型,应使用PTR伪指令来定义,即
字节类型 BYTE PTR [Reg]
字类型 WORD PTR [Reg]
双字类型 DWORD PTR [Reg]
(4) 段寄存器操作数(Seg)——为16位段寄存器,包括CS,DS,ES,SS,FS,GS。
3.2 80x86指令格式
3.2.180x86指令编码格式
指令编码格式是指指令的机器码表示格式,其最多可以由以下5部分组合构成:
一、前缀
指令前缀为地址长度前缀和操作数长度前缀。为了实现80x86系列的兼容性,在实方式和保护方式下均可执行16位或32位指令,在汇编程序汇编时,为某些指令附加指令前缀,可以将指令操作数或地址长度,由16位转移到32位,或由32位转移到16位。
(5) 立即数(imm)——只允许作为源操作数,其数据类型由目的操作数来限定。
(6) 注释——由分号(;)开始,用来对指令功能加以说明,使程序便于阅读,汇编程序对它不进行处理。
对于指令的分析,须注意以下4点:
·指令的功Leabharlann ; ·适用于指令的寻址方式;(Missed Code)
(2) 存储器操作数(Mem)——间接寻址时16位寻址寄存器包括BX,BP,SI,DI;32位寻址寄存器包括EAX,EBX,ECX,EDX,ESI,EDI,EBP。其中BX,SI,DI,EAX,EBX,ECX,EDX,ESI,EDI对应的缺省段寄存器为DS;BP,EBP对应的缺省段寄存器为SS。
例如 MOV Dest, Src
为数据传送指令,Src表示源操作数,Dest表示目的操作数,数据流动的方向是由Src源操作数传送到Dest目的操作数,操作数可以是寄存器或存储器操作数,有关操作数说明如下。

80X86汇编指令集

80X86汇编指令集

1.数据传输指令它们在存储器和寄存器、寄存器和输人输出端口之间传送数据,1)通用数据传送指令MOV; 传送字或字节。

MOVSX: 先符号扩展,,再传送。

MOVZX: 先零扩展,再传送。

PUSH: 把字压入堆栈。

POP: 把字弹出堆栈。

PUSHA: 把AX、CX、DX、BX、SP、BP、SI、DI依次压人堆栈。

POPA: 把DI、SI、BP、SP、BX、DX、CX、AX依次弹出堆栈。

PUSHAD: 把EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI 依次压入堆栈。

POPAD: 把EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX 依次弹出堆栈。

BSWAP: 交换32 位寄存器里字节的顺序。

XCHG: 交换字或字节(至少有一个操作数为寄存器,段寄存器不可作为操作数)。

CMPXCHG; 比较并交换操作数(第个操作数必须为累加器AL/AX/EAX)。

XADD: 先交换再累加(结果在第一个操作数里)。

XLAT: 字节查表转换。

BX指向一张256字节的表的起点,AL为表的索引值(0-255,即0-FFH)返回AL 为查表结果([BX+AL]-->AL).2) 输入输出端口传送指令IN:I/O端口输入(语法:IN 累加器,{端口号 | IDX})OUT: I/O端口输出(语法: OUT {端口号 | DX},累加器)。

输入输出端口由立即方式指定时,其范围是0-255,由寄存器DX指定时,其范围0~ 65535.3) 目的地址传送指令LEA: 装入有效地址。

例如:LEA DX,string ;把偏移地址存到DXLDS; 传送目标指针,把指针内容装人DS例如:LDS SI,string ;把“段地址:偏移地址”存到DS:SILES: 传送目标指针,把指针内容装人ES,例如:LRS DI,string;把“段地址偏移地址”存到ES:DILFS: 传送目标指针,把指针内容装人FS.例如:LES DI,string ;把“段地址:偏移地址”存到ES:DILGS: 传送目标指针,把指针内容装入GS。

资料:经典的80x86指令系统(指令大全)

资料:经典的80x86指令系统(指令大全)

80x86指令系统80x86的指令系统可以分为以下6组:数据传送类指令算术指令逻辑指令串处理指令控制转移指令处理机控制指令1、数据传送指令数据传送类指令负责把数据、地址或立即数传送到寄存器或存储单元中。

它又可以分为五种:1.1、通用数据传送指令MOV 传送MOVSX 带符号扩展传送MOVZX 带零扩展传送PUSH 进栈POP 出栈PUSHA 所有寄存器进栈POPA 所有寄存器出栈XCHG 交换(1)MOV传送指令格式为:MOV DST,SRC执行操作:(DST)<——(SRC)MOV指令可以在CPU内或CPU和存储器之间传送字或字节,MOV指令不影响标志位(2)MOVSX带符号扩展传送指令格式为:MOVSX DST,SRC执行操作:(DST)<——符号扩展(SRC)该指令的源操作数可以是8位或16位的寄存器或存储单元的内容,而目的操作数则必须是16位或32位寄存器,传送时把源操作数扩展送入目的寄存器。

MOVSX不影响标志位(3)MOVZX带零扩展传送指令格式为:MOVZX DST,SRC执行操作:(DST)<——零扩展(SRC)MOVSX和MOVZX指令与一般双操作数指令的差别是:一般双操作数指令的源操作数和目的操作数的长度是一致的,但MOVSX和MOVZX的源操作数长度一定要小于目的操作数长度(4)PUSH进栈指令格式为:PUSH SRC执行操作:16位指令:(SP)<——(SP)-2((SP)+1),(SP))<——(SRC)32位指令:(ESP)<——(ESP)-4((ESP)+3),(ESP)+2),(ESP)+1)(ESP))<——(SRC)(5)POP出栈指令格式为:POP DST16位指令:(DST)<——((SP)+1),(SP))(SP)<——(SP)+232位指令:(DST)<——((ESP)+3),(ESP)+2),(ESP)+1)(ESP))(ESP)<——(ESP)+4堆栈是一种“后进先出”方式工作的一个存储区,它必须存在于堆栈段中,因而其段地址存放于SS寄存器中。

80x86指令集

80x86指令集

扩展的指令
扩展的指令
扩展指令
扩展的指令
字紧缩为,DW] 紧缩字到字节
WD ,DQ] 从MMX 寄存器解压(交
WD ,DQ] 从MMX 寄存器解压(交
和 DATATXN 是结构变量名;结构变量名与具体的存储空间和数
NAM 和 ENDS 括起来的数据定义语句序列,必须成对出现,缺一不可;结构名是为结构起
4 字 10 字压缩
DB 可以定义用单引号括起来的字符
PROC 和 ENDP 必须成对出现,限定一个
连续存放程序和数据,
2 字
GROUP 定义符后指定的所有段
并赋予该段一
和 ENDS 语句

LABEL 伪指令提供了另一种定义标号或变
? 号时,表示符号名无确定值。

汇编程序遇
格式:符号名 EQU 表达式
& 格式:符号名 = 表达式 & 功能:等号语句的
JMP 指令

M
的结果是一个 8 位或 16 位二进制数中
RUC 和。

x86架构汇编指令

x86架构汇编指令

x86架构汇编指令x86架构汇编指令是一种底层的机器语言指令集,用于在x86架构的计算机上执行任务。

它包含了一系列指令,用于操作寄存器、内存和其他硬件设备,以及进行算术和逻辑运算等操作。

本文将介绍几个常用的x86架构汇编指令,包括MOV、ADD、SUB和JMP。

1. MOV指令:MOV指令用于将数据从一个位置复制到另一个位置。

它的语法如下:MOV destination, source其中destination可以是一个寄存器或内存地址,source可以是一个寄存器、内存地址或立即数。

例如,MOV AX, BX将BX寄存器的值复制到AX寄存器中。

2. ADD指令:ADD指令用于将两个数相加,并将结果存储在目标位置。

它的语法如下:ADD destination, source其中destination可以是一个寄存器或内存地址,source可以是一个寄存器、内存地址或立即数。

例如,ADD AX, BX将AX寄存器的值与BX寄存器的值相加,并将结果存储在AX寄存器中。

3. SUB指令:SUB指令用于将两个数相减,并将结果存储在目标位置。

它的语法如下:SUB destination, source其中destination可以是一个寄存器或内存地址,source可以是一个寄存器、内存地址或立即数。

例如,SUB AX, BX将AX寄存器的值减去BX寄存器的值,并将结果存储在AX寄存器中。

4. JMP指令:JMP指令用于无条件地跳转到指定的地址。

它的语法如下:JMP destination其中destination可以是一个标签或地址。

例如,JMP LOOP将跳转到LOOP标签所在的位置。

除了上述指令外,x86架构汇编还包括许多其他指令,如CMP、AND、OR、NOT、XOR等,用于进行比较、逻辑运算和位操作等。

这些指令可以组合使用,以实现复杂的功能。

x86架构汇编指令的编写需要遵循一定的规范和语法。

每条指令都由一个助记符和操作数组成,它们之间用逗号隔开。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

80X86常用汇编指令集ZZ 作者 : 赵振东ZZD80X86汇编过程中经常用到的一些汇编指令如下所示。

从功能分类:1、数据传送指令:MOV、XCHG、LEA、LDS、LES、PUSH、POP、PUSHF、POPF、CBW、CWD、CWDE。

2、算术指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、DAA、DAS、AAA、AAS。

3、逻辑指令:AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、RCL、RCR、ROL、ROR。

4、控制转移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOPNE、CALL、RET、INT。

5、串操作指令:MOVS、LODS、STOS、CMPS、SCAS。

6、标志处理指令:CLC、STC、CLD、STD。

7、32位CPU新增指令(后续补充并完善)-----------------数据传送指令开始-------------------------------1、MOV(传送)指令写法:MOV target,source功能:将源操作数source的值复制到target中去,source值不变注意事项:1)target不能是CS(代码段寄存器),我的理解是代码段不可写,只可读,所以相应这地方也不能对CS执行复制操作。

2)target 和source不能同时为内存数、段寄存器(CS\DS\ES\SS\FS\GS)3)不能将立即数传送给段寄存器4)target和source必须类型匹配,比如,要么都是字节,要么都是字或者都是双字等。

4)由于立即数没有明确的类型,所以将立即数传送到target时,系统会自动将立即数零扩展到与target 数的位数相同,再进行传送。

有时,需要用BYTE PTR、WORD PTR、 DWORD PTR明确指出立即数的位数写法示例:MOV dl,01H;MOV eax,[bp]; eax =ss:[bp] 双字传送。

2、 XCHG(交换)指令写法:XCHG object1,object2功能:交换object1与object2的值注意事项:1)不能直接交换两个内存数的值 2)类型必须匹配3)两个操作数任何一个都不能是段寄存器【看来段寄存器的写入的限制非常的严格,MOV指令也不能对段寄存器进行写入】,4)必须是通用寄存器(ax、bx、cx、dx、si、di)或内存数写法示例:XCHG ax,[bx][si]; XCHG ax,bx;3、 LEA(装入有效地址)指令写法:LEZ reg16,mem功能:将有效地址MEM的值装入到16位的通用寄存器中。

写法示例:假定bx=5678H,EAX=1,EDX=2Lea si,2[bx] ;si=567AHLea di,2[eax][edx] ;di=5注意,这里装入的是有效地址,并不是实际的内存中的数值,如果要想取内存中该地址对应的数值,还需要加上段地址才行,而段地址有可能保存在DS中,也有可能保存在SS或者CS中哦:>不知道我的理解可正确。

4、 LDS\LES\LGS\LSS(注意,与LEA不同的是,这里是装入的值,而不是有效地址)这几个指令,名称不同,作用差不多。

写法:LDS reg16,mem32功能描述:reg16等于mem32的低字,而DS对应于mem32的高字(当为LES时,这里就是ES对应于mem32的高字)用来给一个段寄存器和一个16位通用寄存器同时复制。

注意事项:第一个操作数必须是16位通用寄存器先熟悉下堆栈的概念。

堆栈,位于内存的堆栈段中,是内存的一部分,具有“先进后出”的特点,堆栈只有一个入口,即当前栈顶,当堆栈为空时,栈顶和栈底指向同一内存地址,在WINDOWS中,可以把堆栈理解成一个倒着的啤酒瓶,上面的地址大,下面的地址小,当从瓶口往啤酒瓶塞啤酒时(进栈),栈顶就会往瓶口下移动,也就是往低地址方向移动,同理,出栈时,正好相反,把啤酒给倒出来,栈顶向高地址方向移动。

这就是所谓的堆栈,哼哼,很Easy吧。

在汇编语言中,堆栈操作的最小单位是字,也就是说,只能以字或双字为单位,同时,SS:SP指向栈顶(SS为堆栈段寄存器,SP为堆栈指针,二者一相加,就构成了堆栈栈顶的内存地址)。

5、PUSH(进栈)写法:PUSH reg16(32)/seg/mem16(32)/imm功能描述:将通用寄存器/段寄存器/内存数/立即数的值压入栈中,即:SP=SP-2 SS:[SP]=16位数值(当将32位数值压入栈中时,SP=SP-4,SS:[SP]=32为数值)6、POP(出栈)写法:POP reg16(32)/seg/mem16(32)【不能出栈到CS中】功能描述:将堆栈口的16(32)位数据推出到通用寄存器/段寄存器/内存中,即:寄存器/段寄存器/内存= SS:[SP] SP=SP+2(当将32位数值出栈时,SP=SP+4)(注意,不能出栈给立即数哦,常量不可变嘛)7、PUSHA、PUSHAD、POPA、POPAD作用:将所有16/32位通用寄存器进栈/出栈如:PUSHA ;将AX、CX、DX、BX、原SP、BP、SI、DI依次进栈。

POPA出栈顺序正好相反,但要注意的是,弹出到SP的值被丢弃,SP 通过增加16位来恢复(当然嘛,不然栈顶地址就被修改了,就会出息不对齐的情况,就有可能乱套了)POPAD PUSHAD一样,只不过是32位的罢了。

8、PUSHF、PUSHFD、POPF、POPFD功能描述:标志寄存器FLAGS(EFLAGS)进栈或出栈如:PUSHF ;FLAGS进栈 POPF;栈顶字出栈到FLAGS总结下,POP 和PUSH通常可以用来交换两个寄存器的值,也可以用来保护寄存器的值,如下:交换ax与cx的值:push ax;push cx;pop ax; pop cx;保护寄存器:push ax;push cx;….中间有很多执行的代码…pop cx;pop ax;9、LAHF\SAHF(标志寄存器传送指令)写法:lahf;作用:AH=FLAGS的低8位写法:sahf;作用:FLAGS的低8位=AH10、符号扩展和零扩展指令CBW;AL符号扩展为AXCWD;AX符号扩展为32位数DX:AXCWDE;AX符号扩展为EAX;CDQ:EAX符号扩展为64位数EDX:EAXMOVSX(符号扩展指令的一般形式)写法:MOVSX reg16\32,reg8\reg16\mem8\mem16作用:用来将8位符号扩展到16位,或者16位符号扩展到32位MOVZX(零扩展指令)写法:MOVZX reg16\32,reg8\reg16\mem8\mem16零扩展,就是高位补0进行扩展。

通常用在将数据复制到一个不同的寄存器中,如AL零扩展为EBX。

相同寄存器的零扩展,可以使用MOV 高位,0来实现。

11、BSWAP(字节交换)写法:bswap reg32作用:将reg32的第0与第3个字节,第1与第2个字节进行交换。

示例:设EAX=12345678h执行bswap eax;后,eax=78563412H12、XLAT(换码)写法:XLAT;作用:AL=DS:[bx+AL]将DS:BX所指内存中的由AL指定位移处的一个字节赋值给AL。

(貌似这是一个方便偷懒的指令哦。

),原来它的主要用途是查表。

注意可以给它提供操作数,用来指定使用哪个段地址,如:XLAT ES:table;使用ES来作为段地址,table不起作用。

XLAT table ;使用table所在段对应的段寄存器作为段地址。

-----------数据传送指令结束,算术指令开始------------13、ADD(加法)写法:ADD reg/mem reg/mem/imm作用:将后面的操作数加到前面的操作数中注意:两个操作数必须类型匹配,并且不能同时是内存操作数ADC (带进位加法)写法:ADC reg/mem, reg/mem/imm ;作用:dest=dest+src+cf当CF=0时ADD与ADC的作用是相同的。

示例:实现64位数EDX:EAX与ECX:EBX的加法:Add EAX,EBX;ADC EDX,ECX;14、INC(自加一)写法:INC reg/mem;作用:dest=dest+1;15、XADD(交换加)写法:XADD reg/mem,reg作用:先将两个数交换,然将二者之和送给第一个数16、SUB(减法)写法:SUB reg/mem,reg/mem/imm;作用:dest=dest-src;SBB(带借位减法)写法:SBB reg/mem,reg/mem/imm作用:dest=dest-src-cf;注意:两个操作数必须类型匹配,且不能同时是内存数17、DEC(自减1)写法:DEC reg/mem;作用:dest=dest-1;18、CMP(比较)写法:CMP reg/mem,reg/mem/imm作用:dest-src注意:这里并不将结果存入dest中,而仅仅是执行相减的运算,达到依据运算结果去影响EFLAG标志位的效果19、NEG(求补)写法:NEG reg/mem作用:求补就是求相反数,即:dest=0-dest;20、CMPXCHG(比较交换)写法:CMPXCHG reg/mem,reg;作用:AL/AX/EAX-oprd1,如果等于0,则oprd1=oprd2,否则,AL/AX/EAX=oprd1;即:比较AL/AX/EAX与第一个操作数,如果相等,则置ZF=1,并复制第二个操作数给第一个操作数;否则,置ZF=0,并复制第一个操作数给AL/AX/EAX。

说明:CMPXCHG主要为实现原子操作提供支持CMPXCHG8B(8字节比较交换指令)写法:CMPXCHG8B MEM64;功能:将EDX:EAX中的64位数与内存的64位数进行比较,如果相等,则置ZF=1,并存储ECX:EBX到mem64指定的内存地址;否则,置ZF=0,并设置EDX:EAX为mem64的8字节内容21、MUL(无符号乘法)写法:MUL reg/mem;作用:当操作数为8位时,AX=AL*src;当操作数为16位时,DX:AX=AX*src;当操作数为32位时,EDX:EAX=EAX*src;22、IMUL(带符号位乘法)写法:IMUL reg/mem;(作用同上)IMUL reg16,reg16/mem16,imm16;IMUL reg32,reg32/mem32,imm32;IMUL reg16,imm16/reg16/imm16;IMUL reg32,reg32/mem32/imm32;注意:没有两个操作数均为8位的多操作数乘法。

相关文档
最新文档