强大的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指令)
提供的基本寻址方式可以分为三类立即寻址寄存器寻址存储器寻址与存储器有关的寻址的有效地址由以下四种成分组成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伪指令系统一.伪指令概述构成汇编语言程序的语句可以分为三种:指令性语句(指令语句)、指示性语句(伪指令语句)和指令语句(宏调用语句)。
指令语句,又称可执行语句,表示计算机具有的一个基本能力。
比如数据传送,数据相加、相减等。
伪指令语句,又称命令语句,告诉汇编程序如何对程序进行汇编。
比如段定义、储存单元分配等。
一个汇编语言程序经汇编,连接和装入内存后,在执行程序之前: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指令格式
字节类型 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汇编指令集
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的指令系统可以分为以下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指令集
扩展的指令
扩展的指令
扩展指令
扩展的指令
字紧缩为,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架构汇编指令,包括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架构汇编指令的编写需要遵循一定的规范和语法。
每条指令都由一个助记符和操作数组成,它们之间用逗号隔开。
8086指令大全
80X86 汇编指令符号大全+、-、*、/∶算术运算符。
&∶宏处理操作符。
宏扩展时不识别符号和字符串中的形式参数,如果在形式参数前面加上一个& 记号,宏汇编程序就能够用实在参数代替这个形式参数了。
$∶地址计数器的值——记录正在被汇编程序翻译的语句地址。
每个段均分配一个计数器,段内定义的所有标号和变量的偏移地址就是当前汇编地址计数器的值。
?∶操作数。
在数据定义语句中,操作数用?,其作用是分配并保留存储空间,但不存入确定的数据。
=∶等号伪指令——符号定义。
对符号进行定义和赋值,功能与 EQU相似,但允许(重复)再定义。
:∶修改属性运算符(操作符)——段操作符。
用来临时给变量、标号或地址表达式指定一个段属性(不用缺省的段寄存器),自动生成一个“跨段前缀字节”。
注意,段寄存器CS和ES不能被跨越,堆栈操作时也不能跨越SS。
;∶注释符号。
%∶特殊宏操作符,用来将其后的表达式(通常是符号常数,不能是变量名和寄存器名)转换成它所代表的数值,并将此数值的ASCII码嵌入到宏扩展中。
( )∶1.运算符——用来改变运算符的优先级别。
2.教材符号,表示括号内存储单元(或寄存器)的内容。
< >∶宏调用时用来将带间隔符(如空格,逗号等)的字符串(作为实参)括起来。
[ ]∶1.运算符。
方括号括起来的数是数组变量的下标或地址表达式。
带方括号的地址表达式必须遵循下列原则,①只有BX、BP、SI、DI这四个寄存器可在方括号内出现;②BX或BP可单独出现在各方括号中,也可以与常数、SI或DI一起出现在方括号内,但不允许BX和BP出现在同一个方括号内;③SI和DI可以单独出现在各方括号内,也可以与常数、BP或BX一起出现在方括号内,但不允许SI和DI出现在同一个方括号内;④一个方括号内包含多个寄存器时,它们只能作加法运算;⑤若方括号内包含基址指针BP,则隐含使用堆栈段寄存器SS提供段基址,否则均隐含使用数据段寄存器DS提供段基址。
汇编语言程序设计_第3章 80x86指令系统
3.3.2 算术指令
1. 加法
一般形式:
ADD dest, src ; dest = dest + src
ADC dest, src ; dest = dest + src + CF
INC
dest
; dest = dest + 1
语法格式:
ADD reg/mem, reg/mem/imm
ADC reg/mem, reg/mem/imm
movsx ax, al ; 等价于cbw movsx eax, ax ; 等价于cwde movsx eax, al ; 等价于顺序执行cbw与cwde
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
(3)MOVZX 一般形式: MOVZX dest, src ; src零扩展为dest;386新增 语法格式: MOVZX reg16, reg8/mem8 MOVZX reg32, reg8/mem8/reg16/mem16
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
5. 堆栈操作指令
80x86系统的堆栈具有如下特点: 堆栈是在内存的堆栈段中,具有“先进后出”的特点。 堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底指向同一内存单
元。 堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地
INC
reg/mem
对标志位的影响:
ADD、ADC:按一般规则影响CF、OF、SF和ZF。 INC:不影响CF,其它同ADD。 说明:ADD与ADC的2个操作数必须类型匹配,且不能同时是内存操作数。
2019/8/26
80X86汇编mul乘法指令
80X86汇编mul乘法指令使⽤ mul 做乘法的时候, 注意以下两点:两个相乘的数: 两个相乘的数, 要么都是 8 位, 要么都是 16 位. 如果是 8 位, ⼀个默认放在 AL 中, 另⼀个放在 8 位 reg 或内存字节单元中;如果是 16 位, ⼀个默认再 AX 中, 另⼀个放在 16 位 reg 或内存⼦单元中.结果: 如果是 8 位乘法, 结果默认放在 AX 中; 如果是 16 位乘法, 结果⾼位默认在 DX 中存放, 低位在 AX 中存放.格式如下:mul regmul 内存单元内存单元可以⽤不同的寻址⽅式给出, ⽐如:mul byte ptr ds:[0]含义: (ax) = (al) * ((ds) * 16 + 0);mul word ptr [bx+si+8]含义: (ax) = (ax) * ((ds) * 16 + (bx) + (si) + 8) 的结果的低 16 位.(dx) = (ax) * ((ds) * 16 + (bx) + (si) + 8) 的结果的⾼ 16 位.例:(1) 计算 100 * 10.100 和 10 ⼩于 255, 可以做 8 位乘法, 程序如下.mov al,100mov bl,10mul bl结果: (ax) = 1000(03E8H)(2) 计算 100 * 10000100 ⼩于 255, 可 10000 ⼤于 255, 所以必须做 16 位乘法, 程序如下.mov ax,100mov bx,10000mul bx结果: (ax) = 4240H, (dx) = 000FH (F4240H = 1000000)参考: 节选⾃王爽汇编语⾔。
80x86汇编语言程序设计
80x86汇编语言程序设计80x86汇编语言程序设计是一门专门研究如何使用汇编语言在80x86架构的计算机上编写程序的学科。
80x86架构是Intel公司开发的一种微处理器架构,它包括了8086、80286、80386、80486等处理器,以及后来的Pentium系列。
汇编语言是一种低级语言,它与机器语言非常接近,通常用于编写性能要求极高的程序或者进行底层系统开发。
汇编语言基础汇编语言的指令与机器指令一一对应,但使用助记符来代替二进制代码,使得程序更加易于编写和理解。
汇编语言的基本元素包括指令、寄存器、内存地址和立即数。
- 指令:是汇编语言的基本操作单位,用于执行特定的操作,如数据传输、算术运算、逻辑运算等。
- 寄存器:是CPU内部的存储单元,用于快速存取数据。
80x86架构有多个寄存器,包括通用寄存器、段寄存器、指令指针寄存器等。
- 内存地址:是存储在RAM中的数据的位置,汇编语言可以通过内存地址访问和操作数据。
- 立即数:是指令中直接给出的数值,不需要通过寄存器或内存地址访问。
汇编语言指令80x86汇编语言提供了丰富的指令集,用于执行各种操作。
以下是一些基本的指令类型:- 数据传输指令:如MOV(移动数据)、PUSH(将数据压入堆栈)、POP(从堆栈中弹出数据)等。
- 算术指令:如ADD(加法)、SUB(减法)、MUL(乘法)、DIV(除法)等。
- 逻辑指令:如AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)、XOR (逻辑异或)等。
- 控制流指令:如JMP(无条件跳转)、JE(等于时跳转)、JNE(不等于时跳转)、LOOP(循环)等。
汇编程序结构一个典型的汇编程序包括以下部分:1. 程序声明:声明程序的名称和起始点。
2. 数据定义:定义程序中使用的数据和常量。
3. 代码段:包含程序的指令和逻辑。
4. 堆栈段:用于存储临时数据和调用函数时的参数。
5. 常量段:定义程序中使用的常量。
6. 外部引用:引用其他程序或库中的代码和数据。
汇编语言程序设计-80X86指令系统和寻址方式
1.数据传送类指令 • 数据传送类指令用于实现CPU的内部寄存器之间 • CPU内部寄存器和存储器之间 • CPU累加器AX或AL和I/O端口之间的数据传送 此类指令除了SAHF和POPF指令外均不影响标志寄存器的
内容。 在数据传送指令中,源操作数和目的操作数的数据长度
必须一致。
(1)MOV指令
指令功能:把AX中的16位数或AL中的8位数输出到指定端口。
例 3.26
OUT 22H, AL
(4)段间间接寻址方式 这种寻址方式是由指令中给出的存储器数据寻址方式,包括存
放转移地址的偏移量和段地址。其低位字地址单元存放的 是偏移地址,高位字地址单元中存放的是转移段基值。这 样既更新了IP内容又更新了CS的内容,故称为段间间接寻 址。 例 JMP WORD PTR[BX] ;转移到当前代码位置内 ;有效地址存放在BX寻址的单元中
;物理地址=DS×16+SI
MOV [DI], DX
;物理地址=DS×16+DI
2) 以BP进行寄存器间接寻址(BP作为地址指针)的方式
隐含的段寄存器为堆栈段寄存器SS,操作数存放在堆栈段区域, 将堆栈段寄存器SS的内容左移4位,再加上基址寄存器BP的 内容,即为操作数的物理地址。
例
MOV [BP], BX
OP
DW
OP
SW
操作码格式
8086指令格式
几点说明: ① 一条指令可以包含一个操作数,也可以包含一个以上的操作
数;一个操作数的指令称为单操作数指令,单操作数指令中 的操作数可能由指令本身提供,也可能由指令隐含地指出。 ② 若位移量或立即数为16位,那么在指令代码中,将低位字节 放在前面,高位字节放在后面。 ③ 8086指令系统中大多数指令的操作码只占用第一个字节,但 有几条指令是特殊的,其指令中的第一个字节不但包含操作 码成分,而且还隐含地指出了寄存器名,从而整个指令只占 一个字节,成为单字节指令。这些指令字节数最少,执行速 度最快,用得也最频繁。
汇编语言 第3章1 80x86的指令系统和寻址方式
CS、DS、SS、ES
寄存器寻址指令
MOV AX,1234H MOV BX,AX ;AX←1234H ;BX←AX
寄存器寻址
3.1.4 存储器寻址方式
指令中给出操作数的主存地址信息(偏移
地址,称之为有效地址EA),而段地址在 默认的或用段超越前缀指定的段寄存器中
8086设计了多种存储器寻址方式
量之和,寄存器可以是BX、BP或SI、DI 有效地址=BX/BP/SI/DI+8/16位位移量
段地址对应BX/SI/DI寄存器默认是DS,对应BP
寄存器默认是SS;可用段超越前缀改变 MOV AX,[DI+06H]; mov ax,table[di] ;AX←DS:[DI+06H] MOV AX,[BP+06H] ;AX←SS:[BP+06H] 相对寻址
;AX←DS:[BX+SI+06H]
相对基址变址
位移量可用符号表示 同一寻址方式有多种表达形式
指令操作数的表达-寄存器
r8——任意一个8位通用寄存器
AH AL BH BL CH CL DH DL
r16——任意一个16位通用寄存器
AX BX CX DX SI DI BP SP
reg——代表r8或r16
(4)基址变址寻址方式
有效地址由基址寄存器(BX或BP)的内容加上
变址寄存器(SI或DI)的内容构成:
有效地址=BX/BP+SI/DI
段地址对应BX基址寄存器默认是DS,对应BP
基址寄存器默认是SS;可用段超越前缀改变 MOV AX,[BX+SI] ;AX←DS:[BX+SI] MOV AX,[BP+DI] ;AX←SS:[BP+DI] MOV AX,DS:[BP+DI] ;AX←DS:[BP+DI]
汇编指令索引
学习汇编语言,最关键的就在于汇编指令集的掌握以及计算机工作方式的理解,以下是80X86汇编过程中经常用到的一些汇编指令。
从功能分类上来说,一共可分为一、数据传送指令:MOV、XCHG、LEA、LDS、LES、PUSH、POP、PUSHF、POPF、CBW、CWD、CWDE。
二、算术指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、DAA、DAS、AAA、AAS。
三、逻辑指令:AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、RCL、RCR、ROL、ROR。
四、控制转移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOPNE、CALL、RET、INT。
五、串操作指令:MOVS、LODS、STOS、CMPS、SCAS。
六、标志处理指令:CLC、STC、CLD、STD。
七、32位CPU新增指令(后续补充并完善)除上述的一些指令外,还有许多32位80X86CPU新增指令,这些指令有时会简化程序设计,不过由于我也是刚刚学习汇编,这些都是从书上看到的,所以很多还不是十分了解,我写这些的目的仅仅是想让自己能更好的去记住这些指令的作用和用法,同事也希望和我一样刚入门的朋友能够多了解一些,并没有其他目的,所有的示例也并没有经过实际的代码测试,所以希望各位朋友,不管你喜欢不喜欢,反对不反对,请文明发言,谢谢!------------------------------------------------数据传送指令开始-------------------------------------------------------1、MOV(传送)指令写法:MOV target,source功能描述:将源操作数source的值复制到target中去,source值不变注意事项:1)target不能是CS(代码段寄存器),我的理解是代码段不可写,只可读,所以相应这地方也不能对CS执行复制操作。
8086汇编指令大全
8086汇编指令大全标志寄存器: 9个有效位,分6个状态寄存器和3个控制寄存器CF 当执行一个加法(减法)使最高位产生进位(借位)时CF=1 否则CF=0PF 指令执行的结果低8位有偶数个一时,CF=1 否则CF=0AF 当执行一个加法(减法)使运算结果低4位向高4位有进位(借位)时AF=1 否则 AF+0ZF 当前运算结果为零,ZF=1 否则ZF=0SF 符号标志位OF 溢出标志位DF 方向标志位IF 中断允许位 IF=1时响应外部中断TF 跟踪标志位操作数:[目的操作数(OPD),源操作数(OPS)] ;立即操作数,寄存器操作数,存储器操作数。
寻址方式:1) 寄存器寻址例: INC AX; MOV AX,BX2) 寄存器间接寻址(寄存器只能是BX,DI,SI,BP);[PA=(BX、DI、SI)+DS》4)或BP+SS》4]3) 寄存器相对寻址4) 基址变址寻址5) 相对基址变址寻址6) 直接寻址7) 立即数寻址i. 立即数寻址立即数寻址不能用在单操作数指令中ii. 在双操作数中,立即数寻址方式不能用于目的操作数字段指令系统:1) 数据传送指令 mov注意:不允许在两个存储单元之间直接传送数据不允许在两个段寄存器之间传送数据不允许用立即数直接为段寄存器赋值不影响标志位不允许寄存器或存储单元到除CS外的段寄存器2) 入栈(出栈)指令PUSH(POP)注意:PUSH操作数不能是“立即数”POP操作数不能是段寄存器CS 不影响标志位先进后出单操作符3) 交换指令XCHG注意:只允许寄存器与存储单元之间的交换不影响标志位4) 换码指令 XLAT5) 地址传送指令LEA(load effective address):偏移地址()6) 数据段指针送寄存器LDS :低地址的字送指定的通用寄存器(SI)、高地址的字送DS7) 附加段指针送寄存器指令LES :与LDS相似,低地址的字送通用寄存器(DI)、高地址送ES上三指令不影响标志位8) 标志寄存器传送指令LAHF :标志寄存器低八位送AHSAHF :AH送标志寄存器低八位PUSHF:标志寄存器压入堆栈POPF :栈顶内容送标志寄存器9) 加法指令 ADD目的操作数只能是寄存器或存储单元对CF,OF,SF,PF,ZF,AF有影响10) 加1指令 INC对OF,SF,PF,ZF,AF有影响11) 带位加法指令 ADC在进行单精度运算时用ADD指令,在高精度低位运算时用ADD、高位用ADCOPD=OPD+OPS+CF12) 减法指令 SUB对CF,OF,SF,PF,ZF,AF有影响13) 带借位减法指令 SBBOPD=OPD—OPS—CF对CF,OF,SF,PF,ZF,AF有影响对CF,OF,SF,PF,ZF,AF有影响14) 减1指令 DEC15) 比较指令 CMP16) 求补指令 NEG17) 无符号乘法指令 MUL字节操作:AX=AL*OPS字操作:DX,AX=AX*OPS18) 有符号乘法指令 IMUL19) 无符号除法指令 DIV字节的操作:AL=AX/(OPS)的商AH=AX/(OPS)的余数字的操作:20) 有符号除法 IDIV21) 字节转换为字指令 CBW把AL中的符号位扩展到AH中,如果AL的最高位为0,则AH=00H,如果最高位为1,则AH=FFH22) 字转换为双字指令 CWD23) 压缩的BCD码调整指令DAA 加法的十进制调整指令DAS 减法的十进制调整指令24) 非压缩的BCD码调整指令AAA 加法的ASCII调整指令AAS 减法的ASCII调整指令AAM 乘法的ASCII调整指令AAD 除法的ASCII调整指令25) 逻辑与运算指令ADDORNOTTEST(OPD和OPS的内容不变)26) 移位指令逻辑左移与算术左移SHL、SAL(低位补0)算术右移 SAR(高位不变、CF为最后移入的值)逻辑右移 SHR(高位补0、CF为最后移入的值)27) 循环移位左移 ROL (CF为最后移入的值)右移 ROR (CF为最后移入的值)带进位循环左移 RCL(CF+OPD 一起左循环)带进位循环右移 RCR(OPD+CF 一起右循环)28) 无条件转移指令下JMPJMP SHORT OPD(IP=IP+8位位移量)JMP NEAR PTR OPD(IP=IP+16位位移量)上二条指令目的地址是IP=OPD+IPJMP WORD PTR OPD(IP=EA)JMP FAR PTR OPD(IP=OPD的段内偏移地址 CS=OPD段地址)JMP DWORD PTR OPD(IP=EA CS=EA+2)29) 条件转移指令JZ(JE)结果为0则转移(ZF=1)JNZ(JNE)结果不为0则转移(ZF=0)JS 结果为负则转移(SF=1)JNS 结果为正则转移(SF=0)JO 溢出则转移(OF=1)JNO 不溢出则转移(OF=0)JP(JPE)奇偶位为1则转移(PF=1)JNP(JPO)奇偶位不为1则转移(PF=0)JC(JNAE,JB)低于且不等于或进位位为1则转移(CF=1)JNC(JNE,JNB)高于或等于或进位位为0则转移(CF=0)30)。
x86汇编指令整理
x86汇编指令整理1,寻址⽅式1,⽴即数寻址MOV AX, 0102H ;AX←0102H2、寄存器寻址⽅式指令中指明某个寄存器其内容即为操作数,寄存器在CPU内,不⽤总线周期,执⾏速度快。
8位寄存器r8:AH、AL、BH、BL、CH、CL、DH、DL16位寄存器r16:AX、BX、CX、DX、SI、DI、BP、SP4个段寄存器seg:CS、DS、SS、ESMOV AX, BX ;AX←BX3,直接寻址⽅式指令中直接给出操作数所在内存单元的有效地址(EA即偏移地址)默认的段地址在DS段寄存器,若在其它段可使⽤段超越前缀改变。
⽤⽅括号包含有效地址,表达存储单元的内容直接地址也可⽤标号代表,⽅括号可省略。
MOV AX, [2000H] ;AX←DS:[2000H]MOV AX, ES: [2000H] ;AX←ES:[2000H]4、寄存器间接寻址⽅式指令中给出的寄存器的内容包含操作数的有效地址。
间接寻址中使⽤的寄存器名要⽤⽅括号括起来1、基址寻址⽤BX或BP作间接寻址寄存器如:MOV AX,[BX] ;隐含在DS段MOV AX,[BP] ;隐含在SS段2、变址寻址⽤SI或DI作间接寻址寄存器如:MOV CL, [SI]MOV AX, [DI]单独使⽤SI或DI时,隐含在DS段中在串操作时,SI隐含在DS段中,DI隐含在ES段中。
3、相对基址寻址指令中给出基址寄存器及位移量,⼆者之和为操作数的有效地址。
位移量可以是8位或16位。
有效地址=BX/BP+8/16位位移量4、相对变址寻址指令中给出变址寄存器及位移量,⼆者之和为操作数的有效地址。
有效地址=SI/DI+8/16位位移量段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可⽤段超越前缀改变MOV AX, [SI+06H] ;AX←DS:[SI+06H]MOV AX, 06H[SI] ;AX←DS:[SI+06H]5、基址变址寻址⽅式有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:有效地址=BX/BP+SI/DI段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可⽤段超越前缀改变 MOV AX, [BX+SI] ;AX←DS:[BX+SI]MOV AX, [BX][SI] ;AX←DS:[BX+SI]6、相对基址变址寻址⽅式有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与⼀个8位或16位位移量之和:有效地址=BX/BP+SI/DI+8/16位位移量段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可⽤段超越前缀改变 MOV AX, [BX+DI+6] ;AX←DS:[BX+DI+6]MOV AX, 6[BX+DI] MOV AX, 6[BX][DI]各种寻址⽅式综合举例设BX=1200H DI=10A0H 位移量=2BC0HDS=2400H 求各种寻址⽅式下的有效地址和物理地址。
80X86常用汇编指令集
80X86常用汇编指令集ZZ作者 : 赵振东ZZD学习汇编语言,最关键的就在于汇编指令集的掌握以及计算机工作方式的理解,以下是80X86汇编过程中经常用到的一些汇编指令。
从功能分类上来说,一共可分为一、数据传送指令:MOV、XCHG、LEA、LDS、LES、PUSH、POP、PUSHF、POPF、CBW、CWD、CWDE。
二、算术指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、DAA、DAS、AAA、AAS。
三、逻辑指令:AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、RCL、RCR、ROL、ROR。
四、控制转移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOPNE、CALL、RET、INT。
五、串操作指令:MOVS、LODS、STOS、CMPS、SCAS。
六、标志处理指令:CLC、STC、CLD、STD。
七、32位CPU新增指令(后续补充并完善)除上述的一些指令外,还有许多32位80X86CPU新增指令,这些指令有时会简化程序设计,不过由于我也是刚刚学习汇编,这些都是从书上看到的,所以很多还不是十分了解,我写这些的目的仅仅是想让自己能更好的去记住这些指令的作用和用法,同事也希望和我一样刚入门的朋友能够多了解一些,并没有其他目的,所有的示例也并没有经过实际的代码测试,所以希望各位朋友,不管你喜欢不喜欢,反对不反对,请文明发言,谢谢!------------------------------------------------数据传送指令开始-------------------------------------------------------1、MOV(传送)指令写法:MOV target,source功能描述:将源操作数source的值复制到target中去,source值不变注意事项:1)target不能是CS(代码段寄存器),我的理解是代码段不可写,只可读,所以相应这地方也不能对CS执行复制操作。
汇编语言x86汇编指令集大全
汇编语言x86汇编指令集大全汇编语言是计算机体系结构学科中的重要内容之一,它可以直接操作计算机硬件,实现对机器指令的精确控制。
而x86汇编则是汇编语言中最常用的一种,它广泛应用于各类个人电脑和服务器等计算设备中。
x86汇编指令集是汇编语言中的核心,掌握其基本指令对于开发高效的汇编程序至关重要。
本文将介绍x86汇编指令集的各个方面,包括数据传输指令、算术运算指令、逻辑运算指令、分支控制指令以及其他常用指令等内容,以帮助读者全面理解和掌握x86汇编语言。
一、数据传输指令数据传输指令是汇编语言中最基本的指令之一,用于实现数据在寄存器、内存和I/O端口之间的传递。
常见的数据传输指令包括MOV、XCHG、PUSH和POP等。
MOV指令用于将数据从一个位置传送到另一个位置,可以将数据从内存中传送到寄存器,也可以将数据从寄存器传送到内存。
例如,MOV AX, BX表示将寄存器BX中的数据传送到寄存器AX中。
XCHG指令用于交换两个操作数的值,例如,XCHG AX, BX表示交换寄存器AX和BX中的数据。
PUSH指令将数据推入堆栈,POP指令从堆栈中弹出数据。
这两个指令常用于函数调用和局部变量的保存与恢复。
二、算术运算指令算术运算指令用于执行各种数值计算操作,包括加法、减法、乘法、除法以及取模等。
常见的算术运算指令包括ADD、SUB、MUL、DIV和IMUL等。
ADD指令用于进行加法运算,可以将两个操作数相加,并将结果保存在目标操作数中。
例如,ADD AX, BX表示将寄存器BX中的值加到寄存器AX中。
SUB指令用于进行减法运算,可以将目标操作数减去源操作数,并将结果保存在目标操作数中。
MUL指令用于进行无符号数的乘法运算,可以将一个操作数与寄存器中的值相乘,并将结果保存在一对寄存器中。
DIV指令用于进行无符号数的除法运算,可以将寄存器中的值除以一个操作数,并将商保存在一个寄存器中,余数保存在另一个寄存器中。
IMUL指令用于进行有符号数的乘法运算,功能与MUL指令类似,但结果为有符号数。
第2章 80X86汇编语言与汇编程序(4)—串操作与程序控制指令
DI,200H CX,128 AX,AX STOSW
当然也可以用字节填充 可以使用重复前缀。 当寄存器AL、AX中的数不变 BBB: CLD LEA DI,0500H 时,使用重复前缀,则是对 某一RAM区域进行填充。 MOV CX,256 例如上电复位后,对某一块内 XOR AL,AL 存区域全部填充0 REP STOSB
GLUT_C 2013-08 25
④ 段间直接转移
格式: JMP FAR PTR dst 功能:用dst给出的段内偏移量代替IP,用dst的段地址代替 CS的内容,转移到新的CS: 偏移地址去执行下一条指令。 注意:在汇编语言程序设计中,dst通常使用符号地址。
例如:
MOV JMP AX, [SI] FAR PTR ABCD
GLUT_C
2013-08
8
例:比较1000:0e00H与1000:0400H连续8字节是否相等,只要有 一个不相同的字节,则设置AL=0A5H表示两个字符串不想等,否 则赋值AL=00H。
CMP_S: MOV MOV MOV MOV MOV CLD MOV REPZ JNZ MOV JMP DONE: MOV CMP_END: RET
8086指令系统(续)
GLUT_C
2013-08
1
2.3.5
串操作指令
串操作指令在教材P.128 字符串传送指令 字符串比较指令 字符串检索指令 取字符串指令 存字符串指令
GLUT_C
2013-08
2
1.字符串传送指令 字符串传送指令MOVSB/MOVSW 格式: MOVSB ;用于字节传送 MOVSW ;用于字传送。 特点: ( 1 ) MOVSB 、 MOVSW 指令,源数据串的默认段 基址 DS ,有效地址为 SI ,目的串段基址 ES ,有效 地址DI。 (2)指令前面常加重复前缀REP,重复执行n次。 (3)重复执行次数 由CX指定 (4)每次传送,DI,SI自动修改(字节传送±1,字 传送±2),加减由方向控制为DF确定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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位的多操作数乘法。