汇编语言常用指令
分析单片机中汇编语言汇编错误的原因目前汇编语言指令格式有两种不同的标准:Windows下的汇编语言基本遵循Intel风格的语法,如MASM和NASM,Unix/Linux下的汇编语言基本基于基本上遵循 AT&T 风格语法; 1、汇编语言指令的一般格式 [名称[:]]指令代码[第一个操作数][,第二个操作数]注释汇编语言指令代码的操作数数量 数量可以是0、1或2; 当操作数为 2 时,指令继续有两种不同的格式: Windows 中 Intel 风格的汇编语言指令的格式为: [name[:]] 指令代码 目的操作数 DST,源操作数 SRC 注意格式Unix/Linux 下 AT&T 风格的汇编语言指令为: [ name[: ]] 指令码 源操作数 SRC,目标操作数 DST 注释为: CYCLE:ADDAX,02H (AX) 汇编语言指令格式中的“名称”并不是所有指令都需要的,但如果指令中含有“名称”,那么,大多数情况下,“名称”指的是内存中某个存储单元的地址,即为,“name”之后的元素在内存中存储的第一个存储单元的地址(包括段地址和“name”地址偏移所在段的段地址); 例如,上一条指令中,CYCLE是指令名称,CYCLE代表后面的机器指令代码存放的首地址; “名称”与语句代码之间的分隔符可以是冒号“:”,如果用冒号分隔,则可以是空格“”时,名称代表一个标签; 如果用空格分隔,则名称代表表格,可以是标签,也可以是变量; 当指令代码有多个操作数时,相邻的两个操作数之间必须用逗号“,”分隔; 指令代码和操作数必须用空格分隔,并以分号“;”开头。二、组成句子的元素 1、常为数字:汇编语言中的常量包括整数和字符串; 二进制、八进制、十进制和十六进制; 汇编语言使用几个后缀来区分: B:二进制数; O:十进制数; 值后面没有后缀,默认值是十进制。
系统编号; 字符串常量是用一对单引号 ('') 括起来的字符串; 2、表达式:由操作数和算术运算符组成:+、-、*、/、MOD等; 模运算包括取两个数相除的余数; 逻辑运算运算符:AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)、XOR(异或) 注:逻辑运算符也可以是逻辑运算的指令码,仅当出现在逻辑运算的操作数部分时指令,即操作员); 操作员; 例如:ADDAL,0CHADD0F H; 第一个ADD是指令码,第二个ADD是关系运算的运算符:EQ(等于)、NE(不同)、LT(小于)、GT(大于)、LE(小于等于); )、GE(大于或等于); 汇编语言表达式不能只是语句,它可以是语句的组成部分; 注意:语句中表达式的求值并不是在语句执行时完成的,而是在源程序汇编和链接时完成的,因此,语句中每个表达式的值必须在汇编或编译时当场确定。
链接,即每个标识符的值in 表达式在汇编中确定或应在链接期间确定; 3、标签:标签是标识符所代表的指令的名称,用于指示对应指令的位置(地址); 标签有三个属性:段地址、偏移地址; 并输入; label 段地址和偏移地址属性是指label对应的指令段。
段地址和段内偏移地址; 标签有两种类型:NEAR 和 FAR 定义 NEAR 类型标签意味着该标签可以在段内使用,而定义为 FAR 类型意味着该标签可以使用; 段之间; 标签定义:在指令代码前添加标识符和冒号“:”;例如:在START:PUSHDS指令中,START是我们定义的标签,它代表PUSH指令的地址,因此, l 标签可以用作程序传输指令的操作数(即:要重定向的地址); 标签也可以是要定义的伪指令,例如:Define with LABEL伪语句和流程定义伪语句; 4.变量:和高级语言一样,并不是所有的操作数都是常量,汇编语言也有自己的变量并且变量的值可以在程序执行过程中改变 A.定义变量:在汇编语言中,变量的定义是被执行的通过伪指令; 定义变量的伪指令的格式如下: 变量名 DB 表达式 变量定义字节,也称为单字节变量(1 个连续字节),DB-->BYTE 变量名 DW 表达式 公式; 定义字变量,也称为双字节(2个连续字节)变量,DW-->WO 变量名 RD 表达式 DD; 定义一个双字变量,也称为四字节变量(4个连续字节),变量名DD-->DWORD DF表达式; 定义一个六字节变量,也称为六字节表达式; 变量字节(连续6个字节),DF-->FWORD变量名表达式 DQ定义长字变量并调用八字节变量(连续8个字节),DQ-->QWORD变量名DT表达式; 定义一个跨字节变量(连续10个字节),DT-->TBYTE包括,变量名是合法的标识符,变量名后面不能有冒号“:”,只能使用空格; 变量名不是强制的; 必填、可选; 变量的类型由关键字 DB、DW、DD、DQ 和 DT 定义; 变量定义语句中的“表达式”用于初始化变量。
有以下几种情况: (1) . 一个或多个常量或表达式; 当有多个常量或表达式时,使用逗号。
分离; 如DATA1--DATA4; (2)。
带单引号的字符串; 对于字节(DB)类型变量,每个变量的大小为1个字节,每个变量的值不能超过每个字节中一个字符的1个字符代码值,整个字符串可以用同一对单引号括起来,里面给出,这相当于定义了一个字符数组,比如DATA5; 对于字型(DW)变量,每个变量的大小为2个字节,每个变量的值不能超过2个字符,也遵循高位存储在高字节,低位存储在低位的规则。
如果是 1 个字符,则为低字节; 然后将字符的 ASCII 码值存储在低字节中,高字节为00,如双字(DD)类型变量的DATA6,每个变量的大小为4个字节,每个变量的值不能超过2个字符,如果是2个字符也遵循高位为0的规则高字节存储,低字节存储低位; 然而,2 个字符的值存储在双字变量的最低 2 个字节中,对于长字(DQ)类型变量,1 个字符的值存储在双字变量的最低字节中。
每个变量为 8 个字节。
每个变量的值不能超过2个字符。
如果是2个字符,也将存储在高位。
高字节和低字节规则存储在低字节中; 但 2 个字符的值存储在长字变量的低 2 个字节中,1 个字符的值存储在长字变量的低 1 个字节中。
。
以字节为单位; (3)。
一个问号“?” 表示变量的值是不确定的,即:变量所代表的内存单元的是不确定的,即当表达式为问号时,新的值不存储在对应的内存区域中变量,但只保留相应的存储空间如DATA7、DATA8(4)。
模式; 此时的格式为:重复次数DUP(表达式重复模式表示表达式); 该值可以在变量对应的内存区域中重复存储。
重复次数由伪指令给出,相当于定义一个数组,例如DATA9和DATA10定义变量:DATA1DB20H 1字节变量; 数据2DW0204H,1000H; DAT 2字节变量 A3DB(-1*3),(15/3);1字节变量 DATA4DD123456H;4字节变量 DATA5DB'0123';字符串变量,相当于字符数组 DATA6DW'AB','C ' ,'D'; 字符串变量,相当于一个word字符串数组; DATA7DB?; 1 字节变量,未初始化 DATA8DD?; 4字节变量,未初始化 DATA9DB5DUP(0); 1字节变量,初始化为5 0,相当于DB类型的元素为5 ArrayDATA10DW3DUP(? ); 2字节变量,未初始化,相当于一个DW类型的3个元素的数组变量定义指令中伪指令的作用是依次将表达式的值存储在从. 地址对应变量的名称,表达式中每个值占用的内存字节数对应变量的类型: a 变量的名称实际上代表了对应的内存区域的有效地址(偏移地址)到内存段中的变量; 高地址表示地址值比较大,低地址表示地址值比较小,高地址表示地址值比较小。
地址和低地址是相对的 5、变量的属性: (1). 属性: A. 段地址(SEG):变量所在段的地址 B. 偏移地址(OFFSET):变量所在段内的偏移地址; 变量类型定义每个变量。
对于 DB、DW、DD、DQ 和 DT 类型,定义了占用的标记字节数。
的变量占用的内存字节数分别为 1、2、4、8 和 10,通常是从 定义的变量。
DB、DW、DD 类型分别称为 BYTE 类型、WORD 类型和 DWORD 类型变量; 分别; 常用标识符 标识符值列表类型: 标识符类型 byte 变量 word 变量 double word 变量的值近NEAR标签和远FARTYPE标签为124-1-2D 长度(LENGTH):定义变量时,在包含DUP操作符的变量定义中,由变量名定义的变量个数,由变量定义的变量个数变量名以其他格式定义重复次数 在各种变量定义中,每个变量名定义的变量个数为1。
E. 大小(SIZE):在定义语句中 变量,分配给具有相同变量名及其值的所有变量的总字节数为; 变量类型和长度; 其中,段地址、偏移地址和类型属性是变量的主要属性。
长度和尺寸属性和属性是变量的辅助属性; (2)。
属性运算符:表示变量名或标签的运算符表达式 SEGSEG 提取变量名或标签所在段的地址 OFFSETOFFSET 变量名或标签提取变量名或标签所在段内的 TYP 偏移地址 ETYPE变量名或标签 获取变量名或标签的类型(变量占用的字节数) LENGTHLENGTH 变量名 获取变量的长度 SIZE 变量名 获取变量的大小 这些运算符本身不能构成语句,只能作为表达式和表格的组成部分 表达式求值也是在表达式求值过程中完成的组装过程; 6、强制类型转换运算符 PTR 格式:数据类型 PTR 地址表达格式中的“数据类型”可以是 BYTE、WORD、DWORD、NEAR、FAR 第一个; 3 第一种是变量类型,后两种是标准数字类型; 格式中的表达式可以是变量、标签或其他地址表达式; PTR运算符的作用是重新定义已定义的变量或标号的类型,其作用范围仅在当前语句内; 例如: DATA1DW02HMOVBYTEPTRDATA1,AL这条指令中将DATA1的类型转换为BYTE类型,因此AL中的存储在DATA1的最低字节中; 范围仅在此 MOV 语句中。
执行该指令后,DATA1 仍为 DW 类型。
即:DATA1的原始类型没有改变;
汇编语言指令的基本格式是什么
基本格式有以下几种: 1、标号,又称指令地址符号,是一个以字母开头、由六个字符组成的字母数字字符串。2、操作码由51单片机指定的助记符表示。
它命令CPU执行哪些操作。
3、操作数分为目的操作数和源操作数,用常用的符号和常量来表示。
4、注释是为了方便阅读而对指令的作用或功能的描述,不参与编译。
注释必须用分号分隔。
汇编语言指令大全
8086 汇编指令 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字节查找表转换。
2. 输入输出端口传输指令。
INI/O 端口输入。
OUTI/O端口输出。
3. 传输目的地址的命令。
LEA 加载有效地址。
LDS 传输目标指针并将指针加载到 DS 中。
LES传输目标指针并将指针加载到ES中。
LFS 传递目标指针并将指针加载到 FS 中。
LGS传输目标指针并将指针加载到GS中。
LSS 传输目标指针并将指针加载到SS 4. 符号传输指令。
传送LAHF标志寄存器,将标志加载到AH中。
SAHF 标志寄存器被传输,AH 被加载到标志寄存器中。
PUSHF 标志被压入堆栈。
POPF 标志从堆栈中弹出。
PUSHD32 位标志被压入堆栈。
POPD32 位标志从堆栈中弹出。
5.添加加法运算指令。
ADC 加上进位。
INC 加 1。
AAA 添加的 ASCII 代码调整。
DAA 添加的十进制调整。
SUB 减法。
SBB 提供信用扣除。
将 DEC 减少 1。
对 NEC 求反(从 0 减去)。
CMP 比较。
(两个操作数相减,仅改变标志位,不返回结果) AAS 减法的 ASCII 码适配。
DAS 减法的小数调整。
MUL 无符号乘法。
IMUL 整数乘法。
AAM 乘法的 ASCII 代码改编。
DIV 无符号除法。
IDIV 整数除法。
AAD 划分的 ASCII 代码改编。
CBW 字节转换为字。
CWD 字被转换为双字。
CWDE 字被转换为双字。
CDQ 双字扩展。
6.逻辑运算语句AND和运算。
或链接。
XOR 异或运算。
没有被否定。
测试测试。
(两个操作数进行与运算,仅改变标志位,不返回结果。
) SHL 逻辑左移。
SAL 算术左移。
(=SHL) SHR 逻辑右移。
SAR 算术右移。
(=SHR) ROL 左转。
ROR 向右转向。
RCR 直接通过进位进行循环。
RCR 通过进位左移。
上述八层指令的层数可达255层。
7. 字符串语句 DS:SI 源字符串段寄存器:源字符串索引。
ES:DI目标字符串段寄存器:目标字符串索引。
CX 重复计数器。
AL/AX 扫描值。
D-Flag 0表示重复操作时SI和DI应自动增加; 1 表示它们应该自动减少。
Z 标志用于指示一个程序的结束扫描或比较过程。
MOVS字符串传输。
CMPS 字符串比较。
SCAS 字符串扫描。
LODS 加载字符串。
STOS 保存字符串。
如果 CX/ECX>0,则重复 REP。
如果ZF=1或比较结果相同且CX/ECX>0,则重复REPE/REPZ。
如果 ZF=0 或比较结果不相等且 CX/ECX>0,则重复 REPNE/REPNZ。
当CF=1且CX/ECX>0时重复REPC。
当CF=0且CX/ECX>0时重复REPNC。
8. 程序传送指令 1>无条件传送指令(长传送) JMP 无条件传送指令 CALL 过程调用 RET/RETF 过程并返回。
2>条件跳转指令(短跳转,-128到+127距离内)如果JA/JNBE不小于或不等于则跳转。
JAE/JNB大于或等于传输。
JB/JNAE 小于转移。
JBE/JNA 小于或等于传输。
上述四个元素测试无符号整数运算(标志 C 和 Z)的结果。
JG/JNLE 比 Transfer 更大。
JGE/JNL 大于或等于透射率。
JL/JNGE 比 Transfer 小。
JLE/JNG小于或等于传输。
上述四个元素测试有符号整数运算的结果(标志S、O和Z)。
JE/JZ对应的是转接。
JNE/JNZ 并不是时间转移的同义词。
当有结转时,JC 会被转移。
当没有进位时,JNC 分支。
JNO如果没有溢出就会被传送。
如果 JNP/JPO 奇偶校验为奇数则转移。
如果 JNS 符号位为“0”则跳转。
JO溢出传输。
如果 JP/JPE 奇偶校验为偶数则转移。
如果 JS 符号位为“1”则跳转。
3> 如果 LOOPCX 不为零,则循环控制指令(短传送)将循环。
如果 LOOPE/LOOPZCX 不为零且标志 Z=1,则循环。
LOOPNE/LOOPNZCX 不为零且标志 Z=0cycle。
当 JCXZCX 为零时跳转。
如果 JECXZECX 为零则跳转。
4>中断指令 INT 中断指令 INTO 溢出中断 IRET 中断返回 5>处理器控制指令 HLT 处理器暂停,只有在发生中断或复位信号时才继续执行。
当芯片引脚TEST为高电平时,WAIT使CPU处于等待状态。
ESC 切换到外部处理器。
LOCK 阻塞总线。
不,没有操作。
STC 设置进位标志。
CLC 清除进位标志。
CMC 进位标志被反转。
STD 设置方向标志。
CLD 清除方向标志。
STI 设置中断允许位。
CLI 清除中断允许位。
6. 伪指令DW定义字(2字节)。
PROC 定义了过程。
ENDP进程结束。
SEGMENT 定义段。
ASSUME 设置段寄存器寻址。
ENDS 部分结束。
END 程序结束。