Bootstrap

16ASM 数据传送指令 算数运算指令

目录

指令种类

数据传送指令

通用传送指令

堆栈操作指令

标志寄存器进出堆栈指令

地址传送指令

算术运算指令

加法减法指令

乘法除法指令


指令种类

数据传送类指令

  • 通用数据传送指令:MOV ,XCHG,XLAT
  • 堆栈传送指令:PUSH,POP,LEA

算术运算指令:负责算术运算,影响标志位

位操作类指令

控制转移类指令

处理器控制类指令

数据传送指令

MOV,XCHG,XLAT

传送类指令不影响标志位,除了标志位传送指令外。

通用传送指令

mov指令

把一个字节或字的操作数从源地址传送至目的地址。注意:不存在存储器向存储器的传送指令。

举例:mov ax,es ;ax←es    mov  ds,ax ;ds←ax←es    mov word ptr [si+2],0bh

注意: 两个操作数类型要一致.操作宽度

不允许段寄存器向段寄存器传送

xchg指令

把两个地方的数据进行互换。不存在存储器向存储器的传送指令。

XCHG reg,reg/mem; reg <->reg/mem

应用场景1.寄存器与寄存器之间对换数据 2.寄存器与存储器之间对换数据

效率:XCHG > MOV :因为XCHG使用了内部暂存器。

示例:xchg ax,bx

xlat指令

将BX指定的缓冲区中、AL指定的位偏移的一个字节数据取出赋给AL。

XLAT ; AL <- DS:[BX+AL] //注意:无显式操作数,隐式操作数。

应用:数组遍历。以BX作为数组首地址,AL作为数组下标,访问的值存储给AL。AL = BX[AL];

作用宽度:8位(字节),固定的,不可改变。也叫累加器专用指令。

堆栈操作指令

push:将标志寄存器的内容压入堆栈,同时栈顶指针SP减2 模拟:sub sp , 2; mov [sp] , reg

pop:将栈顶单元内容送到标志寄存器,同时栈顶指针SP 加 2 模拟:movreg, [sp];add sp , 2

应用:1. 临时存放数据,2. 传递参数,3. 保存所有寄存器环境

注意:1. 低地址方向为栈出口方向,高地址方向为栈底方向。

           2. 操作单位是字16位

标志寄存器进出堆栈指令

标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作。

低八位传送:LAHF和SAHF

LAHF指令将标志寄存器的低字节送寄存器AH

LAHF;AH←FLAGS的低字节

SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意

SAHF将AH寄存器内容送FLAGS的低字节

SAHF;FLAGS的低字节←AH

用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志

16位传送:PUSHF和POPF

pushf:将标志寄存器的内容压入堆栈,同时栈顶指针SP减2

popf:将栈顶单元内容送到标志寄存器,同时栈顶指针SP加2

问题:修改标志寄存器中TF标志位的方法?

思路:将标志寄存器压入栈中,然后弹出栈顶内容(标志寄存器的内容)。修改该值,然后将修改后的值压入栈,通过POPF,将修改后的值弹出到标志寄存器。

地址传送指令

将存储器单元的逻辑地址送至指定的寄存器。

  • 有效地址传送指令 LEA
  • 指针传送指令 LDS 和 LES

作用:

  • 取全局变量的地址
  • 代替加法指令表,如:多个寄存器做加法运算。【32位没有EA限制,可大大的替换】

lea指令:将存储器操作数的有效地址传送至指定的16位寄存器中

举例: LEA bx ,[bx + si] //相当于bx = bx+si。

lds指令:LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器

举例:LDS r16,mem;r16←mem,;DS←mem+2

les指令:LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器

LES r16,mem;r16←mem,;ES←mem+2

算术运算指令

标志一览

进位标志反映无符号整数运算结果是否超出范围有进位,加上进位或借位后运算结果仍然正确

溢出标志反映有符号整数运算结果是否超出范围有溢出,运算结果已经不正确

加法减法指令

add指令:

adc指令

sub指令

sbb指令

inc指令:对操作数加1(增量)再将结果返回原处。不影响进位CF标志,影响其他状态标志位

dec指令:对操作数减1(减量)再将结果返回原处。不影响进位CF标志,影响其他状态标志位

neg ax ;如果ax = 0,则CF标志位 = 0;若ax != 0, 则CF = 1

乘法除法指令

计算机的乘法指令分为无符号乘法指令和有符号乘法指令。

它们的唯一区别就在于: 数据的最高位是作为“数值”参与运算,还是作为“符号位”参与运算。

功能:指令的功能是把显式操作数和隐含操作数相乘,并把乘积存入相应的寄存器中。

无符号乘法

mov ax, 5      ; 将 5 存储到累加器寄存器 ax 中
mov bx, 10     ; 将 10 存储到通用寄存器 bx 中
mul bx         ; 用 bx 中的值乘以 ax 中的值,结果存储在寄存器组中

位数

隐含的被乘数

乘积的存放位置

举例

8位

AL

AX

MUL BL

16位

AX

DX-AX

MUL BX

32位

EAX

EDX-EAX

MUL ECX

影响标志位:CF 和 OF ; 利用CF和OF判断成绩的高位是否有效。

两种标志位情况:

  • 要么CF = OF = 1;
    • 8位:说明结果超过了8位
    • 16位:说明结果超过了16位
  • 要么CF = OF = 0
    • 8位:都能存下
    • 16位:都能存下

有符号乘法

mov eax, 5     ; 将 5 存储到累加器寄存器 eax 中
mov ebx, -10   ; 将 -10 存储到通用寄存器 ebx 中
imul ebx      ; 用 ebx 中的值与 eax 中的值相乘,结果存储在寄存器组中

影响的标志位:

两种标志位情况:

  • 如果成绩的高位是低位的符号扩展,则CF = OF = 0,否则CF = OF = 1

其他标志位:没有定义,不可预测的

无符号除法

除法也分为无符号除法和有符号除法。

除法指令的被除数是隐含操作数,除数在指令中显式地写出来。CPU会根据除数是8位、16位,还是32位,来自动选用被除数AX、DX-AX,还是EDX-EAX。

除数位数

隐含的被除数

余数

举例

8位

AX

AL

AH

DIV BH

16位

DX-AX

AX

DX

DIV BX

32位

EDX-EAX

EAX

EDX

DIV ECX

指令的格式:DIV Reg/Mem指令的功能是用显式操作数去除隐含操作数(都作为无符号数)。

影响的标志位:指令对标志位的影响无定义。

有符号除法

指令的格式:DIV Reg/Mem指令的功能是用显式操作数去除隐含操作数(都作为无符号数)。

影响的标志位:指令对标志位的影响无定义。

;