汇编语言寄存器和指令操作的整理
汇编push和pop指令的用法
汇编push和pop指令的用法
汇编语言中,push和pop是非常重要的指令。它们的作用是对栈进行操作。
栈是一种后进先出的数据结构,也就是说,最后进入栈的元素最先出栈。栈的操作包
括压入(push)和弹出(pop)。常见的栈有函数调用栈和操作系统的内核栈。
在汇编代码中,栈通常由寄存器来实现。常用的寄存器有esp和ebp。其中,esp是栈指针寄存器,用于指向当前栈顶;ebp是基址指针寄存器,用于指向当前函数的基址(栈底)。
一、push指令
push指令的作用是将数据压入栈中。push指令可以操作任何一个寄存器或是内存中的指定地址。具体的语法如下:
push 寄存器/内存地址
如果要将某个寄存器的值压入栈中,可以使用如下的指令:
push eax
这条指令会将eax寄存器的值压入栈中,同时将esp减4,指向新的栈顶。
push dword ptr [ebx]
其中,dword ptr表示操作数的长度为4字节,[ebx]表示取出ebx寄存器中的值,并将其作为地址取出对应的内存中的值。这条指令会将[ebx]寄存器中的值压入栈中,同时
将esp减4,指向新的栈顶。
二、pop指令
1、pop寄存器
pop ebx
2、pop内存地址
总结:
push和pop指令是汇编语言中的栈操作指令,在程序中非常常见。push指令用于将数据压入栈中,pop指令用于将栈顶元素弹出并存入指定的寄存器或内存中。在程序编写中,我们通常会使用push和pop指令来保存和还原寄存器的状态,以免被下一指令修改。由于栈的结构简单有效,所以栈在实际编程中有着非常广泛的应用。
汇编的基本常用指令
汇编的基本常用指令
汇编语言是一种底层的程序设计语言,主要用于编写机器码指令。以下是一些常用的汇编指令:
1. MOV:将数据从一个位置复制到另一个位置。
2. ADD:将两个操作数相加,并将结果存储在目的操作数中。
3. SUB:将第二个操作数从第一个操作数中减去,并将结果存储在目的操作数中。
4. INC:将一个操作数的值增加1。
5. DEC:将一个操作数的值减少1。
6. CMP:比较两个操作数的值,并将结果影响到标志寄存器中。
7. JMP:无条件跳转到指定的代码位置。
8. JZ / JE:当指定的条件成立时,跳转到指定的代码位置(零
标志或相等标志)。
9. JNZ / JNE:当指定的条件不成立时,跳转到指定的代码位
置(非零标志或不相等标志)。
10. JL / JB:当源操作数小于目的操作数时,跳转到指定的代
码位置(小于标志或借位标志)。
11. JG / JA:当源操作数大于目的操作数时,跳转到指定的代
码位置(大于标志或进位标志)。
12. CALL:调用一个子程序或函数。
13. RET:返回子程序或函数的调用处。
14. NOP:空操作,用于占位或调整程序代码的位置。
15. HLT:停止运行程序,将CPU置于停机状态。
这里只列举了一些基本的汇编指令,实际上汇编语言有更多更
复杂的指令,具体使用哪些指令取决于所使用的汇编语言和目标处理器的指令集架构。
继续列举一些常用的汇编指令:
16. AND:将两个操作数进行按位与运算,并将结果存储在目
的操作数中。
17. OR:将两个操作数进行按位或运算,并将结果存储在目的操作数中。
汇编语言指令详解
汇编语言指令详解
汇编语言是一种低级语言,它直接操作计算机的硬件。与高级语言相比,汇编语言更具操作性,可以更精确地控制计算机的执行过程。在编写汇编语言程序时,我们需要使用指令来完成各种操作,并且对不同的指令进行详细的了解。本文将详细介绍一些常用的汇编语言指令及其功能。
一、数据传输指令
数据传输指令用于在寄存器间传输数据或将数据从寄存器传送到内存中。常用的数据传输指令包括MOV、LDA、STA等。
MOV指令用于将数据从一个寄存器传送到另一个寄存器。例如,MOV AX, BX表示将寄存器BX中的数据传送到寄存器AX中。
LDA指令用于将一个内存单元的数据传送到累加器中。例如,LDA 1000H将内存单元1000H中的数据传送到累加器中。
STA指令用于将累加器的数据传送到一个内存单元中。例如,STA 2000H将累加器中的数据传送到内存单元2000H中。
二、算术运算指令
算术运算指令用于对数据进行加、减、乘、除等运算操作。常用的算术运算指令包括ADD、SUB、MUL、DIV等。
ADD指令用于将两个操作数相加,并将结果存储在目的操作数中。例如,ADD AX, BX表示将寄存器AX和寄存器BX的数据相加,并将
结果存储在寄存器AX中。
SUB指令用于将目的操作数减去源操作数,并将结果存储在目的操
作数中。例如,SUB AX, BX表示将寄存器AX减去寄存器BX的数据,并将结果存储在寄存器AX中。
MUL指令用于执行无符号整数乘法运算。例如,MUL AX, BX表
示将寄存器AX和寄存器BX的数据相乘,并将结果存储在寄存器AX 中。
汇编语言寄存器详解
汇编语言寄存器详解
汇编语言是一种底层程序设计语言,与高级语言相比,汇编语言更接近于计算机硬件层面。在汇编语言中,寄存器是一种非常重要的概念,它们用于存储数据和指令,以及进行计算和操作。在本文中,我们将详细介绍汇编语言中常用的寄存器及其作用。
1. 通用寄存器
通用寄存器是汇编语言中最基本的寄存器,它们可以用于存储数据、指针和地址等信息。在x86架构中,通用寄存器有8个,分别为:AX,BX,CX,DX,SI,DI,BP和SP。
其中,AX,BX,CX和DX是16位寄存器,也就是说它们可以存储16位的数据。SI和DI是用于存储指针和地址的寄存器,BP和SP 则是用于存储栈指针的寄存器。
2. 段寄存器
在汇编语言中,除了通用寄存器以外,还有一种特殊的寄存器,叫做段寄存器。段寄存器用于存储内存中某个段的起始地址,它们可以帮助程序员在内存中定位某个数据或指令。
在x86架构中,有4个段寄存器,分别为:CS,DS,SS和ES。其中,CS用于存储代码段的地址,DS用于存储数据段的地址,SS用于存储堆栈段的地址,ES则可以用作附加段寄存器。
3. 标志寄存器
标志寄存器是一种特殊的寄存器,它们用于存储程序运行中的各种状态信息。在x86架构中,有一个标志寄存器,叫做FLAGS寄存器,
它包含了各种标志位,用于表示程序运行中的各种状态信息。
其中,比较常用的标志位有:ZF(零标志位),CF(进位标志位),OF(溢出标志位)等。这些标志位可以帮助程序员判断程序运行中的各种状态,从而进行相应的处理。
总的来说,寄存器是汇编语言中非常重要的概念,程序员需要熟练掌握各种寄存器的作用和用法,才能够编写出高效、正确的汇编程序。
汇编语言中PTR的含义及作用
汇编语言中PTR的含义及作用在汇编语言中,PTR是一个非常重要的指令。PTR是Pointer(指针)的缩写,用于表示和操作内存地址。它可以帮助程序员直接访问和操
纵内存中的数据,提供了更高级别的内存操作功能。
一、PTR指令的含义
PTR指令用于设置和操作指针寄存器。指针寄存器是用于存储内存
地址的寄存器,它们可以指向内存中的某个特定位置,从而使程序能
够读取或写入该内存位置的数据。在汇编语言中,常用的指针寄存器
有DS(数据段寄存器)、ES(目标段寄存器)、SS(堆栈段寄存器)等。
二、PTR指令的作用
1. 读取和写入内存数据:PTR指令允许程序员通过指针寄存器直接
读取或写入内存数据。通过设置PTR指令的操作数为目标内存地址,
程序可以将数据加载到寄存器中,或者将寄存器中的数据存储到目标
内存地址中。
示例:
```assembly
MOV AX, PTR[BP+DI] ; 将DS:BP+DI地址处的数据加载到AX
寄存器中
MOV PTR[SI], BX ; 将BX寄存器的值存储到ES:SI地址处
```
2. 数据传送和复制:PTR指令可以用于在不同段之间进行数据传送
和复制操作。通过设置指针寄存器的值为源和目标段的基地址,程序
可以将数据从一个段复制到另一个段,实现不同段之间的数据传递。
示例:
```assembly
MOV CX, 200 ; 设置传送数据的长度
MOV DS, SRC_SEG ; 设置源段基地址
MOV ES, DEST_SEG ; 设置目标段基地址
MOV PTR[DI], ES:[SI] ; 复制ES:SI地址处的数据到ES:DI地址处
汇编语言指令集合 吐血整理
取串指令
LODSW(Load string of word)
取串指令
CLD(Clear direction flag)该指令使 DF=0,在执行串操作指令时可使地址自动增量;
STD(Set direction flag) 该指令使 DF=1,在执行串操作指令时可使地址自动减量.
DAA(Decimal adjust after addition)
(3)比较两个带符号数,并根据比较的结果转移
转移
JL(或 LNGE)(Jump if less,or not greater or equal)小于,或者不大于或者等于则
转移
JNL(或 JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于则
JLE(或 JNG)(Jump if less or equal,or not greater)小于或等于,或者不大于则转 移
REPE(Repeat when empty) 若(CX)=0,则退出,否则 CX=CX+1;
REPZ(Repeat when flag )
若 ZF=0,则退出,否则 CX=CX+1;
REPC(Repeat when carry flag)
REPNE(Repeat when not empty)
REPNZ(Repeat when not zero flag)
汇编语言最全指令表
伪指令•
1、定位伪指令
ORG m
•2、定义字节伪指令
DB X1,X2,X3,…,Xn
•3、字定义伪指令
DW Y1,Y2,Y3,…,Yn
4、汇编结束伪指令
END
寻址方式
MCS-51单片机有五种寻址方式:
1、寄存器寻址
2、寄存器间接寻址
3、直接寻址
4、立即数寻址
5、基寄存器加变址寄存器间接寻址
6、相对寻址
7、位寻址
数据传送指令
一、以累加器A为目的操作数的指令(4条)
•MOV A,Rn ;(Rn)→A n=0~7
•MOV A,direct ;(direct )→A
•MOV A,@Ri ;((Ri))→A i=0~1
•MOV A,#data ;data →A
二、以Rn为目的操作数的指令(3条)
MOV Rn ,A;(A)→ Rn
MOV Rn ,direct;(direct )→ Rn
MOV Rn ,#data;data → Rn
•三、以直接寻址的单元为目的操作数的指令(5条)
MOV direct,A;(A)→direct
MOV direct,Rn;(Rn)→direct
MOV direct,direct ;(源direct)→目的direct
MOV direct,@Ri;((Ri))→direct
MOV direct,#data;data→direct
四、以寄存器间接寻址的单元为目的操作数的指令(3条)
MOV @Ri,A;(A)→(Ri)
MOV @Ri,direct;(direct)→(Ri)
MOV @Ri,#data;data→(Ri)
五、十六位数据传送指令(1条)
MOV DPTR,#data16;dataH→DPH,dataL →DPL
CPU常用操作指令(汇编语言)
移位运算指令( 移位运算指令(8条)
位或16位的通用寄存器或存储器内容进行移位 对8位或 位的通用寄存器或存储器内容进行移位,移位次数可以为 ~255 位或 位的通用寄存器或存储器内容进行移位,移位次数可以为1~ 若移位次数为1则可直接写在指令中 若次数为2~ 则可直接写在指令中, 则不能直接写在指令中, 若移位次数为 则可直接写在指令中,若次数为 ~255则不能直接写在指令中, 则不能直接写在指令中 必须先将次数放在寄存器CL中 指令中只能写CL,移位结束后CL的值不变 必须先将次数放在寄存器 中,指令中只能写 ,移位结束后 的值不变 影响标志OF、 、 、 、 , 不确定。 影响标志 、SF、ZF、PF、CF,但 AF不确定。当移位次数为 时, 若移位结 不确定 当移位次数为1时 果使最高位符号位发生变化,则溢出标志OF= ,否则OF= ;当移位次数超过1 果使最高位符号位发生变化,则溢出标志 =1,否则 =0;当移位次数超过 时,OF无效 无效
减法 (5条)
乘法 (2条) 除法 (2条)wk.baidu.com符号扩展 (2条)
MUL s IMUL s DIV s IDIV s CBW CWD DAA AAA DAS AAS AAM AAD
BCD码调 BCD码调 整 (6条)
逻辑运算指令( 逻辑运算指令(5条)
实现与、或、非、异或、测试等逻辑运算 实现与、 异或、 操作数的搭配关系同算术运算 除逻辑“ 指令不影响标志外,其他逻辑运算指令均影响标志SF、 和 , 除逻辑“非”指令不影响标志外,其他逻辑运算指令均影响标志 、ZF和PF, 一定被置0, 不确定 而OF和CF一定被置 ,AF不确定 和 一定被置
《汇编语言程序设计》复习资料
《汇编语言程序设计》复习资料
一、基本概念
1、8088/8086CPU内部寄存器有__14____个
,其中的AX、BX、CX、DX是通用寄存器,SP、BP、DI、SI 是基址和变址寄存器,CS、DS、ES、SS、是段寄存器,此外还有指令指针寄存器 IP 和标志位寄存器 FLAGS 两个控制寄存器,所有寄存器都是 16 _位寄存器,每个寄存器可以存放 16 位二进制数。
2、8088/8086CPU的标志位寄存器中有9个标志位,其中的DF、IF、TF是控制标志,OF、SF、ZF、CF、AF、PF 是状态标志。
3、8088/8086CPU有三组总线,它们是数据总线、控制总线和地址总线;地址总线是 20 条,因此它可以寻址的范围是 1M 字节。通常将 1024 字节称为1K,将 1024K 字节称为1M。
4、8088/8086CPU的存储器采用分段方式管理,每个段最多可以有 64K 字节,全部存储空间可以分成 16 个大小为64K且互相不重叠的段。
5、采用分段方式管理的存储单元的地址分成物理地址和逻辑地址两种,逻辑地址由段地址和偏移地址两部分构成,段地址是每个存储器段的起始地址;偏移地址则是相对于每个段第一个存储单元的偏移值。段地址存放在段寄存器中,由于8088/8086CPU的段寄存器是16位寄存器,因此在段寄存器中存放的是段地址的 16 位;而CPU对数据的存取是按物理地址进行的,物理地址和逻辑地址间的关系是__ 物理地址=段地址 16D(或10H)+ 偏移地址___。
6、存储器中,数据是以字节为单位存放的,它是一个 8位二进制数,16位二进制数是 2个字节,又称为字;每个存储单元可以存放一个字节;一个字则占用两个存储单元,存放时要将低字节放在地址较小的存储单元中。
汇编语言指令详解大全
2
1
SUBB
A,Ri
累加器减去间接RAM带借位
1
1
SUBB
A,data
累加器减去立即数带借位
2
1
逻辑运算类指令
ANL
A,Rnຫໍສະໝຸດ Baidu
寄存器“与”到累加器
1
1
ANL
A,direct
直接地址“与”到累加器
2
1
ANL
A,Ri
间接RAM“与”到累加器
1
1
ANL
A,data
立即数“与”到累加器
Ri,A
直接地址传送到直接地址
1
2
MOV
Ri,direct
直接地址传送到间接RAM
2
1
MOV
Ri,data
立即数传送到间接RAM
2
2
MOV
DPTR,data16
16 位常数加载到数据指针
3
1
MOVC
A,A+DPTR
代码字节传送到累加器
1
2
MOVC
A,A+PC
代码字节传送到累加器
1
2
MOVX
A,Ri
外部RAM8 地址传送到累加器
2
2
LJMP
add16
无条件长转移
汇编语言指令大全
一、数据传输指令
───────────────────────────────────────
它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
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 指定时,
汇编语言常用指令大全
MOV指令为双操作数指令,两个操作数中必须有一个是寄存器.
MOV DST , SRC // Byte / Word
执行操作: dst = src
1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器).
2.立即数不能直接送段寄存器
3.不允许在两个存储单元直接传送数据
4.不允许在两个段寄存器间直接传送信息
PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作.
PUSH SRC //Word
入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器.
入栈时高位字节先入栈,低位字节后入栈.
POP DST //Word
出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器.
执行POP SS指令后,堆栈区在存储区的位置要改变.
执行POP SP 指令后,栈顶的位置要改变.
XCHG(eXCHanG)交换指令: 将两操作数值交换.
XCHG OPR1, OPR2 //Byte/Word
执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp
1.必须有一个操作数是在寄存器中
2.不能与段寄存器交换数据
3.存储器与存储器之间不能交换数据.
XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码.
XLAT (OPR 可选) //Byte
执行操作: AL=(BX+AL)
指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.
LEA(Load Effective Address) 有效地址传送寄存器指令
汇编语言mov指令及基本用法
汇编语⾔mov指令及基本⽤法
在汇编语⾔中,MOV指令是数据传送指令,也是最基本的编程指令,⽤于将⼀个数据从源地址传送到⽬标地址(寄存器间的数据传送本质上也是⼀样的)。其特点是不破坏源地址单元的内容。
例如:
MOV AX,2000H;将16位数据2000H传送到AX寄存器
MOV AL,20H;将8位数据20H传送到AL寄存器
MOV AX,BX;将BX寄存器的16位数据传送到AX寄存器
MOV AL,[2000H];将2000H单元的内容传送到AL寄存器
需要注意的是:
(1)两个存储单元之间不能直接传送数据,即:MOV指令只允许⼀个操作数在存储器中。MOV [SI],[2000H];这是错误的(2)MOV指令中⽴即数不能直接传送给段寄存器(CS、DS、SS、ES)和IP;段寄存器之间不能直接传送。MOV
IP,2000 H ;这是错误的
(3)CS和IP不能作为⽬的操作数。MOV CS,AX ;这是错误的
(4)MOV指令中⽴即数不能作⽬标操作数。MOV 2000H,[SI] ;这是错误的
MOV指令可以在CPU内或CPU和存储器之间传送字或字节,它传送的信息可以从寄存器到寄存器,⽴即数到寄存器,⽴即数到存储单元,从存储单元到寄存器,从寄存器到存储单元,从寄存器或存储单元到除CS外的段寄存器(注意⽴即数不能直接送段寄存器),从段寄存器到寄存器或存储单元。
但是注意
*(1) MOV指令中的源操作数绝对不能是⽴即数和代码段CS寄存器;
(2) MOV指令中绝对不允许在两个存储单元之间直接传送数据;
(3) MOV指令中绝对不允许在两个段寄存器之间直接传送数据;
x86汇编指令整理
x86汇编指令整理
1,寻址⽅式
1,⽴即数寻址
MOV AX, 0102H ;AX←0102H
2、寄存器寻址⽅式
指令中指明某个寄存器其内容即为操作数,寄存器在CPU内,不⽤总线周期,执⾏速度快。 8位寄存器r8:
AH、AL、BH、BL、CH、CL、DH、DL
16位寄存器r16:
AX、BX、CX、DX、SI、DI、BP、SP
4个段寄存器seg:
CS、DS、SS、ES
MOV AX, BX ;AX←BX
3,直接寻址⽅式
指令中直接给出操作数所在内存单元的有效地址
(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、相对变址寻址
指令中给出变址寄存器及位移量,⼆者之和为操作数的有效地址。
汇编语言指令系统整理总结大全
一、通用数据传送指令
1、传送指令 MOV (move)
指令的汇编格式:MOV DST,SRC
指令的基本功能:(DST)<-(SRC)将原操作数(字节或字)传送到目的地址。
指令支持的寻址方式:目的操作数和源操作数不能同时用存储器寻址方式,这个限制适用于所有指令。
指令的执行对标志位的影响:不影响标志位。
指令的特殊要求:目的操作数DST和源操作数SRC不允许同时为段寄存器;
目的操作数DST不能是CS,也不能用立即数方式。
2、进栈指令 PUSH (push onto the stack)
出栈指令 POP (pop from the stack)
指令的汇编格式:PUSH SRC ;POP DST
指令的基本功能:PUSH指令在程序中常用来暂存某些数据,而POP指令又可将这些数据恢复。 PUSH SRC (SP)<-(SP)-2 ;(SP)<-(SRC)
POP DST (DST)<-((SP));(SP)<-(SP)
指令支持的寻址方式:push 和 pop指令不能不能使用立即数寻址方式。
指令对标志位的影响:PUSH 和 POP指令都不影响标志位。
指令的特殊要求:PUSH 和 POP指令只能是字操作,因此,存取字数据后,SP的修改必须是+2 或者 -2;
POP指令的DST不允许是CS寄存器;
3、交换指令 XCHG (exchange)
指令的汇编格式:XCHG OPR1,OPR2
指令的基本功能:(OPR1)<->(OPR2)
指令支持的寻址方式:一个操作数必须在寄存器中,另一个操作数可以在寄存器或存储器中。指令对标志位的影戏:不影响标志位。
汇编 指令合集
汇编语言指令集汇编指令是汇编语言中使用的一些操作符(如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 减之).
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于汇编语言寄存器和指令操作的整理
最近汇编学到后面的内容, 越来越觉得前面的基础没有掌握好, 弄得最后编写汇编程序的时候, 寄存器瞎用, 没有一点的规矩, 中断操作也不知道是对哪个寄存器里的数进行操作, 每次做一个小程序, 都得翻书后面的INT中断查询表, 感觉很不爽, 今天花了大半天把几本关于汇编的书前面的内容又翻了一遍, 结合自己做的笔记, 做了一个简单的整理, 关于寄存器和指令的, 以作复习汇编之用. 关于存哪个数据用哪个寄存器, 我觉得首先要弄清楚各个寄存器的用途, 以及指令是如何操作数据, 操作的哪个寄存器里的数据, 又是将操作完后的结果数据存放到那个寄存器中去的.
计算机内部寄存器阵列l 数据寄存器
l 指针及变址寄存器
l 段寄存器
l 控制寄存器
数据寄存器包括4个16位的寄存器(AX, BX, CX, DX)或者8个8位寄存器( AH, AL, BH, BL, CH, CL, DH, DL)
这些寄存器都可以用来暂时存放操作数, 运算结果以及其他信息, 但同时又具有某些专用用途
l AX 数据累加器
算术运算中的主要寄存器, 在乘除运算中用来指定被除数和被除数, 也是乘, 除,运算后积和商的默认存储单元. 另外I/O指令均使用该寄存器与I/O设备传送信息
l BX 基址寄存器
指令寻址时常用做基址寄存器. 存入偏移量或偏移量的构成成分
l CX 计算寄存器
在循环指令操作或串处理指令中隐含计数
l DX 数据寄存器
在双字节长运算是, 与AX构成32位操作数, DX为高16位. 在某些I/O指令中, DX被用来存放端口地址
指针及变址寄存器这些寄存器都是16位的寄存器, 用来存放16位的操作数或中间结果, 但更经常的用途是存放偏移量, 或位移量
l SP 堆栈指针寄存器
始终只是栈顶的位置, 与SS寄存器一起组成栈顶数据的物理地址
l BP 基址指针寄存器
系统默认其指向堆栈中某一单元, 即提供栈中该单元的偏移量. 加段前缀后, BP可作非堆栈段的地址指针
l SI 源变址寄存器
与DS联用, 指示数据段中某操作的偏移量. 在做串处理时, SI指示源操作数地址, 并有自动增量或自动减量的功能. 变址寻址时, SI与某一位移量共同构成操作数的偏移量
l DI 目的变址寄存器
与DS联用, 指示数据段中某操作数的偏移量, 或与某一位移量共同构成操作数的偏移量. 串处理操作时, DI指示附加段中目的地址, 并有自动增量或减量的功能
段寄存器l CS 代码段
存放当前程序的指令代码
l DS 数据段
存放程序所涉及的源数据或结果
l SS 堆栈段
以”先入后出”为原则的数据区
l ES 附加段
辅助数据区, 存放串或其他数据
控制寄存器l IP 指令指针寄存器
它始终指向当前将要执行指令在代码段中存放的
偏移量
l FR 控制标志位
1. CF 进位标识位
进行加减运算时, 如果最高二进制位产生进位或错位, CF则为1, 否则为0. 程序设计中, 常用条件转移指令JC, JNC指令据此标志位实现转移
2. PF 奇偶标志位
操作结果中二进制位1的个数为偶数是, PF为1, 某则为0
3. AF 辅助进位标志位
运算时半字节产生进位或借位时, AF为1, 某则为0. 主要用于BCD码的调整
4. ZF 零标志位
运算结果为0时, ZF为1, 否则为0
5. SF 符号标志位
当运算结果的最高位为1时, SF为1, 否则为0. 最高位表示符号数的正和负
6. TF 跟踪标志位
用于调试程序时进入单步方式工作. TF=1时, 每条指令执行完后产生一个内部中断, 让用户检查指令运行后寄存器, 存储器和各标志位的内容. TF=0时, CPU工作正常, 不产生内部中断
7. IF 中断允许标志位
IF=1同时中断屏蔽寄存器的相应位为0, 允许系统响应可屏蔽中断, 反之, 不接收外部发出的中断请求
8. DF 方向位标志位
用于控制串操作时地址指针位移方向. 当DF=1时, 指针向高地址方向移动
9. OF 溢出标志位
算术运算时结果超出系统所能表示的数的范围. 溢出时, OF=1
关于汇编代码中的指令 汇编指令语句的格式: [标号:] 指令助记符 [[目的操作数][, 源操作数]] [; 注释]
l 指令助记符
如MOV, SUB这些词分别表示传送, 减法. 汇编源程序时, 系统使用内部对照表将每条指令的助记符翻译成对应的机器码
l 目的操作数
目的操作数一共有两个作用
1. 参与指令操作
2. 暂时储存操作结果
l 源操作数
源操作数主要提供原始数据或操作对象, 面向所有寻址方式. 例如, 在指令SUB AX, BX 中 的值作为减数提供给指令SUB
l 注释
这是对源程序的说明, 在汇编中用 ; 号, 后面的内容将被注释
介绍指令前, 先熟悉下这些在指令中的符号(必须要记得)
l imme: 立即数
l DST: 目的操作数
l SRC: 源操作数
l mem: 存储器操作数
l OPR: 操作数
l reg: 通用寄存器
l EA: 偏移地址(偏移量)
l Sreg: 段寄存器
l Port: 端口地址
l Label: 标号
汇编指令一共可以分为6组:
1. 数据传送指令
2. 算术运算指令
3. 逻辑运算与移位指令
4. 串操作指令
5. 程序控制指令
6. 处理器控制指令
数据传送指令通用数据传送指令:
l MOV DST, SRC ;传送指令: 把源操作数的内容送入目的操作数
注意:
1. 立即数做源操作数时, 立即数的长度必须小于等于目的操作数的长度
2. 操作数DST, SRC分别为reg, reg或reg, Sreg或Sreg, reg时, 两者的长度必须保持一致
3. CS和IP寄存器不能做DST操作数, 不允许用立即数直接为段寄存器赋值
4. 立即数不能作为
目的操作数
5. 不能将一个段寄存器的内容直接送到另一个段寄存器中, 可借助通用寄存器或PUSH, POP指令实现这一要求
l PUSH SRC ;压栈指令: 将一个字数据压入当前栈顶, 位移量disp=-2的地址单元. 数据进栈时, 栈指针SP首先向低地址方向移动两个字节位置, 接着 数据进栈, 形成新的栈顶
l POP DST ;出栈指令: 弹出栈顶元素, 后将栈顶指针向栈底方向移动一个字
l XCHG OPR1, OPR2 ;交换指令: 将这两个操作数交换
地址传送指令:
l LEA DST, SRC ;装载有效地址指令: 该指令将源操作数的偏移量OA装载到目的操作数中
l LDS DST, SRC ;装载数据段指针指令: 将当前数据段中的一个双字数据装入到一个通用寄存器SI(双字数据的低字)和数据段寄存器DS(双字数据的高字)中
l LES DST, SRC ;装载附加段指针指令: 将附加数据段中的一个32位地址数据指针(附加段指针)送到DI(低字)和ES(高字)寄存器中
标志传送指令: (专用于标志寄存器保护和更新的指令, 共四条)
l LAHF ;标志寄存器送AH指令, 将标志寄存器的低字节送入AH中
l SAHF ;AH送标志寄存器指令, 将AH寄存器内容送标志寄存器FR的低字节
l PUSHF ;标志进栈指令, 标志寄存器进栈
l POPF ;标志出栈指令, 标志寄存器出栈
累加器专用传送指令:
l IN AL, Port ;从端口读入数据, 存放在AL中
l OUT Port, AL ;传送AL中的数据到端口
l XLAT OPR或XLAT ;用于将AL中当前的内容转换为一种代码
算术运算指令加法指令:
l ADD DST, SRC ;DST+SRC的和存放到DST中去
l ADC DST, SRC ;带进位加法指令, DST+SRC+CF
l INC DST ;增1指令
减法指令:
l SUB DST, RSC ;DST-SRC, 存放到DST中
l SBB DST, SRC ;带借位减法指令, DST-SRC-CF
l DEC DST ;减1指令
l NEG DST ;求补指令, 求补码
l CMP OPR1, OPR2 ;比较指令
乘法指令:
l MUL SRC ;无符号数乘指令, AL*SRC, 结果放入AX中
l IMUL SRC ;有符号数乘指令, AL*SRC, 结果放入AX中
除法指令:
l DIV SRC ;无符号数除指令, AX/SRC, 商放入AL中, 余数放在AH中
l IDIV SRC ;符号数除指令, AX/SRC, 上放入AL中, 余数放在AH中
l CBW, CWD ;都是符号扩展指令. 将AL的符号扩到AX中; 将AX的符号扩到DX中
逻辑运算与移位指令逻辑运算指令:
l NOT OPR ;逻辑非指令
l AND OPR ;逻辑与指令
l OR OPR ;
逻辑或指令
l XOR OPR ;逻辑异或指令
移位指令:
l SHL DST, CNT ;逻辑左移
l SHR DST, CNT ;逻辑右移
l SAL DST, CNT ;算术左移
l SAR DST, CNT ;算术右移
循环移位指令:
l ROL DST, CNT ;循环左移
l ROR DST, CNT ;循环右移
l RCL DST, CNT ;带进位循环左移
l RCR DST, CNT ;带进位循环右移
串操作指令 l MOVS ;串传送指令
l CMPS ;串比较指令
l SCAS ;串扫描指令
l LODS ;装入串指令
l STOS ;存储串指令
控制转移指令转移指令:
l JMP ;无条件转移指令
l JX ;条件转移指令(JC/JNC, JZ/JNZ, JE/JNE, JS/JNS, JO/JNO, JP/JNP…)
循环指令:
l LOOP 标号 ;该指令执行时, 技术寄存器CXX首先减1, 然后判断CX, 若为0, 跳出循环
条件循环指令:
l LOOPZ/LOOPE, LOOPNZ/LOOPNE ;前者用于找到第一个不为0的事件, 后者用于找到第一个为0的事件
子程序调用指令:
l CALL 子程序名 ;段内直接调用
l RET
中断指令:
l INT N(中断类型号) ;软中断指令
l IRET ;中断返回指令
处理器控制指令标志处理指令:
l CLC ;进位标志CF置0
l CMC ;进位标志CF求反
l STC ;进位标志值1
l CLD ;方向标志置0
l STD ;方向标志置1
l CLI ;中断允许标志置0
l STI ;中断允许标志置1
其他处理器控制指令:
l NOP ;空操作
l HLT ;停机
l WAIT ;等待
l ESC ;换码
l LOCK ;封锁
当然, 汇编还有很多指令, 我这边没有列出来, 用到的时候查查资料就Okay罗.
祝大家周末愉快.