80X86 汇编指令符号大全
80x86指令集
通用寄存器 16 位累加器 AX 的低 8 位 AX 的高 8 位 基址寄存器 16 位计数器 8 位计数器 16 位数据寄存器 堆栈指针 基址指针 源变址寄存器 目的变址寄存器 段寄存器 指定代码段 指定堆栈段 均可指定当前数据段 数据传送指令 数据传送指令 入栈指令 出栈指令 交换指令 换码指令 输入指令 输出指令 有效地址传送指令 地址指针传送指令
逻辑运算指令 非运算 与运算 或运算 异或运算 测试指令 移位运算指令 SAL/SHL 算术左移/逻辑左移 SAR/SHR 算术右移/逻辑右移 ROL/ROR 左循环移位/右循环移位 RCL/RCR 带进位的 左/右 循环移位 程序控制指令 JMP 无条件转移指令 CALL 无条件调用指令 RET 无条件返回指令 JC CF=1 (有进位 / 借位)时转移 JNC CF=0 (无进位 / 借位)时转移 JE / JZ ZF=1 (等于零/ 相等)时转移 JNE / JNZ ZF=0 (不等于零 /不相等)时转移 JS SF=1 符号位为1(负数)时转移 JNS SF=0 符号位为0(正数)时转移 JO OF=1 有溢出时转移 JNO OF=0 无溢出时转移 JP / JPE PF=1 奇偶位为1 / 偶时转移 JNP / JPO PF=0 奇偶位为0 / 奇时转移 以下四种用于无符号数的条件转移 JA / JNBE 高于 / 不等于且 CF=0且ZF=0 不低于时转移 JAE / JNB 高于等于 / 不低于 CF=0或ZF=1 时转移 JB / JNAE 低于 / 不高于且不等于 CF=1且ZF=0 时转移 JBE / JNA 低于等于 / 不高于 CF=1或ZF=1 时转移 以下四种用于有符号数的条件转移 (SF)XOR(OF)=0且 JG / JNLE ZF=0 (SF)XOR(OF)=0或 JGE / JNL ZF=1 (SF)XOR(OF)=1且 JL / JNGE ZF=0 (SF)XOR(OF)=1或 JLE / JNG ZF=0 LOOP 循环指令 LOOPZ(或LOOPE)ZF=1循环至目标操作数 LOOPZ(或LOOPE)ZF=0循环至目标操作数 JCXZ 若CX=0则此指令控制转移列目标操作数 启动由类型码n所规定的中断 INT n 服务程序 INTO 溢出中断 IRET 中断返回
第二章80X86指令系统1.
例 MOV AX, COUNT[SI](也可表示为 MOV AX, [COUNT+SI]) 其中COUNT为16位位移量的符号地址。 如果 (DS)= 3000H,(SI)= 2000H,COUNT = 3000H 则物理地址 = 30000H + 2000H + 3000H = 35000H 指令执行情况如图所示,最后的执行结果是(AX) = 1234H。
则物理地址 = 30000H + 2000H + 1000H + 0250H = 33250H 指令执行情况如图所示,最后的执行结果是( AX) = 1234H。
8086的指令系统
汇编语言的指令系统是程序设计的 基础,这里主要介绍8086的指令系统。 8086指令系统分为以下6组: ⒈ 数据传送指令 ⒉ 算术指令 ⒊ 逻辑指令 ⒋ 串处理指令 ⒌ 控制转移指令 ⒍ 处理机控制指令
例 MOV AX, [BX][DI] (或写为 MOV AX, [BX+DI])如 (DS ) = 2100H,(BX)= 0158H,(DI)= 10A5H 则 EA = 0158H +10A5H = 11FDH
物理地址 = 21000H +11FDH = 221FDH 指令执行情况如图所示,最后的执行结果是 (AX)= 1234H。
2 存器寻址方式(Register addressing) 它使用寄存器来存放要处理的操作数, 寄存器号由指令指定。 对于16位操作数,寄存器可以是AX、 BX、CX、DX、SI、DI、SP、BP、CS、 DS、ES和SS;对于8位操作数,寄存器可 以是AL、AH、BL、BH、CL、CH、DL、 DH。由于操作数就在寄存器中,指令执行 时不需要访问存储器,因此这是一种快速 的寻址方式。
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汇编语言指令集
80X86汇编语⾔指令集8086/8088汇编语⾔指令集数据传送指令集MOV功能: 把源操作数送给⽬的操作数语法: MOV ⽬的操作数,源操作数格式: MOV r1,r2MOV r,mMOV m,rMOV r,dataXCHG功能: 交换两个操作数的数据语法: XCHG格式: XCHG r1,r2 XCHG m,r XCHG r,mPUSH,POP功能: 把操作数压⼊或取出堆栈语法: PUSH 操作数 POP 操作数格式: PUSH r PUSH M PUSH data POP r POP mPUSHF,POPF,PUSHA,POPA功能: 堆栈指令群格式: PUSHF POPF PUSHA POPALEA,LDS,LES功能: 取地址⾄寄存器语法: LEA r,m LDS r,m LES r,mXLAT(XLATB)功能: 查表指令语法: XLAT XLAT m算数运算指令ADD,ADC功能: 加法指令语法: ADD OP1,OP2 ADC OP1,OP2格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data影响标志: C,P,A,Z,S,OSUB,SBB功能:减法指令语法: SUB OP1,OP2 SBB OP1,OP2格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data影响标志: C,P,A,Z,S,OINC,DEC功能: 把OP的值加⼀或减⼀语法: INC OP DEC OP格式: INC r/m DEC r/m影响标志: P,A,Z,S,ONEG功能: 将OP的符号反相(取⼆进制补码)语法: NEG OP格式: NEG r/m影响标志: C,P,A,Z,S,OMUL,IMUL功能: 乘法指令语法: MUL OP IMUL OP格式: MUL r/m IMUL r/m影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志)DIV,IDIV功能:除法指令语法: DIV OP IDIV OP格式: DIV r/m IDIV r/mCBW,CWD功能: 有符号数扩展指令语法: CBW CWDAAA,AAS,AAM,AAD功能: ⾮压BCD码运算调整指令语法: AAA AAS AAM AAD影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD)DAA,DAS功能: 压缩BCD码调整指令语法: DAA DAS影响标志: C,P,A,Z,S位运算指令集AND,OR,XOR,NOT,TEST功能: 执⾏BIT与BIT之间的逻辑运算语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位SHR,SHL,SAR,SAL功能: 移位指令语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL影响标志: C,P,Z,S,OROR,ROL,RCR,RCL功能: 循环移位指令语法: ROR r/m,data/CL ROL r/m,data/CL RCR r/m,data/CL RCL r/m,data/CL影响标志: C,P,Z,S,O程序流程控制指令集CLC,STC,CMC功能: 设定进位标志语法: CLC STC CMC标志位: CCLD,STD功能: 设定⽅向标志语法: CLD STD标志位: DCLI,STI功能: 设定中断标志语法: CLI STI标志位: ICMP功能: ⽐较OP1与OP2的值语法: CMP r/m,r/m/data标志位: C,P,A,Z,OJMP功能: 跳往指定地址执⾏语法: JMP 地址JXX功能: 当特定条件成⽴则跳往指定地址执⾏语法: JXX 地址注:A: ABOVE,当C=0,Z=0时成⽴B: BELOW,当C=1时成⽴C: CARRY,当弁时成⽴ CXZ: CX寄存器的值为0(ZERO)时成⽴E: EQUAL,当Z=1时成⽴G: GREATER(⼤于),当Z=0且S=0时成⽴L: LESS(⼩于),当S不为零时成⽴N: NOT(相反条件),需和其它符号配合使⽤O: OVERFLOW,O=1时成⽴P: PARITY,P=1时成⽴PE: PARITY EVEN,P=1时成⽴PO: PARITY ODD,P=0时成⽴S: SIGN,S=1时成⽴Z: ZERO,Z=1时成⽴LOOP功能: 循环指令集语法: LOOP 地址LOOPE(Z)地址 LOOPNE(Z) 地址标志位: ⽆CALL,RET功能: ⼦程序调⽤,返回指令语法: CALL 地址 RET RET n标志位: ⽆INT,IRET功能: 中断调⽤及返回指令语法: INT n IRET标志位: 在执⾏INT时,CPU会⾃动将标志寄存器的值⼊栈,在执⾏IRET时则会将堆栈中的标志值弹回寄存器字符串操作指令集MOVSB,MOVSW,MOVSD功能: 字符串传送指令语法: MOVSB MOVSW MOVSD标志位: ⽆CMPSB,CMPSW,CMPSD功能: 字符串⽐较指令语法: CMPSB CMPSW CMPSD标志位: C,P,Z,S,OSCASB,SCASW功能: 字符串搜索指令语法: SCASB SCASW标志位: C,P,Z,S,OLODSB,LODSW,STOSB,STOSW功能: 字符串载⼊或存贮指令语法: LODSB LODSW STOSB STOSW标志位: ⽆REP,REPE,REPNE功能: 重复前缀指令集语法: REP 指令S REPE 指令S REPNE 指令S标志位: 依指令S⽽定EMC 汇编语⾔指令集符号解说:1.符号‘R’:代表⼀般⽤途寄存器中的其中⼀个。
80x86的指令系统
80x86的指令系统1.1.1数据传送指令:负责把数据、地址或立即数传送到寄存器或存储单元中。
1.通用数据传送指令(1).MOV——传送指令指令格式:MOV DST,SRC ;(DST)←(SRC)。
DST表示目的操作数, SRC表示源操作数说明:①.DST为除CS外的各寄存器寻址方式或任意存储器寻址方式。
SRC为任意数据寻址方式。
②.DST、SRC不能同时为存储器寻址方式,也不能同时为段寄存器寻址方式,而且在DST为段寄存器时,SRC不能为立即数。
③.MOV指令不影响标志位。
(2).MOVSX——带符号扩展传送指令(386及其后继机型可用)指令格式:MOVSX DST,SRC ;(DST)←符号扩展(SRC)说明:①.DST必须为16位或32位寄存器。
SRC为8位或16位的寄存器或存储单元的内容。
传送时把源操作数符号扩展送入目的寄存器。
②.MOVSX指令不影响标志位。
(3).MOVZX——带零扩展传送指令(386及其后继机型可用)指令格式:MOVZX DST,SRC ;(DST)←零扩展(SRC)说明:①.DST必须为16位或32位寄存器。
SRC为8位或16位的寄存器或存储单元的内容。
传送时把源操作数零扩展送入目的寄存器。
②.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)说明:①.堆栈:计算机开辟的以“后进先出”方式工作的存储区。
它必须存在于堆栈段中,只有一个出入口,所以只有一个堆栈指针SP或ESP。
SP或ESP的内容在任何时候都指向当前的栈顶。
②.8086中的SRC不能为立即数寻址方式。
286及其后继机型可用立即数寻址方式。
③.PUSH指令不影响标志位。
(5).POP——出栈指令指令格式:POP DST ;16位指令:(DST)←((SP)+1,(SP)) (SP)←(SP)+232位指令:(DST)←((ESP)+3, (ESP)+2, (ESP)+1, (ESP)) (ESP)←(ESP)+4说明:①.DST为除立即数及CS寄存器以外的任意数据寻址方式。
汇编符号大全.
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 提供段基址。
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指令系统
七、80x86指令系统(一)8086指令系统8086/8088指令系统是整个80x86系列微处理器的基础,按功能可以分为六种类型。
1.传送指令传送指令用于在存储单元、寄存器、输入/输出端口之间传送地址或数据。
①通用数据传送指令MOV指令:该指令可以将一个立即数传送到寄存器或存储单元中,也可以在寄存器与寄存器之间、寄存器与存储器之间传送字数据或字节数据。
例如:将一个立即数传送到寄存器中的指令MOV AL,05H;在两个寄存器之间传送字节数据的指令MOV AL,BL;在寄存器和存储器之间传送数据的指令MOV SI,[BX+5AH]。
XCHG指令:该指令可以将源操作数和目的操作数进行交换,但操作数可以是寄存器或存储单元,不能是段寄存器或立即数,也不能同时为两个存储器操作数。
PUSH指令:PUSH指令是对一个16位操作数执行进栈操作,这是在一个操作数和堆栈之间进行数据传送,而不是在两个操作数之间进行数据传送。
POP指令:POP指令是将一个16位操作数执行出栈操作,这也是在一个操作数和堆栈之间进行数据传送。
XLAT指令:该指令专门用于在AL寄存器与字节表中某一存储单元之间进行数据传送。
其中字节表的首地址存放在BX基址寄存器中,根据AL设置的偏移地址,可以将该单元的内容传送到AL累加寄存器中。
②输入/输出指令该指令专门用于在累加器和I/O端口之间进行数据传送操作。
输入/输出的工作原理:CPU使用AL或AX寄存器接收数据或发送数据,最多可提供64K个8位端口地址,或32K个16位端口地址。
当端口地址小于256时使用直接寻址来获得操作数,即在指令中直接指定端口地址;当端口地址超过256时使用间接寻址来获得操作数,即先将端口地址放到DX寄存器中,然后利用IN指令或OUT指令进行输入/输出操作。
例如:IN AX,28H是从I/O端口28H输入一个字到AX寄存器中;OUT 5,AL是从AL寄存器输出一个字节到I/O端口5中。
第三章80X86指令系统1(2)
特点:
• 可以进行8位、16位的无符号数和带符号数的加法运算;
• 源操作数和目标操作数不能同时为存储器, 不能为段寄存器; • 指令影响标志位的情况: OF=1,溢出 CF=1,溢出
其他条件标志(SF,AF,PF,ZF)根据定义设定。
5
例
MOV AL, 7EH MOV BL, 5BH ADD AL, BL
19
5、CMP(Compare) 比较指令
格式:CMP dest,src ; B/W dest - src
结果不送,置标志。
影响标志:A、C、O、P、S、Z。
src: 立即数,寄存器,存储器。 dest:寄存器,存储器。 例: CMP AL,0AH CMP CX, DI ;寄存器与立即数比较 ;寄存器与寄存器比较
18
4、NEG (Negate) 求补指令
格式: NEG dest ;B/W, dest ← 0 - dest dest : 寄存器 、存储器。 操作: 把操作数按位求反后末位+1。
影响标志:A、C、O、P、S、Z。
CF: 操作数为0时求补,CF=0 ; 否则总是CF=1. 否则OF=0.
OF: 对-128 或-32768求补,OF=1; 例: NEG AL ADD AL, 100
类型举例:
ADC CX, 300 ADC AL, BL ADC DX, COUNT[SI] ADC BLOCK[DI], BX ;寄存器+立即数+CF ;寄存器+寄存器+CF ;寄存器+存储器+CF ; 存储器 +寄存器+CF
7
用途举例: 计算两个多字节数相加 3B74AC60F8H + 20D59E36C1H=? 两个多字节数存放在: 开始 DATA1,DATA2的开始单元。
汇编指令表
80x86汇编指令表第一页助记符含义格式操作影响的标志MOV移动MOV D,S(S)→(D)无MOVSX 带符号扩展的移动MOVSX D,S(S)→(D) D的MSB被S的符号位填充无MOVZX 带零扩展的移动MOVZX D,S(S)→(D) D的MSB被0填充无XCHG 交换XCHG D,S(D)←(S)无XLAT转换XLAT Source-table((AL)+(BX)+(DS)0)→(AL)无XLATB转换XLATB((AL)+(BX)+(DS)0)→(AL)无LEA 存入有效地址LEA Reg16,EALEAReg32,EA(EA)→(Reg16)(EA)→(Reg32)无LDS 存入寄存器和DSLDS Reg16,EALDSReg32,EA(EA)→(Reg16)(EA+2)→(DS)(EA)→(Reg32)(EA+4)→(DS)无LSS 存入寄存器和SSLSS Reg16,EALSSReg32,EA(EA)→(Reg16)(EA+2)→(SS)(EA)→(Reg32)(EA+4)→(SS)无LES 存入寄存器和ESLES Reg16,EALESReg32,EA(EA)→(Reg16)(EA+2)→(ES)(EA)→(Reg32)(EA+4)→(ES)无LFS 存入寄存器和FSLFS Reg16,EALFSReg32,EA(EA)→(Reg16)(EA+2)→(FS)(EA)→(Reg32)(EA+4)→(FS)无LGS 存入寄存器和GSLGS Reg16,EALGSReg32,EA(EA)→(Reg16)(EA+2)→(GS)(EA)→(Reg32)(EA+4)→(GS)无ADD加ADD D,S(S)+(D)→(D) 进位→(CF)OF,SF,ZF,AF,PF,CFADC带进位加ADC D,S (S)+(D)+(CF) →(D) 进位→(CF)OF,SF,ZF,AF,PF,CFINC增1INC D(D)+1(D)OF,SF,ZF,AF,PFDAA 加法的十进制调整DAASF,ZF,AF,PF,CF;OF未定义AAA加法的ASCII码调整AAAAF,CF; OF,SF,ZF,PF未定义SUB减SUB D,S(D)-(S)→(D) 借位→(CF)OF,SF,ZF,AF,PF,CF SBB带借位减SBB D,S(D)-(S)-(CF)→(D)OF,SF,ZF,AF,PF,CF DEC减1DEC D(D)-1→(D)OF,SF,ZF,AF,PF NEG取负NEG D0-(D)→(D) 1→(D)OF,SF,ZF,AF,PF,CFDAS 减法的十进制调整DASSF,ZF,AF,PF,CF; OF未定义AAS减法的ASCII码调整AASAF,CF; OF,SF,ZF,PF未定义MUL 乘(不带符号)MUL S(AL)・(S8)→(AX)(AX)・(S16)→(DX)・(AX)(EAX)・(S32)→(EDX)・(EAX)OF,CF;SF,ZF,AF,PF未定义第二页DIV 除(不带符号)DIV S(1)Q((AX)/(S8))→(AL) R((AX)/(S8))→(AH)(2)Q((DX,AX)/(S16))→(AX) R((DX,AX)/(S16))→(DX)(3) Q((EDX,EAX)/(S32))→(EAX)R((EDX,EAX)/(S32))→(EDX) 若(1)Q是FF16(2)Q是FFFF16 (3)Q是FFFFFFFF16 则发生0中断所有标志位未定义IMUL 整数乘(带符号)IMULS(AL)・(S8)→(AX)(AX)・(S16)→(DX)・(AX)(EAX)・(S32)→(EDX)・(EAX)OF,CF;SF,ZF,AF,PF未定义IMULR,I(R16)・(Imm8)→(R16)(R32)・(Imm8)→(R32)(R16)・(Imm16)→(R16)(R32)・(Imm32)→(R32)OF,CF;SF,ZF,AF,PF未定义IMULR,S,I(R16)・(Imm8)→(R16)(R32)・(Imm8)→(R32)(R16)・(Imm16)→(R16)(R32)・(Imm32)→(R32)OF,CF;SF,ZF,AF,PF未定义IMULR,S(R16)・(S16)→(R16)(R32)・(S32)→(R32)OF,CF;SF,ZF,AF,PF未定义IDIV 整数除(带符号)IDIVS(1)Q((AX)/(S8))→(AL) R((AX)/(S8))→(AH)(2)Q((DX,AX)/(S16))→(AX) R((DX,AX)/(S16))→(DX)(3) Q((EDX,EAX)/(S32))→(EAX)R((EDX,EAX)/(S32)) (EDX) 若Q是正且超过7FFFF16或Q是负且小于800116则发生0中断所有标志未定义AAM 乘后调整ALAAM Q((AL)/10)→(AH)R((AL)/10)→(AL)SF,ZF,PF;OF,AF,CF未定义AAD 除前调整AXAAD(AH)・10+(AL)→(AL)00→(AH)SF,ZF,PF;OF,AF,CF未定义CBW 字节变换成字CBW(AL的最高位)→(AH所有位)无CWDE 字变换成双字CWDE(AX的最高位)→(EAX高16位)无CWD 字变换成双字CWD(AX的最高位)→(DX所有位)无CDQ 双字变换成四字CDQ(EAX的最高位)→(EDX所有位)无AND 逻辑与ANDD,S(S)・(D)→(D)OF,SF,ZF,CF; AF未定义OR 逻辑或ORD,S(S)+(D)→(D)OF,SF,ZF,PF,CF; AF未定义XOR 逻辑异或XORD,S(S)㈩(D)→(D)OF,SF,ZF,PF,CF; AF未定义NOT 逻辑非NOT D(D)→(D)无第三页SAL/SHL 算术左移/逻辑左移SAL/SHLD,Count将(D)中数左移,其移位次数由计数(Count)指定,右边的空位用零填充,每次移出的最高位(MSB)进入CFSF,ZF,PF,CF;AF未定义若Count≠1,则OF未定义SHR 逻辑右移SHR D,Count将(D)中数右移,其移位次数由计数指定,左边的空位用零填充,每次移出的最低位(LSB)进入CFSF,ZF,PF,CF;AF未定义若Count≠1,则OF未定义SAR 算术右移SAR D,Count将(D)中数右移,其移位次数由计数指定,左边的空位用最高位填充,每次移出的最低位进入CFSF,ZF,PF,CF;AF未定义若Count≠1,则OF未定义SHLD 双精度左移SHLDD1,D2,Count(D1)中数左移,移位次数等于Count值,(D2)中数提供给D1,每次从D2的最高位移入D1的最低位。
汇编指令索引
学习汇编语言,最关键的就在于汇编指令集的掌握以及计算机工作方式的理解,以下是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执行复制操作。
80x86汇编指令表
80x86汇编指令表一、数据传输指令───────────────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.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 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器)输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时,其范围是0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器.PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令───────────────────────────────────────ADD 加法.ADC 带进位加法.INC 加1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减1.NEC 求反(以0 减之).CMP 比较.(两**作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令───────────────────────────────────────AND 与运算.OR 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两**作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用**作码. 如SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如MOV CL,04SHL AX,CL四、串指令───────────────────────────────────────DS:SI 源串段寄存器:源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志0表示重复**作中SI和DI应自动增量; 1表示应自动减量.Z标志用来控制扫描或比较**作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令───────────────────────────────────────1>无条件转移指令(长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回.2>条件转移指令(短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不小于或不等于时转移.JAE/JNB 大于或等于转移.JB/JNAE 小于转移.JBE/JNA 小于或等于转移.以上四条,测试无符号整数运算的结果(标志C和Z).JG/JNLE 大于转移.JGE/JNL 大于或等于转移.JL/JNGE 小于转移.JLE/JNG 小于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC 无进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为"0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为"1" 时转移.3>循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.ESC 转换到外处理器.LOCK 封锁总线.NOP 空**作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置方向标志位.CLD 清方向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令───────────────────────────────────────DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.。
80X86汇编语言程序设计第二章⑤.80868088指令.
80X86汇编语言程序设计第二章 8086/8088寻址方式和指令系统(二加减运算指令1. 加法指令 ADD格式:ADD OPRD1,OPRD2执行的操作:(OPRD1 ← (OPRD1 +(OPRD2例如 :MOV AX,7896H ; (AX =7896H即(AH =78H (AL =96H ; 各标志位保持不变ADD AL,AH ;AL=AL+AH=96H+78H(=10EH=0EH 前面的 1给了进位标志CF 。
即(AH =78H (AX =780EHCF=1PF=0AF=0ZF=0SF=0OF=0例如 :ADD DX,0F0F0H执行前(DX =4652H执行后(DX =4652H+F0F0H(=13742H=3742H 前面的 1给了进位标志 CF 。
ZF=0 SF=0 CF=1 OF=0这里 4的二进制码是 0100, F 是 1111, 一个正数一个负数相加肯定 OF 是 0。
例如 :ADD AX,4321执行前(AX =62A0H执行后(AX =62A0+4321=A5C1H 这里要注意, A 的二进制数是 1010,最高有效位为 1, 所以 SF 为 1。
两个正数相加,结果为负的就溢出;两个负数相加,结果为正的就溢出。
SF=1 ZF=0 CF=0 OF=1这里 6的二进制码是 0110,而 4的二进制码是 0100,两个正数相加,结果 A 为1010为负,所以 OF 为 1。
从上面例子可看出:加法指令影响标志位。
OF 位根据操作数的符号及其变化情况来设置:若两个操作数的符号相同而结果的符号与之相反时 OF=1,否则 OF=0。
CF 位可以用来表示无符号数的溢出。
由于无符号数的最高有效位只有数值意义而无符号意义, 所以从该位产生的进位应该是结果的实际进位值,但在有限数的范围内就说明了结果。
2. 带进位加指令 ADC (Add with Carry格式:ADC OPRD1,OPRD2执行的操作:(OPRD1 ← (OPRD1 +(OPRD2 +(CF例如 :下列指令序列执行两个双精度(32位的加法。
80x86汇编指令详解
80x86汇编指令详解(上)2008年01月15日星期二 15:0580x86指令系统,指令按功能可分为以下七个部分。
(1) 数据传送指令。
(2) 算术运算指令。
(3) 逻辑运算指令。
(4) 串操作指令。
(5) 控制转移指令。
(6) 处理器控制指令。
(7) 保护方式指令。
3.3.1数据传送指令数据传送指令包括:通用数据传送指令、地址传送指令、标志寄存器传送指令、符号扩展指令、扩展传送指令等。
一、通用数据传送指令1 传送指令传送指令是使用最频繁的指令,格式:MOV DEST,SRC功能:把一个字节,字或双字从源操作数SRC传送至目的操作数DEST。
传送指令允许的数据流方向见图3 11。
图 3.11 传送指令数据流由上图可知,数据允许流动方向为:通用寄存器之间、通用寄存器和存储器之间、通用寄存器和段寄存器之间、段寄存器和存储器之间,另外还允许立即数传送至通用寄存器或存储器。
但在上述传送过程中,段寄存器CS的值不能用传送指令改变。
例 3.12CPU内部寄存器之间的数据传送。
MOV AL,DH ;AL←DH(8位)MOV DS,AX ;DS←AX(16位)MOV EAX,ESI ;EAX←ESI(32位)例 3.13CPU内部寄存器和存储器之间的数据传送。
MOV [BX],AX ;间接寻址(16位)MOV EAX,[EBX+ESI] ;基址变址寻址(32位)MOV AL,BLOCK ;BLOCK为变量名,直接寻址(8位)例 3.14立即数送通用寄存器、存储器。
MOV EAX,12345678H ;EAX←12345678H(32位)MOV [BX],12H ;间接寻址(8位)MOV AX,1234H;AX←1234H(16位)使用该指令应注意以下问题:·源和目的操作数不允许同时为存储器操作数;·源和目的操作数数据类型必须一致;·源和目的操作数不允许同时为段寄存器;·目的操作数不允许为CS和立即数;·当源操作数为立即数时,目的操作数不允许为段寄存器;·传送操作不影响标志位。
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执行复制操作。
80X86汇编指令符号大全
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提供段基址。
汇编指令表
用 dst 减去 src,根据相减情况设置各条件标志位 x - - - x x x x x
无符号乘法:AL 乘以字节操作数 src,乘积送到 AX 中;或 AX 乘以字操作数 src,乘积送到(DX,AX)中 带符号乘法:AL 乘以字节型操作数 src,乘积送到 AX 中;或 AX 乘以字型操作数 src,乘积送到 (DX,AX)中
POP
POP dst
出栈一个字数据,送到操作数 dst 确定的位置
---------
XCHG
XLAT LEA
数据 传送
PUSHF
XCHG XLAT LEA dst, src PUSHF
把 dst、src 两个操作数中的内容互换
---------
以 BX+AL 的和作为偏移地址,从数据段相应位置取 出一个字节数据送 AL 寄存器 取操作数 src 在内存的偏移地址,送到 dst 确定的位 置
移 结果送回 dst,最后移出的一位送 CF
位
·417·
·418·
微机原理及接口技术
助记符 ROR
RCL
RCR
MOVS STOS LODS
CMPS
SCAS REP REPZ REPE REPNZ REPNE JMP
类别
循 环 移 位
串 操 作
(续)
指令格式
操作
ODITSZAPC
把 dst 的各个二进制位向右移动 src 位,从
CMPSB 或 CMPSW
所指数据相减,结果设置条件标志位,并 根据 DF 标志位调整 SI 和 DI,使其指向下 一数据
x---xxxxx
AL/AX 减去 ES 段 DI 所指向的数据,结果 SCASB 或
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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提供段基址。
2.教材符号,表示其中的内容可省略。
.LIST∶ 伪指令。
用于打开列表文件输出。
.RADIX∶伪指令。
把缺省的基数改为2-16范围内的任意基数。
.RADIX不影响DD、DQ、DT伪指令,在这些伪指令中,输入的数值只要没有加上数据类型就认为是十进制数。
.XLIST∶伪指令。
用于关闭列表文件输出。
%OUT∶伪指令。
在汇编时显示其后的信息。
AAA∶ 指令助记符——加法运算后的ASCII调整(非压缩的BCD码)。
无操作数,调整的加法结果在AL中。
AF和CF的状态改变说明结果大于9。
检查AL的低四位是否为合法的BCD码(0-9),如果合法就清除AL的高四位以及AF和CF标志。
当AL的低四位表示的数大于 9或AF=1时, 将AL加 6,AH加1 ,并使AF 和CF置位,清除AL中的高四位。
任何一个A—F之间的数加上6 以后,都会使AL低 4位产生0-9之间的数,从而达到调整的目的。
AAD∶ 指令助记符——除法的ASCII调整(非压缩的BCD码)。
在执行除法操作前,必须利用 AAD指令将非压缩型 BCD码表示的数转换成二进制数送AL。
步骤是,先将被除数的高位数(AH中的内容)乘以10,然后加到AL的低位数中,接着将AH清零。
AAM∶ 指令助记符——乘法的ASCII调整(非压缩的BCD码)。
用于将字节乘法的积转换成两个合法的十进制非压缩码。
AAM不带操作数,假定成绩在AH和AL中,并将调整后的非压缩码送回AH和AL。
为了保证 AAM 得到正确的结果,原乘数和被乘数必须是合法的非压缩码。
指令执行时,AAM 用10(0AH) 除AL寄存器,并将除得的商和余数分别送AH和AL寄存器,实现转换。
AAS∶ 指令助记符——减法运算后的ASCII调整(非压缩的BCD码)。
检查AL的低四位是否为合法的BCD 码(0-9),如果合法就清除AL的高四位以及AF和CF标志。
当AL的低四位表示的数大于 9或AF=1时, 将AL减 6,AH减1 ,并使AF和CF置1,清除AL中的高四位。
ADC∶ 指令助记符——带进位加法(把CF的值加上)。
用于多字节数的高字节加法运算。
ADD∶ 指令助记符——加法。
参与运算的二操作数应该同时带符号或不带符号 ,并且长度一致。
操作数可以是寄存器、存储器或立即数,但不能同时为存储单元或段寄存器,立即数也不能作为目的操作数。
AF∶ Auxiliary Carry Flag,辅助进位标志,在标志寄存器的第4字节。
记录运算时第 3位(半个字节)产生的进位值(置1)。
该标志用于对BCD码的加减运算中。
AND∶逻辑运算符(在语句的操作数部分,汇编时完成)或逻辑操作指令助记符(在语句的操作码部分,其运算在执行指令时完成)——按位与。
只有相“与”的两位全为1 ,结果才为1。
某数自己与自己相“与”,操作数不变,进位标志CF清0 。
ASSUME∶段定义伪指令——设定分段寄存器,格式为"ASSUME 段寄存器:段名[,段寄存器名:段名]"。
在代码段的开始用来指出所有段与段寄存器的关系,确定某个段分配给哪个段寄存器。
ASSUME只指出各段寄存器的分配,并没有把段地址装入相应的段寄存器。
为此,在代码段中,还必须把数据段和附加数据段的段地址装入相应的寄存器中。
AT∶伪指令——段定义(组合类型)。
该段按绝对地址定位,段基址为数值表达式的值,位移量为0 。
不能指定代码段。
AX∶ Accumulator,通用寄存器,算术运算的主要寄存器。
另外,所有的I/O指令都使用这一寄存器与外部设备传送信息。
其中AH是高8位,AL是低8位。
B∶ 数据类型后缀,表示二进制常量。
BP∶Base Pointer, 基址指针寄存器。
可以与SS寄存器联用来确定堆栈中任一存储单元的地址。
它指示堆栈中任一单元的偏移量。
非堆栈进出指令要访问堆栈,只能通过BP进行。
BX∶Base,通用寄存器。
在计算存储器地址时,经常用作基址寄存器。
其中BH是高 8位,BL是低 8位。
BYTE∶伪指令——段定义(定位类型)。
本段起始单元可以从任一地址开始,段间不留空隙,存储器利用率最高。
CALL∶指令助记符——程序调用。
一、段内直接调用:格式为" CALL 过程名"。
先把IP内容(子程序的返回地址,即CALL下一条指令的地址)压入堆栈,然后IP转移到子程序的入口地址。
二、段内间接调用:格式为" CALL WORD PTR OPD"。
先把IP的内容压入堆栈,然后IP指向(转到)由寻址方式决定的EA。
三、段间直接调用。
格式为"CALL FAR PTR 过程名"。
先把CS和IP的内容压入堆栈,然后在CS中装入新的段地址,IP指向段内偏移地址。
四、段间间接调用:格式为"CALL DWORD PTR OPD"。
先把CS和IP的内容压入堆栈,然后把寻址方式确定的有效地址所指定的一个字储存单元的内容送入IP,下一个字存储单元的内容(段首址)送入CS。
CBW∶指令助记符——字节转换为字。
把AL中字节的符号扩展到AH中,若(AL)的最高有效位为0 ,则(AH)=00;若(AH)的最高有效位为1, 则(AH)=0FFH。
CF∶Carry Flag,进位标志,在标志寄存器的第0字节 ,记录运算时从最高有效位产生的进位值(置1)。
作加法时,CF位可以用来表示无符号数的溢出(有符号数溢出用OF表示)。
CLC∶ 指令助记符——标志(进位)设置。
设置CF=0。
CLD∶ 指令助记符——清方向标志。
使DF=0 。
这样,当执行字节串操作指令时,地址自动增1 ;当执行字串操作指令时,地址自动增2 。
CLI∶ 指令助记符——中断允许标志设置。
设置IF=0 。
CMC∶ 指令助记符——标志(进位)设置。
CF取反。
CMP∶ 指令助记符——比较。
对于“ CMP AX,BX” ,如果是两个无符号数比 较(减),若结果没有产生借位,即CF=0, 则(AX)≥(BX);若CF= 1,则(AX)〈(BX)。
如果是两个带符号数比较,则 当没有溢出(OF=0)时,若SF=0,则(AX)〉(BX) 若SF=1,则(AX)〈(BX) 当产生溢出(OF=1)时,若SF=0,则(AX)〈(BX) 多SF=1,则(AX)〉(BX) 简炼的结论,若 OF 异或 SF=0,则(AX)〉(BX) 若 OF 异或 SF=1,则(AX)〈(BX)CMPS∶指令助记符——串比较。
通常用CMPSB或CMPSW。
CMPSB∶ 指令助记符——串比较。
将DS段SI指出的字节数据减去ES段DI指出的字节数据(不保存结果),然后根据相减结果设置标志位(两个数据相等,则ZF=1)。
并由方向标志DF修改SI 和DI中的地址,即当DF=0时,地址都加1; 当DF=1时, 地址都减1 。
CMPSW∶ 指令助记符——串比较。
将DS段SI指出的字数据减去ES段DI指出的字数据(不保存结果),然后根据相减结果设置标志位(两个数据相等,则ZF=1)。
并由方向标志DF修改SI 和DI中的地址,即当DF=0时,地址都加2; 当DF=1时, 地址都减2 。
COMMON∶伪指令——段定义(组合类型)。
该段与其它模块中所有也说明为COMMON的同名,同'类别'段共享相同的存储区域,即这些段的起始地址都相同,共享的公共存储区域的长度是各模块同名段中最大的长度。
使用COMMON方式可以使不同模块中的不同变量或标号作用于相同的存储单元。
CS∶Code Segment,代码段寄存器,存放当前运行的代码段起始地址(高16位)。
代码段存放当前正在运行的程序。
CWD∶ 指令助记符——字转换为双字。
把AX中字节的符号扩展到DX中,若(AX)的最高有效位为0 ,则(DX)=0000;若(AX)的最高有效位为1, 则(DX)=0FFFFH。
CX∶Count, 通用寄存器。
在循环和串处理指令中用作隐含的计数器。
其中CH是高 8位,CL是低 8位。
DAA∶ 指令助记符——加法的十进制调整(压缩的BCD码)。
无操作数,调整 的加法结果在AL中。
调整方法是,如果AL的低 4位大于9 或AF=1 ,则加 6 到AL并置AF=1 ;如果AL的高 4位大于 9或CF =1 ,则加60H 到AL,并 置CF=1 。
DAS∶ 指令助记符——减法的十进制调整(压缩的BCD码)。
调整方法是,若AF=1 或AL的低4位为A —F,则(AL)减06H,且AF置 1;若CF=1 或AL的高 4位为A—F,则(AL)减60H,且CF置1。
DB∶ 伪指令——定义字节。
其后的每个操作数占用一个字节。
若是字符串, 必须用引号' '括起来,字符串不能超过 255个字符,字符串自左至右以 字符的ASCII码按地址递增的顺序依次存放。