汇编指令
### 汇编指令知识点详解 #### 一、通用指令 **1. MOV(移动)** - **格式**: `MOV DST, SRC` - **执行效果**: `(DST) <- (SRC)` - **功能**: 将源操作数(SRC)中的值复制到目标操作数(DST)中。 **2. PUSH(压栈)** - **格式**: `PUSH SRC` - **执行效果**: `(SP) <- (SP) - 2` 和 `((SP) + 1, (SP)) <- (SRC)` - **功能**: 将一个值(SRC)压入栈中。栈指针(SP)先减2,然后将值存入栈顶。 **3. POP(出栈)** - **格式**: `POP DST` - **执行效果**: `(DST) <- ((SP) + 1, (SP))` 和 `(SP) <- (SP) + 2` - **功能**: 从栈中弹出一个值并将其存储在目标操作数(DST)中。栈指针(SP)先加2,然后读取栈顶的值。 **4. XCHG(交换)** - **格式**: `XCHG OPR1, OPR2` - **执行效果**: `(OPR1) <-> (OPR2)` - **功能**: 交换两个操作数(OPR1与OPR2)的值。 #### 二、输入/输出指令 **1. IN(输入)** - **格式**: - `IN AL, PORT(直接)` 或 `IN AX, PORT()` - `IN AL, DX(直接)` 或 `IN AX, DX()` - **执行效果**: - `(AL) <- (PORT)(直接)` 或 `(AX) <- (PORT+1, PORT)()` - `AL <- ((DX))(直接)` 或 `AX <- ((DX)+1, DX)()` - **功能**: 用于从指定端口(PORT或DX指向的端口)读取数据到AL或AX寄存器中。 - **注意**: - 前者适用于端口地址不超过256的情况,后者则适用于任何端口地址。 - IBM-PC系统支持65536个I/O端口,端口地址范围为0000H至FFFFH。 **2. OUT(输出)** - **格式**: - `OUT PORT, AL(直接)` 或 `OUT PORT, AX()` - `OUT DX, AL(直接)` 或 `OUT DX, AX()` - **执行效果**: - `(PORT) <- (AL)(直接)` 或 `(PORT+1, PORT) <- (AX)()` - `((DX)) <- (AL)(直接)` 或 `((DX)+1, DX) <- (AX)()` - **功能**: 用于将AL或AX寄存器中的数据写入到指定端口(PORT或DX指向的端口)。 **3. XLAT(查表)** - **格式**: - `XLAT OPR` - `XLAT` - **执行效果**: `(AL) <- ((BX) + (AL))` - **功能**: 查表指令,用于将AL寄存器中的值与BX寄存器指向的地址偏移量相加,并将结果存入AL中。 #### 三、加载有效地址指令 **1. LEA(加载有效地址)** - **格式**: `LEA REG, SRC` - **执行效果**: `(REG) <- (SRC)` - **功能**: 将源操作数的有效地址加载到目的寄存器中。 **2. LDS(加载DS段基址)** - **格式**: `LDS REG, SRC` - **执行效果**: `(REG) <- (SRC)` 和 `(DS) <- (SRC + 2)` - **功能**: 将源操作数的有效地址加载到目的寄存器中,并且将源操作数高两字节指向的数据段寄存器(DS)设置为DS。 **3. LES(加载ES段基址)** - **格式**: `LES REG, SRC` - **执行效果**: `(REG) <- (SRC)` 和 `(ES) <- (SRC + 2)` - **功能**: 将源操作数的有效地址加载到目的寄存器中,并且将源操作数高两字节指向的数据段寄存器(ES)设置为ES。 #### 四、标志寄存器指令 **1. LAHF(加载AH为标志)** - **格式**: `LAHF` - **执行效果**: `(AH) <- (PWS寄存器的部分位)` - **功能**: 将部分标志寄存器(PWS)中的位复制到AH寄存器中。 **2. SAHF(存储AH到标志)** - **格式**: `SAHF` - **执行效果**: `(PWS寄存器的部分位) <- (AH)` - **功能**: 将AH寄存器中的值复制到部分标志寄存器(PWS)中。 **3. PUSHF(压栈标志)** - **格式**: `PUSHF` - **执行效果**: `(SP) <- (SP) - 2` 和 `((SP) + 1, (SP)) <- (PSW)` - **功能**: 将当前的标志寄存器(PSW)的值压入栈中。 **4. POPF(出栈标志)** - **格式**: `POPF` - **执行效果**: `(PWS) <- ((SP) + 1, (SP))` 和 `(SP) <- (SP) + 2` - **功能**: 从栈中弹出一个值并将其存储到标志寄存器(PWS)中。 #### 五、算术运算指令 **1. 加法指令** **ADD(加法)** - **格式**: `ADD DST, SRC` - **执行效果**: `(DST) <- (SRC) + (DST)` - **功能**: 将源操作数(SRC)与目标操作数(DST)相加,并将结果存入DST中。 **ADC(带进位加法)** - **格式**: `ADCDST, SRC` - **执行效果**: `(DST) <- (SRC) + (DST) + CF` - **功能**: 将源操作数(SRC)、目标操作数(DST)以及进位标志(CF)相加,并将结果存入DST中。 **INC(加1)** - **格式**: `INC OPR` - **执行效果**: `(OPR) <- (OPR) + 1` - **功能**: 将操作数(OPR)加1。 **2. 减法指令** **SUB(减法)** - **格式**: `SUB DST, SRC` - **执行效果**: `(DST) <- (DST) - (SRC)` - **功能**: 将源操作数(SRC)从目标操作数(DST)中减去,并将结果存入DST中。 **SBB(带借位减法)** - **格式**: `SBB DST, SRC` - **执行效果**: `(DST) <- (DST) - (SRC) - CF` - **功能**: 将源操作数(SRC)、目标操作数(DST)以及进位标志(CF)进行减法运算,并将结果存入DST中。 **DEC(减1)** - **格式**: `DEC OPR` - **执行效果**: `(OPR) <- (OPR) - 1` - **功能**: 将操作数(OPR)减1。 **NEG(求补)** - **格式**: `NEG OPR` - **执行效果**: `(OPR) <- -(OPR)` - **功能**: 求操作数(OPR)的补码。 **CMP(比较)** - **格式**: `CMP OPR1, OPR2` - **执行效果**: `(OPR1) - (OPR2)` - **功能**: 计算操作数(OPR1)与(OPR2)之间的差值,但不保存结果,仅更新标志寄存器中的状态位。 **3. 乘法指令** **MUL(无符号乘法)** - **格式**: `MUL SRC` - **执行效果**: - 如果是字节操作数:`(AX) <- (AL) * (SRC)` - 如果是字操作数:`(DX, AX) <- (AX) * (SRC)` - **功能**: 将AL或AX寄存器中的值与源操作数(SRC)相乘,并根据操作数类型将结果存入相应的寄存器中。 **IMUL(有符号乘法)** - **格式**: `IMUL SRC` - **执行效果**: 功能与MUL相同,但在计算时考虑操作数的符号。 - **功能**: 执行有符号乘法操作。