寄存器、汇编命令详解
汇编语言寄存器和指令操作的整理
与DS联用, 指示数据段中某操作数的偏移量, 或与某一位移量共同构成操作数的偏移量. 串处理操作时, DI指示附加段中目的地址, 并有自动增量或减量的功能
段寄存器l CS 代码段
存放当前程序的指令代码
l DS 数据段
存放程序所涉及的源数据或结果
l SS 堆栈段
当运算结果的最高位为1时, SF为1, 否则为0. 最高位表示符号数的正和负
6. TF 跟踪标志位
用于调试程序时进入单步方式工作. TF=1时, 每条指令执行完后产生一个内部中断, 让用户检查指令运行后寄存器, 存储器和各标志位的内容. TF=0时, CPU工作正常, 不产生内部中断
7. IF 中断允许标志位
l POP DST ;出栈指令: 弹出栈顶元素, 后将栈顶指针向栈底方向移动一个字
l XCHG OPR1, OPR2 ;交换指令: 将这两个操作数交换
地址传送指令:
l LEA DST, SRC ;装载有效地址指令: 该指令将源操作数的偏移量OA装载到目的操作数中
算术运算指令加法指令:
l ADD DST, SRC ;DST+SRC的和存放到DST中去
l ADC DST, SRC ;带进位加法指令, DST+SRC+CF
l INC DST ;增1指令
减法指令:
l LOOPZ/LOOPE, LOOPNZ/LOOPNE ;前者用于找到第一个不为0的事件, 后者用于找到第一个为0的事件
子程序调用指令:
l imme: 立即数
l DST: 目的操作数
l SRC: 源操作数
l mem: 存储器操作数
汇编语言入门汇编指令及寄存器详解教程
汇编语⾔⼊门汇编指令及寄存器详解教程⽬录前⾔什么是汇编语⾔汇编语⾔产⽣的原因汇编与⼆进制的关系寄存器寄存器作⽤存取速度⽐较寄存器分类常⽤寄存器⽤途寄存器EAX、AX、AH、AL的关系汇编语⾔指令数据传送指令算术运算指令逻辑运算指令循环控制指令转移指令linux 和 windows 下汇编的区别总结前⾔我们⼤都是被⾼级语⾔惯坏了的⼀代,源源不断的新特性正在逐步添加到各类⾼级语⾔之中,汇编作为最接近机器指令的低级语⾔,已经很少被直接拿来写程序了,不过我还真的遇到了⼀个,那是之前的⼀个同事,因为在写代码时遇到了成员函数权限及可见性的问题,导致他⽆法正确调⽤想执⾏的函数,结果他就开始在C++代码⾥嵌⼊汇编了,绕过了种种限制终于如愿以偿,但是读代码的我们傻眼了…因为项⽬是跨平台的,代码推送的 Linux 上编译的时候他才发现,汇编代码的语法在 Linux 和 Windows 上居然是不⼀样的,结果他⼜⽤⼀个判断平台的宏定义“完美”的解决了,最终这些代码肯定是重写了啊,因为可读性太差了,最近在学习左值、右值、左引⽤和右引⽤的时候,总是有⼈⽤程序编译⽣成的中间汇编代码来解释问题,看得我迷迷糊糊,所以决定熟悉⼀下简单的汇编指令,边学习边记录,⽅便今后忘记了可以直接拿来复习。
什么是汇编语⾔汇编语⾔是最接近机器语⾔的编程语⾔,引⽤百科中的⼀段话解释为:汇编语⾔(assembly language)是⼀种⽤于电⼦计算机、微处理器、微控制器或其他可编程器件的低级语⾔,亦称为符号语⾔。
在汇编语⾔中,⽤助记符代替机器指令的操作码,⽤地址符号或标号代替指令或操作数的地址。
汇编语⾔⼜被称为第⼆代计算机语⾔。
汇编语⾔产⽣的原因对于绝⼤多数⼈来说,⼆进制程序是不可读的,当然有能⼈可以读,⽐如第⼀代程序员,但这类⼈快灭绝了,直接看⼆进制不容易看出来究竟做了什么事情,⽐如最简单的加法指令⼆进制表⽰为00000011,如果它混在⼀⼤串01字符串中就很难把它找出来,所以汇编语⾔主要就是为了解决⼆进制编码的可读性问题。
常用汇编指令
常用汇编指令汇编语言是一种低级机器语言的抽象表示,通过使用汇编指令可以编写出与硬件相关的程序。
在计算机科学领域中,汇编指令是非常重要的,是理解计算机底层原理和实现的关键。
本文将介绍一些常用的汇编指令,以帮助读者更好地理解和应用这些指令。
一、数据传输指令1. MOV指令:MOV指令用于将数据从一个位置复制到另一个位置。
例如,MOV AX, BX将寄存器BX的内容复制到AX中。
2. LEA指令:LEA指令用于将内存地址加载到寄存器中。
例如,LEA BX, [SI+10]将[S1+10]的内存地址加载到寄存器BX中。
3. PUSH指令:PUSH指令用于将数据压入栈中。
例如,PUSH AX将AX中的数据压入栈中。
4. POP指令:POP指令用于从栈中弹出数据。
例如,POP BX将栈中的数据弹出到BX中。
二、算术运算指令1. ADD指令:ADD指令用于将两个操作数相加,并将结果存储在目标操作数中。
例如,ADD AX, BX将BX的值加到AX中。
2. SUB指令:SUB指令用于将源操作数的值从目标操作数中减去,并将结果存储在目标操作数中。
例如,SUB AX, BX从AX中减去BX的值。
3. MUL指令:MUL指令用于将源操作数与累加器中的值相乘,并将结果存储在累加器中。
例如,MUL BX将累加器的值与BX相乘。
4. DIV指令:DIV指令用于将累加器的值除以源操作数,并将商存储在累加器中,余数存储在另一个寄存器中。
例如,DIV BX将累加器的值除以BX。
三、逻辑运算指令1. AND指令:AND指令用于对两个操作数进行逻辑与运算,并将结果存储在目标操作数中。
例如,AND AX, BX将AX与BX进行逻辑与操作。
2. OR指令:OR指令用于对两个操作数进行逻辑或运算,并将结果存储在目标操作数中。
例如,OR AX, BX将AX与BX进行逻辑或操作。
3. NOT指令:NOT指令用于对操作数进行逻辑非运算,并将结果存储在目标操作数中。
x86汇编指令详解x86汇编指令详解
x86汇编指令详解x86汇编指令详解指令包括三部分:数据传送指令、运算指令、跳转指令。
Intel寄存器包括:通用寄存器AX,BX,CX,DX;通用寄存器由分为8位、16位、32位,其中AL、AH是AX高、低8位寄存器,BL、BH是BX的高、低8位寄存器,CL、CH是CX的高、底8位寄存器,DL、DH是DX的高、低8位寄存器;段寄存器DS,ES,SS,CS,FS,GS;堆栈指针SP,程序计数器IP。
一、传送指令在存贮器和寄存器和输入输出端口之间传送数据。
1. 通用数据传送指令(R代表寄存器,M代表存储器,I代表立即数)MOV 第一操作数,第二操作数;功能:把第二操作数传给第一操作数,第一操作数必须是寄存器或存储单元,第二操作数可以是寄存器、存储器,也可以是立即数。
如:MOV AX,CX; CX——〉AXMOV BX,WORD;WORD——〉BXMOV AX, 10H;10H——〉AX第一操作数可以换成存储器,如word。
各种传送指令源操作数是寄存器MOV CH, ALMOV BP, SPMOV ECX, EBXMOV DS, AXMOV [BX], CH源操作数是存储单元MOV AL, [100H]MOV BX, ES:[DI]MOV EDX, [BX]MOV BX, VARW其中:VARW是字类型内存变量(下同)。
源操作数是立即数MOV AL, 89HMOV BX, -100HMOV EDX, 12345678HMOV VARW, 200HMOV [BX], 2345HPUSH 操作数;把操作数压入堆栈,堆栈指针SP+1;POP 操作数;把堆栈指针SP指定内容弹出到操作数指定位置。
如:PUSH AX;把AX内容送入堆栈POP AX;把堆栈内容弹出堆栈PUSHF 标志进栈格式为:PUSHF执行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(PSW)POPF 标志出栈格式为: POPF执行的操作:(PWS)<-((SP)+1,(SP))(SP)<-(SP+2)2. 输入输出端口传送指令IN AL,port;在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH。
寄存器、汇编命令详解
寄存器、汇编命令详解汇编命令详解32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
可用于乘、除、输入/输出等操作,使用频率很高;寄存器EBX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
2、变址寄存器32位CPU有2个32位通用寄存器ESI和EDI。
汇编指令汇总
16 AAA
未组合的十进制加法调整指令AAA(ASCII Adgust for Addition) 格式: AAA 功能: 对两个组合的十进制数相加运算(存在AL中)的结果进行调 整,产生一个未组合的十进制数放在AX中.
17 DAA
组合的十进制加法调整指令DAA(Decimal Adjust for Addition) 格式: DAA 功能: 对AL中的两个组合进制数相加的结果进行调整,调整结果仍 放在AL中,进位标志放在CF中.
10 LEA
有效地址传送指令 LEA 格式: LEA OPRD1,OPRD2 功能: 将源操作数给出的有效地址传送到指定的的寄存器中.
11 LDS
从存储器取出32位地址的指令 LDS 格式: LDS OPRD1,OPRD2 功ቤተ መጻሕፍቲ ባይዱ: 从存储器取出32位地址的指令.
12 LES
从存储器取出32位地址的指令 LES 格式: LES OPRD1,OPRD2 功能: 从存储器取出32位地址的指令.
22 CMP
比效指令 CMP(CoMPare) 格式: CMP OPRD1,OPRD2 功能: 对两数进行相减,进行比较.
23 AAS
未组合十进制减法调整指令 AAS(ASCII Adjust for Subtraction) 格式: AAS 功能: 对两个未组合十进制数相减后存于AL中的结 果进行调整,调整后产生一个未组合的十进制数数 且仍存于AL中. 组合十进制减法调整指令 DAS(Decimal Adjust for Subtraction) 格式: DAS 功能: 对两个组合十进制数相减后存于AL中的结果进行调整,调整 后产生一个组合的十进制数且仍存于AL中.
1
MOVE
数据传送指令 MOV 格式: MOV OPRD1,OPRD2 功能: 本指令将一个源操作数送到目的操作数中,即OPRD1<-OPRD2.
汇编语言的指令和寄存器
5.XLAT是(查表转换指令)把BX+AL为偏移的字节指向的值传送到AL。DS位段偏移量。
6.MOVSX(符号传送指令)8到16,把高8位全弄成符号位。
7.MOVZX(领扩展指令)8到16,把高8位全弄成0;
8.BSWAP(字节交换指令)特指32位的数。针对本个数。
4》结果的特征将放在FLAGS中:
1.CF:进位标志。
2.PF:奇偶标志。
3.AF:辅助进位标志。
4.ZF:零标志。
5.OF:溢出标志。
(5)奇偶标志 PF
(6)辅助进位标志AF
2>.状态控制标志
(1)方向标志DF
(2)中断允许标志IF
(3)追踪标志TF
3》1.lea是送偏移量;到寄存器
2.LDS是把一个32位的数,分别送到DS和BX中,LDS BX,list
3.SAHF是把AH送到FLAGS的低八位中,
复习一下汇编的基础知识,主要是Intel 8086的CPU。16机器
1.通用寄存器
(1)数据寄存器
数据寄存器共有4个寄存器AX、BX、CX、DX,用来保存操作数或运算结果等信息。
AX寄存器称为累加器。使用频度最高,用于算术、逻辑运算以及与外设传送信息等。
BX寄存器称为基址寄存器。常用于存放存储器地址。
CX寄存器称为计数器。一般作为循环或串操作等指令中的隐含计数器。
DX寄存器称为数据寄存器。常用来存放双字数据的高16位,或存放外设端口地址。
(2)变址和指针寄存器
变址和指针寄存器包括SI、DI、SP、BP 4个16位寄存器,主要用于存放某个存储单元的偏移地址。
ARM 内核寄存器 和 基本汇编语言讲解
ARM 内核寄存器和基本汇编语言讲解•一、ARM内核寄存器▪ 1.1 M3/M4内核寄存器▪ 1.2 A7内核寄存器▪ 1.3 ARM中的PC指针的值•二、ARM汇编语言▪ 2.1 ARM汇编基础▪ 2.2 汇编伪指令▪ 2.3 ARM汇编指令集•三、代码反汇编简析▪ 3.1 不同编译器的反汇编▪ 3.2 C 和汇编比较分析开头直接来看几个简单的汇编指令:MOV R0,R1MOV PC,R14上面的指令中使用了汇编MOV指令,但是其中的R0,R1,R14,PC分别是什么?哪来的?怎么用?要讲ARM 汇编语言,必须得先了解ARM的内核寄存器,内核处理所有的指令计算,都需要用到内核寄存器,所以ARM汇编里面指令大都是基于寄存器的操作。
文章前推荐韦东山老师的单片机核心视频,视频可以在韦东山老师官网里面找到:百问网ARM版本简单介绍:对于M3/M4而言:R13,栈指针(Stack Pointer)•R13寄存器中存放的是栈顶指针,M3/M4 的栈是向下生长的,入栈的时候地址是往下减少的。
•裸机程序不会用到PSP,只用到MSP,需要运行RTOS的时候才会用到PSP。
•堆栈主要是通过POP,PUSH指令来进行操作。
在执行PUSH 和 POP 操作时, SP 的地址寄存器,会自动调整。
R14 ,连接寄存器(Link Register)•LR 用于在调用子程序时存储返回地址。
例如,在使用BL(分支并连接,Branch and Link)指令时,就自动填充 LR 的值(执行函数调用的下一指令),进而在函数退出时,正确返回并执行下一指令。
如果函数中又调用了其他函数,那么LR将会被覆盖,所以需要先将LR寄存器入栈。
•保存子程序返回地址。
使用BL或BLX时,跳转指令自动把返回地址放入r14中;子程序通过把r14复制到PC来实现返回•当异常发生时,异常模式的r14用来保存异常返回地址,将r14如栈可以处理嵌套中断R15,程序计数器(Program Count)•在Cortex-M3中指令是3级流水线,出于对Thumb代码的兼容的考虑,读取pc时,会返回当前指令地址+4的值。
汇编语言常用指令大全
汇编语言常用指令大全汇编语言是一种计算机编程语言,使用指令来控制计算机硬件执行特定的操作。
在本文中,我们将介绍一些常用的汇编语言指令,以帮助读者更好地理解和学习汇编语言。
一、数据传输指令1. MOV:将数据从一个位置复制到另一个位置。
例子:MOV AX, BX 将寄存器BX中的值复制到寄存器AX中。
2. PUSH:将数据压入堆栈。
例子:PUSH AX 将寄存器AX中的值压入堆栈。
3. POP:从堆栈中弹出并获取数据。
例子:POP AX 从堆栈中弹出一个值,并将其存入寄存器AX中。
二、算术指令1. ADD:将两个操作数相加。
例子:ADD AX, BX 将寄存器AX和BX中的值相加,并将结果存入寄存器AX中。
2. SUB:将一个操作数从另一个操作数中减去。
例子:SUB AX, BX 将寄存器BX中的值从寄存器AX中减去,并将结果存入寄存器AX中。
3. MUL:将两个操作数相乘。
例子:MUL AX, BX 将寄存器AX和BX中的值相乘,并将结果存入寄存器AX中。
三、逻辑指令1. AND:进行逻辑与操作。
例子:AND AX, BX 对寄存器AX和BX中的值进行逻辑与操作,并将结果存入寄存器AX中。
2. OR:进行逻辑或操作。
例子:OR AX, BX 对寄存器AX和BX中的值进行逻辑或操作,并将结果存入寄存器AX中。
3. NOT:进行逻辑非操作。
例子:NOT AX 对寄存器AX中的值进行逻辑非操作。
四、条件分支指令1. JMP:无条件跳转到指定的地址。
例子:JMP label 跳转到标记为label的地址。
2. JZ:当操作数为零时跳转到指定的地址。
例子:JZ label 如果寄存器AX中的值为零,则跳转到标记为label 的地址。
3. JC:当进位标志为1时跳转到指定的地址。
例子:JC label 如果进位标志位为1,则跳转到标记为label的地址。
五、循环指令1. LOOP:当计数器不为零时,循环执行指定的代码块。
汇编指令大全+很全的汇编指令
for Addition)
1. 调整操作如下
格式: DAA
(1) 若(AL) and 0FH>9 或 AF=1
,则(AL)<--(AL)+6,AF<--1,对低
功能: 对AL中的两个组合进制数相加的结果进行调 四位的调整.
整,调整结果仍放在AL中,进位标志放在CF中.
(2) 若(AL) and 0F0H>90H 或
6 LAHF 标志传送指令 LAHF 格式: LAHF
2. 本指令不影响状态标位,表格 长度不超过256字节.
说明: 该指令不影响FLAG的原来 内容,AH只是复制了原FLAG的低8 位内容.
功能: 取FLAG标志寄存器低8位至AH寄存器.(AH)<-
-(FLAG)7~0
7 SAHF 标志传送指令 SAHF
说明:
格式: DEC OPRD 功能: OPRD<--OPRD-1
1. OPRD 为寄存器或存储器操作 数.
2. 这条指令执行结果影响AF、 OF、PF、SF、ZF标志位,但不影 响CF标志位.
页码,4/22
星尘-易尘
302 NEG 303 CMP
304 AAS 305 DAS 306 MUL
取补指令 NEG(NEGate)
未组合的十进制加法调整指令 AAA(ASCII Adgust 说明:
for Addition)
1. 组合的十进制数和未组合的
格式: AAA
十进制数:在计算中,十进制数可
用四位二进制数编码,称为BCD
功能: 对两个组合的十进制数相加运算(存在AL中) 码.
的结果进行调整,产生一个未组合的十进制数放在
AX中.
SUB [BX+25],AX
汇编学习笔记之寄存器
寄存器8086/8088 包括四个16为数据寄存器,两个16为指针寄存器,两个16位变址寄存器,一个16为指令指针,四个16位段寄存器,一个16位标志寄存器,这14个寄存器分为四组通用寄存器:AX BX CX DX 通用寄存器SP 堆栈指针BP 基址指针SI 源地址DI 目的地址SP BP SI DI 也为通用寄存器控制寄存器:IP 指令指针FLAG 标志寄存器段寄存器:CS 代码段寄存器DS 数据段寄存器SS 栈段寄存器ES 附加段寄存器1. 标志寄存器16位的标志寄存器FLAG包含九个标志,分为两组第一组:6个主要受加减运算和逻辑运算结果的影响,成为运算结果标志第二组:3个不受运算结果的影响,称为状态控制标志运算结果标志:1> 进位标志CF (Carry Flag)主要用于反映运算是否产生进位或借位,如果运算结果的最高位(字操作数为第15位,字节操作数为第7位)产生一个进位或借位,则CF被置为1,否则置为0,移位指令把操作数的最高位或最地位移入CF。
在进行多字节数的加减运算时,要使用到该标志。
在比较无符号整数的大小是,要使用到该标志。
2> 零标志ZF (Zero Flag)用于反映运算结果是否为0,如果结果为0 ,则置ZF为1,否则置为0.在判断运算结果是否为0时,用到该标志。
3> 符号标志SF(Sign Flag)用于反映运算结果的符号位,SF与运算结果的最高位相同,如果运算结果的最高位为1,则SF 置为1,否则被清0,在8086/8088中,有符号数采用补码的形式表示,所以SF反映运算结果的符号,如果运算结果为正,则SF为正(补码最高位为0),则被置0,运算结果为负,置为14> 溢出标志OF (OverFlow Flag)反映有符号数加减运算是否溢出,如果运算结果超出了8位或16位有福好的数的表示范围,即在字节运算时大于127或小于-128,在字的运算时大于65535或小于–65536,称为溢出溢出时OF =1;未溢出OF =0;5> 奇偶标志PF (Parity Flag)奇偶标志反映运算结果中1 的个数,如果1的个数为偶数,则PF =1 ,否则PF =0利用奇偶标志可以进行奇偶校验检查。
汇编指令-状态寄存器、cmp、test、jz等指令详细说明
汇编指令-状态寄存器、cmp、test、jz等指令详细说明⼀、状态寄存器⾸先看看:状态寄存器(即标志寄存器)PSW(Program Status Word)程序状态字(即标志)寄存器,是⼀个16位寄存器,由条件码标志(flag)和控制标志构成,如下所⽰:条件码:①OF(Overflow Flag)溢出标志,溢出时为1,否则置0.标明⼀个溢出了的计算,如:结构和⽬标不匹配。
②SF(Sign Flag)符号标志,结果为负时置1,否则置0。
③ZF(Zero Flag)零标志,运算结果为0时置1,否则置0。
④CF(Carry Flag)进位标志,进位时置1,否则置0.注意:Carry标志中存放计算后最右的位。
⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产⽣的进位置。
有进位时1,否则置0。
⑥PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0。
控制标志位:⑦DF(Direction Flag)⽅向标志,在串处理指令中控制信息的⽅向。
⑧IF(Interrupt Flag)中断标志。
⑨TF(Trap Flag)陷井标志。
test和cmp指令运⾏后都会设置标志位,为举例⽅便说⼀下jnz和jz测试条件JZ ZF=1JNZ ZF=0即Jz=jump if zero (结果为0则设置ZF零标志为1,跳转)Jnz=jump if not zero⼆、test指令和cmp指令好,接着来看test和cmp1、test指令test属于逻辑运算指令功能:执⾏BIT与BIT之间的逻辑运算测试(两操作数作与运算,仅修改标志位,不回送结果)。
Test对两个参数(⽬标,源)执⾏AND逻辑操作,并根据结果设置标志寄存器,结果本⾝不会保存。
EST AX, BX 与 AND AX, BX 命令有相同效果语法:TEST r/m,r/m/data影响标志:C,O,P,Z,S(其中C与O两个标志会被设为0)运⽤举例:1.Test⽤来测试⼀个位,例如寄存器:test eax, 100b; b后缀意为⼆进制jnz ******; 如果eax右数第三个位为1,jnz将会跳转jnz跳转的条件⾮0,即ZF=0,ZF=0意味着零标志没被置位,即逻辑与结果为1。
汇编指令(常用指令)
汇编指令百科名片汇编指令是汇编语言中使用的一些操作符(如mov,inc,loop)和助记符,还包括一些伪指令(如assume,end)。
用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。
目录编辑本段一、数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据。
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 程序结束.七、处理机控制指令:标志处理指令CLC(进位位置0指令)CMC(进位位求反指令)STC(进位位置为1指令)CLD(方向标志置1指令)STD(方向标志位置1指令)CLI(中断标志置0指令)STI(中断标志置1指令)NOP(无操作)HLT(停机)WAIT(等待)ESC(换码)LOCK(封锁)。
常见汇编语言指令解释:
PC是一个16位的程序计数器。
用于存放和指示下一条要执行的指令的地址。
寻址范围达64KB。
PC有自动加1功能,以实现程序的顺序执行。
PC没有地址,是不可寻址的,无法用指令对它进行读写。
但在执行转移、调用、返回等指令时能自动改变其内容,以改变程序的执行顺序。
参数代表的意义:1、Rn 表示R0~R7中的一个2、#data 表示8位的数值 00H~FFH3、direct 表示8位的地址 00H~FFH(指的是内部RAM或SFR的地址)4、@Ri 表示寄存器间接寻址只能是R0或者R15、@DPTR 表示数据指针间接寻址6、bit 表示位地址7、$ 表示当前地址常见汇编语言指令解释:寄存器寻址 MOV A,R1将R1中的数值赋予A直接寻址 MOV A,3AH将地址3AH中的数值赋予A立即寻址 MOV A,#3AH将3AH数值赋予A寄存器间址 MOV A,@R0 将 R0中地址的数值赋予A变址寻址 MOVC A,@A+DPTR以A中的数值为地址偏移量进行查表相对寻址 AJMP MATN跳转到行号为MATN处位寻址 MOV C,7FH 将位地址7FH的数值赋予CMOV A,#3AH数据传输、赋值命令PUSH direct将direct为地址的数值压入堆栈中POP direct将direct为地址的数值弹出堆栈XCH A,direct将direct中的数值与A进行交换ADD A,direct将direct中的数值与INC direct将direct中的数值加1SUBB A,direct将A中的数值减去direct中的数值和Cy值,并保存在A中,如果想使用不带Cy减法,可以在运算前对Cy清零:CLR C DEC direct将direct中的数值减1DA A 用于对BCD码加减法后进行10进制调整MUL A B将A和B相乘,并把高八位放在B中,低八位放在A中DIV A B将A和B相除,并把商放在A中,余数放在B中ANL A,direct将A与direct中的数值进行与运算,结果保留在A 中(与运算规律:有0出0,全1出1)ORL A,direct将A与direct中的数值进行或运算,结果保留在A中(或运算规律:有1出1,全0出0)XRL A,direct将A与direct中的数值进行异或运算,结果保留在A 中(异或运算规律:全0出0,全1出0,01、10出1)CRL A 对A清零CPL A 对A取反RL A对A中数右移RR A对A中数左移RLC A 对A中数带Cy右移RRC A对A中数带Cy左移SWAP A 对A中的数高4位和低4位互相交换LJMP 长跳转指令,64K地址范围AJMP短跳转指令,2K地址范围JZ rel如果A为0就跳转到rel行号处JNZ rel如果A不为0就跳转到rel行号处CJNE A,#data,rel 如果A不等于data就跳转到rel行号处DJNZ R1,rel如果R1减1后不为0就跳转到rel行号处ACALL rel 调用rel子程序,2K地址以内LCALL rel调用rel子程序,64K地址以内RET子程序返回指令RETI中断程序返回指令NOP空操作指令MOV C,bit将位地址bit中的值赋予CCRL bit将bit位地址清0SETB bit将bit位地址置1CPL bit 将bit位地址取反ANL C,bit 将地址bit中的值和C做与运算,结果存放在C中ORL C,bit将地址bit中的值和C做或运算,结果存放在C中JC rel如果Cy为1,就跳转到rel行号处JNC rel如果Cy为0,就跳转到rel行号处。
汇编语言指令大全
汇编语言指令大全前言汇编语言是一种底层的计算机语言,用于编写程序时直接操作硬件,并且能够直接控制计算机的指令执行。
在学习汇编语言时,掌握各种指令是非常重要的,本文将系统性地介绍汇编语言中常用的指令,以便读者更好地理解和使用汇编语言。
数据传送指令数据传送指令用于在寄存器、内存之间传送数据,常用的数据传送指令有MOV、XCHG等。
MOVMOV指令将数据从一个地方(来源)移动到另一个地方(目的地),语法如下:MOV 目的地, 来源例如:MOV AX, 5XCHGXCHG指令用于交换两个操作数的值,语法如下:XCHG 寄存器1, 寄存器2例如:XCHG AX, BX算术操作指令算术操作指令用于进行各种算术运算,如加法、减法、乘法、除法等,常用的算术操作指令有ADD、SUB、MUL、DIV等。
ADDADD指令用于两个操作数相加并将结果存储在目的地,语法如下:ADD 目的地, 源操作数例如:ADD AX, BXSUB指令用于从目的地减去源操作数的值,语法如下:SUB 目的地, 源操作数例如:SUB AX, 10MULMUL指令用于无符号乘法操作,将累加器AL与源操作数执行乘法,结果存储在累加器中,语法如下:MUL 源操作数例如:MUL BLDIVDIV指令用于无符号除法操作,将累加器AX中的双字数值除以源操作数,商存储在AX中,余数存储在DX中,语法如下:DIV 源操作数例如:DIV CX控制转移指令控制转移指令用于改变程序执行的顺序,如无条件跳转、条件跳转等,常用的控制转移指令有JMP、JZ、JC等。
JMPJMP指令用于无条件跳转到指定的地址执行,语法如下:JMP 目标地址例如:JMP STARTJZ指令表示“零标志”(Zero Flag),即在上一个运算结果为零时跳转到指定地址执行,语法如下:JZ 目标地址例如:JZ LOOPJCJC指令表示“进位标志”(Carry Flag),即在发生进位时跳转到指定地址执行,语法如下:JC 目标地址例如:JC ADD_OVERFLOW总结本文介绍了汇编语言中常用的数据传送指令、算术操作指令和控制转移指令,这些指令是汇编语言编程时必须掌握的基础知识。
汇编指令大全(完整版有注释)
汇编指令大全(有注释)一、数据传输指令───────────────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.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 程序结束.七、处理机控制指令:标志处理指令CLC(进位位置0指令)CMC(进位位求反指令)STC(进位位置为1指令)CLD(方向标志置1指令)STD(方向标志位置1指令)CLI(中断标志置0指令)STI(中断标志置1指令)NOP(无操作)HLT(停机)WAIT(等待)ESC(换码)LOCK(封锁)。
汇编指令诠释
汇编指令大全一、数据传输指令─────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV ----> move 传送字或字节.MOVSX ----> extended move with sign data先符号扩展,再传送.MOVZX ----> extended move with zero data,先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA ----> push all,把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA ----> pop all ,把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD ----> push all data,把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD ----> pop all data,把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP ----> byte swap,交换32位寄存器里字节的顺序XCHG ----> exchange ,交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG----> exchange and add 比较并交换操作数.( 第二个操作数必须为累加器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 ---->load effective address,装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS ----> load DS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES ----> load ES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS ----> load FS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS ----> load GS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS ----> load SS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF ----> load AH from flag 标志寄存器传送,把标志装入AH.SAHF ----> save AH to flag 标志寄存器传送,把AH内容装入标志寄存器.PUSHF ----> push flag 标志入栈.POPF ----> pop flag 标志出栈.PUSHD ----> push dflag , 32位标志入栈.POPD ----> pop dflag, 32位标志出栈.二、算术运算指令─────────────────────────ADD 加法.ADC ----> add with carry; 带进位加法.INC ----> increase 1; 加1.AAA ----> ascii add with adjust ; 加法的ASCII码调整.DAA ----> decimal add with adjust; 加法的十进制调整.SUB ----> substract; 减法.SBB ----> substract with borrow; 带借位减法.DEC ----> decrease 1; 减1.NEG ----> negative; 求反(以0 减之).CMP ----> compare; 比较.(两操作数作减法,仅修改标志位,不回送结果).AAS ----> ascii adjust on substract; 减法的ASCII码调整.DAS ----> decimal adjust on substract; 减法的十进制调整.MUL ----> multiplication; 无符号乘法.IMUL ----> integer multiplication; 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM ----> ascii adjust on multiplication; 乘法的ASCII码调整.DIV ----> divide; 无符号除法.IDIV ----> integer divide; 整数除法.以上两条,结果回送:商回送AL,余数回送AH(字节运算);或商回送AX,余数回送DX, (字运算).AAD ----> ascii adjust on divide; 除法的ASCII码调整.CBW ----> change byte to word; 字节转换为字.(把AL中字节的符号扩展到AH中去) CWD ----> change word to double word; 字转换为双字.(把AX中的字的符号扩展到DX 中去)CWDE ----> change word to double word with sign to EAX;字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ --->change double word to quadrate word 双字扩展.(把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令─────────────────────────AND OPRD1,OPRD2 与运算.两个全是1才是1,其余全是O.与操作指令主要用在使一个操作数中的若干位维持不变,而另外若干位清零的场合.OR OPRD1,OPRD2 或运算.一个是1就是1,其他全是0.或操作指令主要用在使一个操作数中的若干位维持不变,而另外若干位为1的场合.XOR OPRD1,OPRD2 异或运算.一样的为0,不一样的为1.异或指令主要用在使一个操作数的若干位不变,而另外若干位取反的场合.NOT OPRD 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL ----> shift left; 逻辑左移.SAL ----> arithmatic shift left; 算术左移.(=SHL)SHR ----> shift right; 逻辑右移.SAR ----> arithmatic shift right; 算术右移.(=SHR)ROL ----> rotate left; 循环左移.ROR ----> rotate right; 循环右移.RCL ----> rotate left with carry; 通过进位的循环左移.RCR ----> rotate right with carry; 通过进位的循环右移.以上八种移位指令,其移位次数可达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 ----> move string; 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS ----> compare string; 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS ----> scan string; 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS ----> load string; 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符.LODSW 传送字. LODSD 传送双字. )STOS ----> store string; 保存串.是LODS的逆过程.REP ----> repeat 当CX/ECX<>0时重复.REPE/REPZ ----> repeat when equal/repeat when zero flag 当ZF=1或比较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ ----> repeat when not equal/repeat when zero flag 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.REPC ----> repeat when carry flag ; 当CF=1且CX/ECX<>0时重复.REPNC ----> repeat when not carry flag ; 当CF=0且CX/ECX<>0时重复.五、程序转移指令─────────────────────────1>无条件转移指令(长转移)JMP ---->jump 无条件转移指令CALL 过程调用RET/RETF---->return/return far;过程返回.2>条件转移指令(短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 ) JA/JNBE 不小于或不等于时转移.JAE/ JNB ---->jump when above or equal/ jump when not below大于或等于转移.JB/JNAE --->jump when below/ jump when not above or equal小于转移.JBE/JNA ---->jump when below or equal/ jump when not above;小于或等于转移.以上四条,测试无符号整数运算的结果(标志C和Z).JG/JNLE ---->jump when greater/ jump when not less or equal/ jump when not less or equal;大于转移.JGE/JNL ---->jump when greater or equal/ jump when not less大于或等于转移.JL/JNGE ---->jump when less/ jump when not greater or equal;小于转移.JLE/JNG ---->jump when less or equal/ jump when not greater;小于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ ---->jump when equal/ jump when has zero flag等于转移.JNE/JNZ ---->jump when not equal/ jump when not has zero flag;不等于时转移.JC --->jump when has carry flag 有进位时转移.JNC ---->jump when not has carry flag 无进位时转移.JNO ---->jump when not has overflow flag 不溢出时转移.JNP/JPO ---->jump when not has parity flag/ jump when parity flag is odd 奇偶性为奇数时转移JNS ---->jump when not has sign flag 符号位为"0" 时转移.JO ---->jump when has overflow flag 溢出转移.JP/JPE ---->jump when has parity flag / jump when parity flag is even 奇偶性为偶数时转移.JS ---->jump when has sign flag 符号位为"1" 时转移.3>循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ ---->jump when has sign flag/ loop zero CX不为零且标志Z=1时循环. LOOPNE/LOOPNZ ---->loop not equal/ loop not zero; CX不为零且标志Z=0时循环. JCXZ ---->jump when CX is zero CX为零时转移.JECXZ ---->jump when ECX is zero ECX为零时转移.4>中断指令INT ---->interrupt 中断指令INTO ---->overflow interrup 溢出中断IRET ---->interrupt return 中断返回5>处理器控制指令HLT ---->halt 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.ESC ---->escape 转换到外处理器.LOCK 封锁总线.NOP ---->no operation 空操作.STC ---->set carry 置进位标志位.CLC ---->clear carry 清进位标志位.CMC ---->carry make change 进位标志取反.STD ---->set direction 置方向标志位.CLD ---->clear direction 清方向标志位.STI ---->set interrupt 置中断允许位.CLI ---->clear interrupt 清中断允许位.六、伪指令─────────────────────────DW ---->definw word 定义字(2字节).PROC ---->procedure 定义过程.ENDP ---->end of procedure 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS ---->end segment 段结束.END 程序结束.。
汇编语言入门汇编指令及寄存器详解教程
汇编语言入门汇编指令及寄存器详解教程汇编语言是一种低级编程语言,与计算机硬件直接相关。
它使用一组基本的指令和寄存器来编写程序。
本篇教程将介绍汇编语言的基本指令和寄存器,帮助读者入门汇编语言编程。
一、汇编语言概述及基本概念汇编语言是机器语言的助记符表示。
它采用英文单词来表示机器指令,以便程序员更容易理解和编写。
汇编语言程序需要通过汇编器将其转换为机器语言,然后可以在计算机上运行。
1.1 汇编指令汇编指令是汇编语言中的基本指令,用于执行计算机的各种操作。
常见的汇编指令包括数据传输指令、算术运算指令、逻辑运算指令和控制转移指令等。
下面介绍几个常用的汇编指令:1.1.1 MOV指令MOV指令用于将数据从一个位置复制到另一个位置。
语法格式如下:MOV 目标操作数, 源操作数其中,目标操作数表示数据的目的位置,源操作数表示数据的来源位置。
例如,MOV AX, BX表示将寄存器BX中的数据复制到寄存器AX中。
1.1.2 ADD指令ADD指令用于实现加法运算。
语法格式如下:ADD 目标操作数, 源操作数其中,目标操作数表示运算结果的存储位置,源操作数表示参与加法运算的数据。
例如,ADD AX, BX表示将AX寄存器中的数据与BX 寄存器中的数据相加,并将结果存储在AX寄存器中。
1.1.3 JMP指令JMP指令用于实现无条件跳转。
语法格式如下:JMP 目标地址其中,目标地址表示跳转的目标位置。
例如,JMP 100表示跳转到地址为100的指令处执行。
1.2 寄存器寄存器是一种用于存储和处理数据的硬件组件。
在汇编语言中,寄存器被广泛应用于各种数据传输和运算操作。
下面介绍几个常用的寄存器:1.2.1 通用寄存器通用寄存器是汇编语言中最常用的寄存器,用于存储数据和执行运算。
常见的通用寄存器有AX、BX、CX和DX等。
1.2.2 段寄存器段寄存器用于存储程序的段地址。
在实模式下,8086处理器有4个段寄存器:CS、DS、ES和SS。
汇编指令
Rn:表示通用寄存器R0—R7。
Ri:表示通用寄存器中可用作8位地址指针的R0和R1(i=0,1)。
#data:表示8位立即数。
#data16:表示16位产即数。
direct:表示8位片内RAM或SFR区的直接地址。
addr16/addr11:表示外部程序存贮器的16位或11位地址。
rel:表示8位偏移量。
bit:表示直接位地址。
助记符说明字节数振荡器周期一、传送、交换、栈出入指令MOV A,Rn寄存器传送到累加器112 MOV A,direct直接字节传送到累加器212 MOV A,@Ri间接RAM传送到累加器112 MOV A,#data立即数传送到累加器212 MOV Rn,A累加器传送到寄存器112 MOV Rn,direct直接字节传送到寄存器224 MOV Rn,#data立即数传送到寄存器212 MOV direct,A累加器传送到直接字节212 MOV direct,Rn寄存器传送到直接字节224 MOV direct,direct直接字节传送到直接字节324 MOV direct,@Ri间接RAM传送到直接字节224 MOV direct,#data立即数传送到直接字节324 MOV @Ri,A累加器传送到间接RAM124 MOV @Ri,direct直接字节传送到间接RAM224 MOV @Ri,#data立即数传送到间接RAM224 MOV DPTR,#data1616位常数加载到数据指针324 MOVC A,@A+DPTR代码字节传送到累加器124 MOVC A,@A+PC代码字节传送到累加器124 MOVX A,@Ri外部RAM(8位地址)传送到ACC124 MOVX A,@DPTR外部RAM(16位地址)传送到ACC124 MOVX @Ri,A ACC传送到外部RAM(16位地址)124 MOVX @DPTR,A ACC传送到外部RAM(16位地址)124 PUSH direct直接字节压到堆栈224 POP direct从栈中弹出直接字节224 XCH A,Rn寄存器和累加器交换112 XCH A,direct直接字节和累加器交换212 XCH A,@Ri间接RAM和累加器交换112 XCHD A,@Ri间接RAM和累加器交换低4位字节112 SWAP A累加器内部高,低4位交换112二、算术、逻辑运算指令ADD A,Rn寄存器加到累加器112 ADD A,direct直接字节加到累加器212 ADD A,@Ri间接RAM加到累加器112 ADD A,#data立即数加到累加器212 ADDC A,Rn寄存器加到累加器(带进位)112 ADDC A,direct直接字节加到累加器(带进位)212ADDC A,@Ri间接RAM加到累加器(带进位)112 ADDC A,#data立即数加到累加器(带进位)212 SUBB A,Rn ACC减去寄存器(带借位)112 SUBB A,direct ACC减去直接字节(带借位)212 SUBB A,@Ri ACC减去间接RAM(带借位)112 SUBB A,#data ACC减去立即数(带借位)212 INC A累加器加1112 INC Rn寄存器加1112 INC direct直接字节加1212 INC @Ri间接RAM加1112 DEC A累加器减1112 DEC Rn寄存器减1112 DEC direct直接地址字节减1212 DEC @Ri间接RAM减1112 INC DPTR数据指针加1124 MUL AB A和B的寄存器相乘148 DIV AB A寄存器除以B寄存器148 DA A累加器十进制调整112 ANL A,Rn寄存器“与”到累加器112 ANL A,direct直接字节“与”到累加器212 ANL A,@Ri间接RAM“与”到累加器112 ANL A,#data立即数“与”到累加器212 ANL direct,A累加器“与”到直接字节212 ANL direct,#data立即数“与”到直接字节324 ORL A,Rn寄存器“或”到累加器112 ORL A,direct直接字节“或”到累加器212 ORL A,@Ri间接RAM“或”到累加器112 ORL A,#data立即数“或”到累加器212 ORL direct,A累加器“或”到直接字节212 ORL direct,#data立即数“或”到直接字节324 XRL A,Rn寄存器“异或”到累加器112 XRL A,direct直接字节“异或”到累加器212 XRL A,@Ri间接RAM“异或”到累加器112 XRL A,#data立即数“异或”到累加器212 XRL direct,A累加器“异或”到直接字节212 XRL direct,#data立即数“异或”到直接字节324 CLR A累加器清零112 CPL A累加器取反112 RL A累加器循环左移112 RLC A经过进位位的累加器循环左移112 RR A累加器循环右移112 RRC A经过进位位的累加器循环右移112三、转移指令ACALL addr11 绝对调用子程序224 LCALL addr16长调用子程序324 RET从子程序中返回124RETI从中断返回124 AJMP addr11绝对转移224 LJMP addr16长转移324 SJMP rel短转移(相对转移)224 JMP @A+DPTR相对DPTR的间接转移124 JZ rel累加器为零则转移224 JNZ rel 累加器为非零则转移224 CJNE A,direct,rel比较直接字节和ACC,不相等则转移324 CJNE A,#data,rel比较立即数和ACC,不相等则转移324 CJNE Rn,#data,rel比较立即数和寄存器,不相等则转移324 CJNE @Ri,#data,rel比较立即数和间接RAM,不相等则转移324 DJNZ Rn,rel寄存器减1,不为零则转移324 DJNZ direct,rel直接字节减1,不为零则转移324 NOP空操作112四、布尔指令集CLR C清进位112 CLR bit清直接寻址位212 SETB C进位位置位112 SETB bit 直接寻址位置位212 CPL C进位位取反112 CPL bit直接寻址位取反212 ANL C,bit直接寻址位“与”到进位位224 ANL C,/bit直接寻址位的反码“与”到进位位224 ORL C,bit直接寻址位“或”到进位位224 ORL C,/bit直接寻址位的反码“或”到进位位224 MOV C,bit直接寻址位传送到进位位212 MOV bit,C进位位传送到直接寻址位224 JC rel如果进位为1则转移224 JNC rel如果进位为零则转移224 JB bit,rel如果直接寻址位为1则转移324 JNB bit,rel如果直接寻址位为零则转移324 JBC bit,rel如果直接寻址位为1则转移并清除该位324。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5、符号标志SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
EDS——数据段寄存器(Data Segment Register),其值为数据段的段值;
EES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
ESS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
EFS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
计算机寄存器常用指令
一、常用指令
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位寄存器里字节的顺序
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
3. 目的地址传送指令.
LEA 装入有效地址.
例: LEA DX,string ;把偏移地址存到DX.
LDS 传送目标指针,把指针内容装入DS.
汇编命令详解
32位CPU所含有的寄存器有:
4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)
1、数据寄存器
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
4、零标志ZF(Zero Flag)
EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;
ESP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,
用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用;
寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,
用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
CPU的指令系统中也有专门的指令来改变标志位IF的值。
3、方向标志DF(Direction Flag)
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.11节——字符串操作指令——中给出。
2、奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
3、辅助进位标志AF(Auxiliary Carry Flag)
它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。
3、指针寄存器
其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。
32位CPU有2个32位通用寄存器EBP和ESP。
它们主要用于访问堆栈内的存储单元,并且规定:
6、溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
“溢出”和“进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,
在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,
而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
2、变址寄存器
32位CPU有2个32位通用寄存器ESI和EDI。
5、指令指针寄存器
32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。
在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。
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.
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、 除、输入/输出等操作,使用频率很高;
在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。
三、32位标志寄存器增加的标志位
1、I/O特权标志IOPL(I/O Privilege Level)
I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。该字段指定了要求执行I/O指令的特权级。
如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。
所以,在理解它们的功能时,不考虑存在指令队列的情况。
6、标志寄存器
一、运算结果标志位
1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
二、状态控制操作的,它们要通过专门的指令才能使之发生改变。
1、追踪标志TF(Trap Flag)
当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。
指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。
指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
4、段寄存器
段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器:
ECS——代码段寄存器(Code Segment Register),其值为代码段的段值;