32位汇编指令

合集下载

gd32f3汇编指令

gd32f3汇编指令

gd32f3汇编指令GD32F3是一款32位微控制器,使用汇编语言进行编程时,可以使用一些基本的指令来实现不同的功能。

以下是一些常用的GD32F3汇编指令:1. MOV:将一个值从一个寄存器复制到另一个寄存器。

例如:MOV R0, R1 ;将R1的值复制到R0寄存器2. ADD:将两个值相加,并将结果存储在目标寄存器中。

例如:ADD R0, R1, R2 ;将R1和R2的值相加,结果存储在R0寄存器3. SUB:将两个值相减,并将结果存储在目标寄存器中。

例如:SUB R0, R1, R2 ;将R2的值从R1中减去,结果存储在R0寄存器4. CMP:比较两个值,并根据比较结果设置标志位。

例如:CMP R0, R1 ;比较R0和R1的值5. JMP:无条件跳转到指定地址。

例如:JMP 0x08000100 ;跳转到地址0x080001006. JZ:如果零标志位被设置,则跳转到指定地址。

例如:JZ 0x08000100 ;如果零标志位被设置,则跳转到地址0x080001007. JNZ:如果零标志位没有被设置,则跳转到指定地址。

例如:JNZ 0x08000100 ;如果零标志位没有被设置,则跳转到地址0x080001008. LDR:将数据从内存加载到寄存器中。

例如:LDR R0, [R1] ;将R1地址中的数据加载到R0寄存器9. STR:将寄存器中的数据存储到内存中。

例如:STR R0, [R1] ;将R0寄存器中的数据存储到R1地址10. PUSH:将寄存器中的值推入堆栈。

例如:PUSH {R0, R1, R2} ;将R0、R1、R2的值推入堆栈11. POP:将堆栈中的值弹出到寄存器中。

例如:POP {R0, R1, R2} ;将堆栈中的值弹出到R0、R1、R2寄存器这些是一些常用的GD32F3汇编指令,可以根据具体的需求进行使用。

在实际编程中,还可以结合其他指令和操作码来实现更复杂的功能。

16位与32位汇编语言常用指令总结

16位与32位汇编语言常用指令总结

16位与32位汇编语言常用指令总结在计算机编程领域,汇编语言被广泛应用于底层程序设计,直接操作计算机硬件。

其中,16位和32位汇编语言是常见的两种类型。

本文将总结这两种汇编语言中常用的指令,帮助读者更好地理解和应用它们。

一、16位汇编语言常用指令1. 数据传送指令- MOV:将数据从一个寄存器或内存位置传送到另一个寄存器或内存位置。

- XCHG:交换两个寄存器或内存位置的数据。

2. 算术运算指令- ADD/SUB:实现加法和减法运算。

- MUL/IMUL:实现无符号与有符号乘法运算。

- DIV/IDIV:实现无符号与有符号除法运算。

3. 逻辑运算指令- AND/OR/XOR:实现与、或、异或逻辑运算。

- NOT:对操作数进行按位取反操作。

4. 条件转移指令- JMP:无条件跳转到指定地址。

- JZ/JNZ:根据零标志位(ZF)的值进行跳转。

- JC/JNC:根据进位标志位(CF)的值进行跳转。

5. 循环指令- LOOP:根据计数器的值进行循环。

- JCXZ/JECXZ:根据CX/ECX寄存器的值进行循环。

二、32位汇编语言常用指令1. 数据传送指令- MOV:同16位汇编语言中的指令,用于数据传送。

- PUSH/POP:将数据推入栈或从栈中弹出。

2. 算术运算指令- ADD/SUB:同16位汇编语言中的指令,用于加法和减法运算。

- MUL/IMUL:同16位汇编语言中的指令,用于乘法运算。

- DIV/IDIV:同16位汇编语言中的指令,用于除法运算。

3. 逻辑运算指令- AND/OR/XOR:同16位汇编语言中的指令,用于逻辑运算。

- NOT:同16位汇编语言中的指令,用于按位取反。

4. 条件转移指令- JMP:同16位汇编语言中的指令,用于无条件跳转。

- JZ/JNZ:同16位汇编语言中的指令,根据零标志位(ZF)进行跳转。

- JB/JNB:根据低位借位标志位(CF)进行跳转。

5. 循环指令- LOOP:同16位汇编语言中的指令,用于循环操作。

x86 cmpl汇编指令

x86 cmpl汇编指令

cmpl是x86 架构中的汇编指令,它是"compare long" 的缩写。

该指令用于比较两个长整数(通常是32 位)并设置处理器的状态标志,以便进行后续的条件跳转或其他操作。

指令格式如下:
复制代码
cmpl operand1, operand2
•operand1和operand2是要比较的两个操作数。

它们可以是寄存器、内存地址或立即数。

当执行cmpl指令时,处理器会比较operand1和operand2的值,并根据比较结果设置状态标志(如ZF, SF, OF, AF, PF, CF)。

这些标志可以用于后续的条件跳转或其他条件操作。

需要注意的是,cmpl指令本身并不将结果存储在目标操作数中,而是仅设置状态标志。

如果需要存储比较的结果,可以使用其他指令,如subl(减去并存储结果)或cmovl(条件移动)。

此外,cmpl指令还有其他相关的比较指令,如cmpls(比较字符串)和cmpw(比较字)、cmpb(比较字节)等,用于处理不同大小的数据类型。

需要注意的是,汇编语言的具体语法和指令集可能因不同的处理器架构和操作系统而有所不同。

因此,在实际使用时,请参考相关的处理器手册和汇编语言指南以获取准确的信息。

32位汇编语言学习笔记3leal和算术运算指令

32位汇编语言学习笔记3leal和算术运算指令

32位汇编语言学习笔记3leal和算术运算指令32位汇编语言学习笔记在学习汇编语言的过程中,我们已经了解了一些基本指令和寄存器的用法。

本文将继续介绍两个重要的指令:leal指令和算术运算指令。

通过深入了解和学习这两个指令,我们将更好地理解和掌握汇编语言编程的技巧和方法。

一、leal指令leal指令用于将一个有效地址(Effective Address,EA)加载到目标操作数中。

它的一般格式为:leal Source, Destination。

在这个指令中,Source表示源操作数,可以是寄存器、内存或立即数。

Destination表示目标操作数,只能是寄存器。

leal指令在源操作数的基础上进行计算,将计算结果存储到目标操作数中。

下面是一些leal指令的示例:1. leal (%eax,%ebx,4), %edx这条指令将地址(%eax + %ebx * 4)的结果存储到%edx寄存器中。

其中,%eax是个基址寄存器,%ebx是个变址寄存器,4表示缩放因子。

2. leal -8(%ebp), %ecx这条指令将地址(%ebp - 8)的结果存储到%ecx寄存器中。

其中,%ebp是个基址寄存器,-8是个偏移量。

需要注意的是,leal指令只能进行地址计算,并将结果存储到目标操作数中,不能进行实际的加载操作。

二、算术运算指令在汇编语言中,算术运算指令主要用于进行数值的计算和操作。

常见的算术运算指令包括add、sub、mul、div等。

这些指令可以对数据寄存器和内存中的数据进行四则运算。

下面是一些常用的算术运算指令及其示例:1. add指令:用于将两个操作数相加,并存储结果到目标操作数中。

一般格式为:add Source, Destination。

示例:add %eax, %ebx这条指令将%eax和%ebx寄存器中的值相加,结果存储到%ebx中。

2. sub指令:用于将第一个操作数减去第二个操作数,并将结果存储到目标操作数中。

ARM汇编指令列表

ARM汇编指令列表

ARM汇编伪指令ARM条件码CPSR位[31:24]为条件位域,用f表示;位[23:16]为状态位域,用s表示;位[15:8] 为扩展位域,用x表示;位[7:0] 为控制位域,用c表示;与指令MSR相关关于移位中断向量表APCS寄存器使用约定Load and Store指令LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。

LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。

LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。

LDR R0,[R1,R2] !;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDR R0,[R1,#8] !;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址 R1+8写入R1。

LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址 R1+R2写入R1。

LDR R0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器 R0,并将R0的高24 位清零。

LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将 R0的高24位清零。

LDRH R0,[R1] ;将存储器地址为R1的半字数据读入寄存器 R0,并将R0的高16位清零。

LDRH R0,[R1,#8] ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0 的高16位清零。

LDRH R0,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将 R0的高16位清零。

WIN32汇编程序PPT课件

WIN32汇编程序PPT课件

例4
count darray
.model small .386
;采用32位指令
.stack
.data
equ 10
dd 20,4500h,3f40h,-1,7f000080h
dd 81000000h,0fffffff1h
dd -45000011,12345678
dd 87654321
.code
.startup
条件转移
转移范围可达到32位全偏移
Jcc label
;cc为真,转移到label指定的转段移内范偏围移仍地为址处短转移
JECXZ label ;ECX=0,转移到label指定的段内偏移地址处
LOOP/LOOPZ/LOOPNZ label ;循环指令,32位段采用ECX作为计数器
例1
;将AX的每一位依次重复一次 ;所得的32位结果保存于EAX中 mov ecx,16 mov bx,ax next:shr ax,1 rcr edx,1 shr bx,1 rcr edx,1 loop next mov eax,edx
;平衡堆栈
通用寄存器全部进出栈
PUSHA
;顺序将AX/CX/DX/BX/SP/BP/SI/DI压入堆栈
POPA
;顺序从堆栈弹出 DI/SI/BP/SP/BX/DX/CX/AX (与PUSHA相反) ;其中应进入SP的值被舍弃,并不进入SP,SP 通过增加16来恢复
符号扩展和零位扩展
MOVSX r16,r8/m8 ;把r8/m8符号扩展并传送至r16 MOVSX r32,r8/m8/r16/m16 ;把r8/m8/r16/m16符号扩展并传送至r32 MOVZX r16,r8/m8
三、32位指令的程序设计

windows环境下32位汇编语言程序设计附书代码

windows环境下32位汇编语言程序设计附书代码

windows环境下32位汇编语言程序设计附书代码汇编语言是一种底层计算机语言,用于编写与计算机硬件直接交互的程序。

在Windows环境下,可以使用32位汇编语言进行程序设计。

本文将介绍一些常见的32位汇编语言程序,并附带相关的代码示例。

1.程序的基本结构:在32位汇编语言中,程序的基本结构由三个部分组成:数据段、代码段和堆栈段。

数据段用来声明和初始化程序中使用的全局变量和常量。

例如,下面的代码段声明了一个全局变量message,存储了一个字符串。

```data segmentmessage db 'Hello, World!',0data ends```代码段包含了程序的实际执行代码。

下面的代码段使用`mov`指令将message变量中的字符串存储到寄存器eax中,并使用`int 21h`来调用MS-DOS功能1来显示字符串。

```code segmentstart:mov eax, offset messagemov ah, 09hint 21hmov ah, 4chint 21hcode ends```堆栈段用来存储函数调用过程中的局部变量和返回地址。

2.入栈和出栈操作:在程序中,我们经常需要使用堆栈来保存和恢复寄存器的值,以及传递函数参数和保存函数返回值。

以下是一些常用的堆栈操作指令: ```push reg ;将reg中的值压入堆栈pop reg ;将堆栈顶部的值弹出到reg中```下面的示例演示了如何使用堆栈来保存和恢复寄存器的值:```code segmentstart:push eax ;将eax保存到堆栈mov eax, 10 ;设置eax的值为10pop ebx ;将堆栈顶部的值弹出到ebxadd eax, ebx ;将eax和ebx相加int 3 ;调试中断,用于程序的暂停mov ah, 4chint 21hcode ends```3.条件判断和跳转指令:汇编语言中的条件判断和跳转指令用于根据条件的成立与否来改变程序的执行流程。

汇编addss指令

汇编addss指令

汇编addss指令
ADDSS 是x86 架构下的SIMD (单指令多数据) 指令,属于SSE (Streaming SIMD Extensions) 指令集的一部分。

它主要用于浮点数计算。

ADDSS 指令执行单精度浮点数(32位)的加法操作。

它操作两个源操作数,并将结果存储在目标操作数中。

指令格式如下:
css
ADDSS xmm1, xmm2/m32
xmm1:目标操作数,一个128 位的XMM 寄存器,用于存储加法结果。

xmm2:第一个源操作数,也是一个128 位的XMM 寄存器。

m32:第二个源操作数,一个32 位的内存地址。

操作:
xmm2 的低32 位与m32 的内容进行加法操作。

结果存储在xmm1 的低32 位中,而xmm1 的高96 位保持不变。

注意:ADDSS 只操作低32 位的单精度浮点数,而忽略其他位。

在实际应用中,这种指令通常用于图形处理、物理模拟、科学计算等需要高速浮点运算的场景。

例如,下面的汇编代码展示了如何使用ADDSS 指令:
assembly
; 假设xmm0 中存储了一个单精度浮点数a
; 假设内存地址[address] 中也存储了一个单精度浮点数b
addss xmm0, [address] ; 将a 和b 相加,结果存储在xmm0 中
需要注意的是,为了充分发挥SSE 指令集的性能,通常需要结合其他指令和数据对齐技术来使用。

同时,现代的处理器和编译器也提供了更高级别的SIMD 指令集,如AVX、AVX2、AVX-512 等,这些指令集提供了更宽的数据路径和更多的操作功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用OD和CE,总不断找汇编资料,解读指令,实在是累。

总算找到篇比较完整的资料,与大家分享。

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位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。

寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

变址寄存器不可分割成8位寄存器。

作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

它们可作一般的存储器指针使用。

在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。

3、指针寄存器其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。

32位CPU有2个32位通用寄存器EBP和ESP。

它们主要用于访问堆栈内的存储单元,并且规定:EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;ESP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。

寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

指针寄存器不可分割成8位寄存器。

作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

4、段寄存器段寄存器是根据内存分段的管理模式而设置的。

内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。

CPU内部的段寄存器:ECS——代码段寄存器(Code Segment Register),其值为代码段的段值;EDS——数据段寄存器(Data Segment Register),其值为数据段的段值;EES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;ESS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;EFS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;EGS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。

在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。

32位CPU有两个不同的工作方式:实方式和保护方式。

在每种方式下,段寄存器的作用是不同的。

有关规定简单描述如下:实方式:前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为“段值:偏移量”的形式。

为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。

保护方式:在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。

5、指令指针寄存器32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。

指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。

在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。

所以,在理解它们的功能时,不考虑存在指令队列的情况。

6、标志寄存器一、运算结果标志位1、进位标志CF(Carry Flag)进位标志CF主要用来反映运算是否产生进位或借位。

如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。

2、奇偶标志PF(Parity Flag)奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。

如果“1”的个数为偶数,则PF的值为1,否则其值为0。

利用PF可进行奇偶校验检查,或产生奇偶校验位。

在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。

3、辅助进位标志AF(Auxiliary Carry Flag)在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:(1)、在字操作时,发生低字节向高字节进位或借位时;(2)、在字节操作时,发生低4位向高4位进位或借位时。

对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。

4、零标志ZF(Zero Flag)零标志ZF用来反映运算结果是否为0。

如果运算结果为0,则其值为1,否则其值为0。

在判断运算结果是否为0时,可使用此标志位。

5、符号标志SF(Sign Flag)符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。

在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的正负号。

运算结果为正数时,SF的值为0,否则其值为1。

6、溢出标志OF(Overflow Flag)溢出标志OF用于反映有符号数加减运算所得结果是否溢出。

如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

“溢出”和“进位”是两个不同含义的概念,不要混淆。

如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。

二、状态控制标志位状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。

1、追踪标志TF(Trap Flag)当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。

这种方式主要用于程序的调试。

指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。

2、中断允许标志IF(Interrupt-enable Flag)中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。

但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。

具体规定如下:(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。

CPU的指令系统中也有专门的指令来改变标志位IF的值。

3、方向标志DF(Direction Flag)方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。

具体规定在第5.2.11节——字符串操作指令——中给出。

在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。

三、32位标志寄存器增加的标志位1、I/O特权标志IOPL(I/O Privilege Level)I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。

该字段指定了要求执行I/O指令的特权级。

如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。

2、嵌套任务标志NT(Nested Task)嵌套任务标志NT用来控制中断返回指令IRET的执行。

具体规定如下:(1)、当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回操作;(2)、当NT=1,通过任务转换实现中断返回。

3、重启动标志RF(Restart Flag)重启动标志RF用来控制是否接受调试故障。

规定:RF=0时,表示“接受”调试故障,否则拒绝之。

在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。

4、虚拟8086方式标志VM(Virtual 8086 Mode)如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。

汇编指令集合一、常用指令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 为查表结果. ( [B X+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 ;把段地址:偏移地址存到ESDI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FSD.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GSDI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SSDI.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 I 目标串段寄存器:目标串变址.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.简单的条件转移指令JZ(或jE) OPR---------------结果为零转移, 测试条件ZF=1JNZ(或jNE) OPR --------------结果不为零转移,测试条件ZF=0JS OPR----------------------结果为负转移, 测试条件SF=1JNS OPR---------------------结果为正转移, 测试条件SF=0JO OPR--------------------- 溢出转移, 测试条件OF=JNO OPR --------------------不溢出转移, 测试条件SF=0JP OPR ---------------------结果为偶转移, 测试条件SF=1JNP OPR --------------------结果为奇转移, 测试条件SF=0JC OPR -------------------- 有进位转移, 测试条件SF=1JNC OPR --------------------无进位转移, 测试条件SF=02.无符号比较条件转移指令(以下指令经常是CMP OPD,OPS后面的指令根据比较结果来实现转移) JB(或JNAE) opd --------------小于或者不大于等于则转移JNB(或JAE) opd---------------不小于或者大于等于则转移JA(或NJBE) OPD---------------大于或者不小于等于则转移JNA(或JBE) OPD---------------不大于或者小于等于则转移3.带符号比较条件转移指令JL(或JNGE) --------------小于或者不大于等于则转移JNL(或JGE)--------------不小于或者大于等于则转移JG(或NJLE)---------------大于或者不小于等于则转移JNG(或JLE)---------------不大于或者小于等于则转移六、调用子程序与返回指令CALL 子程序调用指令RET 子程序返回指令六、其它指令OFFSET -------------------- 返回偏移地址SEG -------------------- 返回段地址EQU(=) -------------------- 等值语句PURGE -------------------- 解除语句DUP -------------------- 操作数字段用复制操作符SEGMENT,ENDS -------------------- 段定义指令ASSUME -------------------- 段地址分配指令ORG -------------------- 起始偏移地址设置指令$ --------------------地址计数器的当前值PROC,ENDP -------------------- 过程定义语句NAME,TITLE,END -------------------- 程序开始结束语句MACRO,ENDM --------------------宏定义指令XLAT (TRANSLATE)-------------------- 换码指令----七、条件标志ZF 零标志-- 当结果为负时,SF=1,否则,SF=0.AF 辅助进位标志---运算过程中第三位有进位值,置AF=1,否则,AF=0 PF 奇偶标志------当结果操作数中偶数个"1",置PF=1,否则,PF=0SF 符号标志----当结果为负时,SF=1;否则,SF=0.溢出时情形例外CF 进位标志----- 最高有效位产生进位值,例如,执行加法指令时,MSB有进位,置CF=1;否则,CF=0. OF 溢出标志-----若操作数结果超出了机器能表示的范围,则产生溢出,置OF=1,否则,OF=0。

相关文档
最新文档