### 汇编语言指令集解析 #### 一、引言 汇编语言是一类低级编程语言,它为特定的计算机硬件系统提供了一种直接而详细的控制方式。本篇文章将详细解读“附录B8086/8088汇编语言指令表”中的指令集,并对每种指令的功能、格式及其应用场景进行阐述。这不仅有助于理解这些基本的指令如何运作,还能加深对8086/8088架构的理解。 #### 二、数据传送指令 **1. MOV (Move)** - **功能**: 从`src`源位置取出数据,或把立即数作为源数据,将其送到目的操作数`dst`。 - **格式**: `MOV dst, src` - **示例**: `MOV AX, BX` (将BX寄存器中的值复制到AX寄存器) **2. PUSH (Push)** - **功能**: 将字操作数`src`压入堆栈。 - **格式**: `PUSH src` - **示例**: `PUSH AX` (将AX寄存器中的值压入堆栈) **3. POP (Pop)** - **功能**: 从堆栈中弹出一个字数据,送入`dst`操作数。 - **格式**: `POP dst` - **示例**: `POP BX` (从堆栈中弹出数据并存入BX寄存器) **4. XCHG (Exchange)** - **功能**: 交换`dst`和`src`两个操作数的内容。 - **格式**: `XCHG dst, src` - **示例**: `XCHG AX, BX` (交换AX和BX寄存器中的值) **5. XLAT (Translate)** - **功能**: 从数据段中以`BX + AL`的和作为偏移地址取出一个字节数据,并存入AL寄存器。 - **格式**: `XLAT` - **示例**: 假设`(BX + AL)`指向内存地址0x1000,那么`XLAT`会将该地址处的数据存入AL寄存器 **6. LEA (Load Effective Address)** - **功能**: 取操作数`src`在内存中的偏移地址,并送入`dst`寄存器。 - **格式**: `LEA dst, src` - **示例**: `LEA SI, [BX + DI]` (将[BX + DI]指向的内存地址存入SI寄存器) **7. PUSHF / POPF (Push / Pop Flags)** - **功能**: 分别将标志寄存器`FLAGS`压入堆栈或从堆栈弹出至`FLAGS`。 - **格式**: `PUSHF` / `POPF` - **示例**: `PUSHF` (将当前的标志寄存器内容压入堆栈) **8. IN / OUT (Input / Output)** - **功能**: `IN`用于从外部设备端口读取数据;`OUT`用于将数据写入外部设备端口。 - **格式**: `IN dst, src` / `OUT dst, src` - **示例**: `IN AL, 0x3F8` (从0x3F8端口读取一个字节数据到AL寄存器) #### 三、算术运算指令 **1. ADD (Add)** - **功能**: 对两个操作数求和,并将结果存入`dst`。 - **格式**: `ADD dst, src` - **示例**: `ADD AX, 1` (将AX寄存器中的值加1) **2. ADC (Add with Carry)** - **功能**: 对两个操作数以及进位标志CF求和,并将结果存入`dst`。 - **格式**: `ADC dst, src` - **示例**: `ADC AX, BX` (将AX和BX寄存器中的值加上CF的值,结果存入AX) **3. INC / DEC (Increment / Decrement)** - **功能**: 将操作数`opr`加1或减1。 - **格式**: `INC opr` / `DEC opr` - **示例**: `INC CX` (CX寄存器中的值加1) **4. SUB / SBB (Subtract / Subtract with Borrow)** - **功能**: `SUB`用于计算`dst - src`;`SBB`用于计算`dst - src - CF`。 - **格式**: `SUB dst, src` / `SBB dst, src` - **示例**: `SUB AX, 1` (AX寄存器中的值减1) **5. MUL / IMUL (Unsigned / Signed Multiply)** - **功能**: 无符号或带符号乘法。 - **格式**: `MUL src` / `IMUL src` - **示例**: `MUL BL` (将AL寄存器中的值与BL寄存器中的值相乘,结果存入AX) **6. DIV / IDIV (Unsigned / Signed Divide)** - **功能**: 无符号或带符号除法。 - **格式**: `DIV src` / `IDIV src` - **示例**: `DIV BL` (将AX寄存器中的值与BL寄存器中的值相除,商存入AL,余数存入AH) **7. CMP (Compare)** - **功能**: 计算`dst - src`的结果,并设置相应的标志位。 - **格式**: `CMP dst, src` - **示例**: `CMP AX, BX` (比较AX和BX寄存器中的值,并设置标志位) #### 四、逻辑运算指令 **1. AND / OR / XOR (Logical AND / OR / XOR)** - **功能**: 按位执行逻辑运算,并将结果存入`dst`。 - **格式**: `AND dst, src` / `OR dst, src` / `XOR dst, src` - **示例**: `AND AX, BX` (将AX和BX寄存器中的值按位与,结果存入AX) **2. NOT (Complement)** - **功能**: 对操作数`opr`的每个二进制位取反。 - **格式**: `NOT opr` - **示例**: `NOT AX` (将AX寄存器中的值的每一位取反) **3. TEST (Test)** - **功能**: 对两个操作数进行按位与运算,并根据结果设置标志位。 - **格式**: `TEST dst, src` - **示例**: `TEST AX, 0x01` (检查AX寄存器中最低位是否为1) **4. SHL / SHR (Shift Left / Shift Right)** - **功能**: 将`dst`中的数据向左或向右移动`src`位。 - **格式**: `SHL dst, src` / `SHR dst, src` - **示例**: `SHL AX, 1` (将AX寄存器中的数据向左移动一位) #### 五、BCD运算指令 **1. DAA / DAS (Decimal Adjust After Addition / Subtraction)** - **功能**: 调整AL寄存器中的值,使其成为压缩的BCD格式。 - **格式**: `DAA` / `DAS` - **示例**: `DAA` (将AL寄存器中的和调整为压缩的BCD格式) **2. AAA / AAS (Adjust After Addition / Subtraction)** - **功能**: 调整AL寄存器中的值,使其成为非压缩的BCD格式。 - **格式**: `AAA` / `AAS` - **示例**: `AAA` (将AL寄存器中的和调整为非压缩的BCD格式) **3. AAM / AAD (Adjust After Multiply / Divide)** - **功能**: 调整乘法或除法的结果,使其成为非压缩的BCD格式。 - **格式**: `AAM` / `AAD` - **示例**: `AAM` (将AH寄存器中的乘积调整为非压缩的BCD格式) 通过上述指令集的学习,我们可以更深入地了解8086/8088处理器的内部工作原理,这对于编写高效的底层代码至关重要。



















