汇编语言指令的基本格式是啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言指令的基本格式是啥相关的知识,希望对你有一定的参考价值。
汇编语言的指令格式,目前有两种不同的标准:Windows下的汇编语言基本上都遵循Intel风格的语法,比如:MASM、NASM;而Unix/Linux下的汇编语言基本上都遵循AT&T风格的语法;一、汇编语言语句的通用格式
[名称[:]]
指令码
[第一操作数][,第二操作数]
;注释
汇编语言的指令码的操作数的个数可以是0、1、2个;当操作数的个数为2的时候,语句还有两种不同的格式:
Windows下Intel风格的汇编语言语句格式为:
[名称[:]]
指令码
目的操作数DST,源操作数SRC
;注释
Unix/Linux下AT&T风格的汇编语言语句格式为:
[名称[:]]
指令码
源操作数SRC,目的操作数DST
;注释
例如:
CYCLE:
ADD
AX,02H
;(AX)<-(AX)+02H
解释:
汇编语言语句格式中的"名称"并不是所有语句都必需的,但是,如果语句中带有"名称",那么,大多数情况下,"名称"都表示的是内存中某一存储单元的地址,也就是"名称"后面各项在内存中存放的第一个存储单元的地址(包括该"名称"所在段的段地址和段内偏移地址);比如上面的指令中,CYCLE就是该语句的名称,CYCLE表示的就是其后面的机器指令码在内存中存放的第一个地址;"名称"与指令码之间的分隔符可以是冒号":",也可以是空格字符"
";当以冒号分割时,该名称代表的是一个标号;当以空格分割时,该名称代表的可能是标号,也可能是变量;当指令码有多个操作数的时候,相邻两个操作数之间要用逗号","分割;指令码与操作数之间必须以空格分割;汇编语言语句的注释必须以分号";"开头; 参考技术A 汇编语言中anl指令是一个逻辑“与”运算的指令有两层意思:
1、对字节变量进行逻辑与。
格式为:anl
,
比如:anl
a,r0
anl
p1,#01h
2、对位变量进行逻辑与。
格式为:anl
c,
比如:anl
c,acc.0 参考技术B clc:清除CF位
格式:clc
cpl
A:将累加器A中内容取反(将A中内容按位取反,即逻辑非运算)后再送回累加器A中。
汇编程序基本指令集
指令概述
指令
指令是CPU操作的基本单位,每条指令执行一个特定的操作。可以理解为:指令通知CPU执行某种操作的“命令”。CPU全部指令的集合,称为指令集
指令分类
- 机器指令:二进制格式编码的序列(一串0,1代码书写)。
注意:硬件只能识别,存储,运行机器指令
- 符号指令:用字符串形式的序列(包含字符串形式的操作码以及操作数助记符)
汇编语言基本指令集
总说明(所有的指令都要遵守的)
- 对于双操作数指令(如:MOV,ADD,CMP…)
- 源,目操作数不可同为内存操作数
- 源,目操作数属性一致(长度相同)
- 当源操作数为立即数,目标操作数为非变量名直接寻址的内存操作数,则目标操作数必须用
PTR
说明类型
- 对于单操作指令(如:INC,DEC…)
- 若操作数为非变量名直接寻址的内存操作数,则必须使用PTR说明类型
常用伪指令
数据定义伪指令
DB
:字节定义伪指令
功能:将数据存放到计算机中的内存单元时,负数按照补码存放,单引号中的字符翻译成ASCII码
2. DW
:字定义伪指令
功能:通知汇编程序把DW后跟的双字节数,依次存入从变量名开始的单元,每一个数,占两个字节,存放时满足小端法规则,即:低字节->低地址单元,高字节->高地址单元。
3. DD
:双字定义伪指令
变量名 DD 一串用逗号间隔的4字节数
功能:将数据存放到计算机中的内存单元时,负数按照补码存放,单引号中的字符翻译成ASCII码
符号定义伪指令
EQU
:等值伪指令
NUM EQU 33
MOV AL,NUM ;该指令与下条指令等价
MOV AL,33
=
:等号伪指令
NUM = 33
功能:定义符号常数NUM的值为33
3.EQU和=区别
- 用EQU定义的符号常数,其值在后句语句中不能更改
- 用=定义的符号常数,其值在后继语句中可以重新定义
通用传送类指令
数据传送指令
(1) 数据传送指令:
MOV 目,源
功能:把源操作数赋值(传送)给目的操作数,源操作数不变
说明: 不能向段寄存器中写入立即数
CS不能做目标寄存器
注意:不能用一条指令实现以下传送:
1. 存储单元之间的传送
2. 立即数至段寄存器的传送(中间需要使用一个通用寄存器中转)
3. 段寄存器之间的传送
符号扩展/零扩展传送指令
(2) 符号扩展/零扩展传送指令
MOVSX 目标寄存器,源操作数
MOVZX 目标寄存器,源操作数
功能:把源操作数赋值(传送)给目的操作数,源操作数不变
说明: 1.源操作数不变
2.源操作数字长要小于或等于目标寄存器字长
3. MOVSX源操作数符号位向高位扩展,再送给目标
4. MOVZX源操作数高位补零,再送给目标
有效地址传送指令
(3) 有效地址传送指令
LEA 目标寄存器,源操作数
功能:计算内存单元的有效地址(不是其中的操作数)->目标
说明:有效地址就是偏移地址,LEA指令等效于OFFSET运算符
交换传送指令
(4) 交换传送指令
XCHG 第一操作数,第二操作数
功能:完成两个操作数互换
说明: 1. 段寄存器,立即数不能参加互换
2. 2个内存操作数不能互换,源,目的类型一致
堆栈操作类指令
堆栈的基本概念
堆栈————计算机中的堆栈是人为设置的一片连续内存区,用来存放数据,所存数据按先进后出规律存取
栈顶:栈区的低地址
栈底:栈区的高地址
- 堆栈寄存器SS:存放堆栈段段基址
- 堆栈指针(SP):存放栈顶单元的偏移地址
堆栈指针SP的初值决定了堆栈的大小,SP始终指向栈顶的顶部,及始终指向最后压入堆栈的信息所在的单元
数据进出栈
入栈PUSH
PUSH src;(先移后入)
一个字进栈,系统自动完成两步操作:SP←SP-2,(SP)←操作数;
一个双字进栈,系统自动完成两步操作:ESP←ESP-4,(ESP)←操作数。
出栈POP
POP dst;(先出后移)
弹出一个字,系统自动完成两步操作:操作数←(SP),SP←SP+2;
弹出一个双字,系统自动完成两步操作:操作数←(ESP),ESP←ESP+4。
注意:堆栈操作指令中的操作数类型必须是字操作数,即16位操作数
算数运算类指令
- 二进制加法
ADD
:不带进位加法指令
ADD 目标操作数(dst),源操作数(src) ;dst <- dst+src
功能:将目的操作数与源操作数相加,并将结果送给目的操作数
ADC
:带进位加法指令
ADC 目标操作数(dst),源操作数(src) ;dst <- dst+src+CF
功能:将目的操作数与源操作数相加,再加上进位标志CF的内容,然后将结果送给目的操作数
INC
:加一指令
INC 目标操作数(dst) ;dst <- dst+1
功能:将目的操作数加一,并将结果送回目的操作数。
- 二进制减法
1.SUB
:不带借位减法指令
SUB 目标操作数(dst),源操作数(src) ;dst <- dst-src;
功能:将目的操作数减源操作数,结果送回目的操作数。
2.SBB
:带借位减法指令
SBB 目标操作数(dst),源操作数(src) ;dst <- dst-src-CF;
功能:将目的操作数减源操作数,然后再减进位标志CF,并将结果送回目的操作数。
DEC
:减一指令
DEC 目标操作数(dst) ;dst <- dst-1
功能:将目的操作数减一,结果送回目的操作数。
- 求补指令
NEG
:求补指令
NEG 目标操作数(dst) ; dst <- 0-dst
功能:用0减去目的操作数,结果送回原来的目的操作数。
- 比较指令
CMP
:比较指令
CMP 目标操作数(dst),源操作数(src) ;dst-src
功能:将目的操作数减源操作数,但结果不送回目的操作数。
- 乘法指令
MUL
:无符号数乘法指令
MUL src ;(AX)<-(src)*(AL)
功能:将源操作数与默认的目的操作数(AX或AL)相乘,结果保存在AX或DX,AX中。
IMUL
:带符号数乘法指令
IMUL src ;
功能:将源操作数与默认的目的操作数(AX或AL)相乘,结果保存在AX或DX,AX中。
说明:运算结果只影响状态标志CF,OF;
- 除法指令
DIV
:无符号数除法指令
DIV src ;(AL)<-(AX)*(src) (商) (AH) <- 余数
功能:将两个无符号数做除法运算,商和余数分别保存在指定位置。
IDIV
:带符号数除法指令
IDIV src
功能:将两个带符号数做除法运算,商和余数分别保存在指定位置。
说明:当被除数位不够时,需要进行扩展。
- 字节扩展指令
CBW
功能:把AL中的带符号数扩展为16位字长(符号位扩展到AH中)。
- 字扩展指令
CWD
功能:将AX中的符号位扩展到DX中
转移类指令
- 按照转移条件分:无条件转移和有条件转移
有符号条件转移
循环控制转移
- 按照转移范围分:段内转移和段间转移
- 按照获取转移地址的方法分:直接转移和间接转移
调用类指令
子程序调用与返回指令
CALL <调用地址>
RET ;返回断点
子程序
:能完成一定功能的相对独立的程序段
调用
:调用子程序,即无条件转到子程序的第一条指令
返回
:返回断点,即返回到CALL
的后继指令
段内调用CALL指令
段内直接调用
:主程序和子程序待在同一代码段中
CALL 过程名
段内间接调用
CALL 寄存器操作数
CALL 内存操作数
子程序(汇编语言)的过程定义语句
过程名 PROC 属性
子程序实体
RET
过程名 ENDP
过程名
:子程序名,以字母开头,经汇编之后,过程名就是子程序的第一条指令
PROC/ENDP
:是子程序的定界语句
属性
: NEAR(或缺省)代表近过程,即该子程序和调用它的那条指令在同一个代码段。
FAR代表远过程,即该子程序和调用它的那条指令不在同一个代码段。
RET
:RET子程序返回指令
逻辑运算类指令
NOT
:取反
NOT 目的操作数(dst)
功能:实现操作数的按位取反运算,把取反的结果送给目标操作数
说明:NOT用于使所有位取反
AND
:与指令
AND 目的操作数(dst),源操作数(src)
功能:实现两个操作数的按位与运算,将两个操作数与之后的结果送给目标操作数
说明:AND通常用于使某些位置0,其他位不变的情况
OR
:或运算
OR 目的操作数(dst),源操作数(src)
功能:实现操作数的按位或运算,把或的结果送给目标操作数
说明:OR通常用于将某些位置1
XOR
:异或运算
XOR 目的操作数(dst),源操作数(src)
功能:实现操作数的按位异或运算,把异或的结果送给目标操作数
说明:XOR通常用于将某些位取反,某些位保持不变
TEST
:测试
TEST 目的操作数(dst),源操作数(src)
功能:实现两个操作数的按位与运算,结果不保存,只影响标志位
移位指令
开环移位指令
算数左移
SAL 操作数,移位次数
说明:操作数向左移位,最高位被挤入进位位中,用0来补充最低位
算数右移
SAR 操作数,移位次数
说明:操作数向右移位,最低位被挤入进位位中,用原来操作数的最高位来补充最高位
逻辑左移
SHL 操作数,移位次数
说明:操作数向左移位,最高位被挤入进位位中,用0来补充最低位
逻辑右移
SHR 操作数,移位次数
说明:操作数向右移位,最低位被挤入进位位中,用0来补充最高位
闭环移位指令
含进位的循环左移
RCL 操作数,移位次数
说明:操作数向左移位,最高位被挤入进位位中,用原来的进位位来补充最低位
含进位的循环右移
RCR 操作数,移位次数
说明:操作数向右移位,最低位被挤入进位位中,用原来进位位来补充最高位
不含进位的循环左移
ROL 操作数,移位次数
说明:操作数向左移位,最高位被挤入操作数的最低位,同时最高位进入进位位,用操作数的次高位补充最高位
不含进位的循环右移
ROR 操作数,移位次数
说明:操作数向右移位,最低位被挤入操作数的最高位,同时最低位进入进位位,用操作数的次低位补充最低位。
以上是关于汇编语言指令的基本格式是啥的主要内容,如果未能解决你的问题,请参考以下文章