二、算术运算指令 8086提供加、减、乘、除四种基本算术操作。这些操作都可用于字节或字的运算,也可以用于带符号数与无符号数的运算。 带符号数用补码表示。同时8086也提供了各种校正操作,故可以进行十进制算术运算。 参与加、减运算的操作数可如图所示。
1.加法指令 (Addition) (1) 一般形式 ADD OPRD1,OPRD2 功 能 OPRD1←OPRD1+OPRD2 完成两个操作数相加,结果送至目的操作数OPRD1。目的操作数可以是累加器,任一通用寄存器以及存储器操作数。 【例如】 ADD AL,30;累加器与立即数相加 ADD BX,[3000H];通用寄存器与存储单元内容相加 ADD DI,CX;通用寄存器之间 ADD DX,DATA[BX+SI];通用寄存器与存储单元内容相加 ADD BETA[SI],DX;存储器操作数与寄存器相加 这些指令对标志位CF、DF、PF、SF、ZF和AF有影响。 (2) 一般形式 ADC OPRD1,OPRD2;带进位的加法 功 能 OPRD1←OPRD1+OPRD2 +CF 这条指令与上—条指令类似,只是在两个操作数相加时,要把进位标志CF的现行值加上去,结果送至目的操作数。 ADC指令主要用于多字节运算中。若有两个四字节的数,已分别放在自FIRST和SECOND开始的存储区中,每个数占四个存储单元。存放时,最低字节在地址最低处,则可用以下程序段实现相加。 MOV AX,FIRST ADD AX,SECOND;进行字运算 MOV THIRD,AX MOV AX,FIRST+2 ADC AX,SECOND+2 MOV THIRD+2,AX 这条指令对标志位的影响与ADD相同。 (3) 一般形式 INC OPRD ; 功 能 OPRD←OPRD+1 完成对指定的操作数OPRD加1,然后返回此操作数。此指令主要用于在循环程序中修改地址指针和循环次数等。 这条指令执行的结果影响标志位AF、OF、PF、SF和ZF,而对进位标志没有影响。 【例如】 INC AL INC [BX] 2.减法指令(Subtraction) (1) 一般形式 SUB OPRD1,OPRD2 ; 功 能 OPRD1←OPRD1-OPRD2 完成两个操作数相减,也即从OPRD1中减去OPRD2,结果放在OPRD1中。 【例如】 SUB CX,BX SUB [BP],CL (2) 一般形式 SBB OPRD1,OPRD2 ; 功 能 OPRD1←OPRD1-OPRD2-CF 这条指令与SUB类似,只是在两个操作数相减时,还要减去借位标志CF的现行值.本指令对标志位AF、CF、OF、PF、SF和ZF都有影响。 同ADC指令一样,本指令主要用于多字节操作数相减。 (3) 一般形式 DEC OPRD ; 功 能 OPRD←OPRD-1-CF 对指令的操作数减1,然后送回此操作数, 在相减时,把操作数作为一个无符号二进制数来对待。指令执行的结果,影响标志AF、OF、PF、SF和ZF.但对CF标志不影响(即保持此指令以前的值)。 【例如】 DEC [SI] DEC CL (4) 一般形式 NEG OPRD 功 能 (NEGDate) 取补 对操作数取补,即用零减去操作数,再把结果送回操作数。 【例如】 NEG AL NEG MULRE (AL=0011 1100)则取补后为1100 0100 即0000 0000-0011 1100=1100 0100 若在字节操作时对-128,或在字操作时对-32768取补,则操作数没变化,但标志OF置位。 此指令影响标志AF、CF、OF、PF、SF和ZF。此指令的结果一般总是使标志CF=1。除非在操作数为零时,才使CF=0。 (5) 一般形式 CMP OPRD1,OPRD2 功 能 OPRD1-OPRD2 比较指令完成两个操作数相减,使结果反映在标志位上,但并不送回结果(即不带回送的减法)。 【例如】 CMP AL,100 CMP DX,DI CMP CX,COUHT[BP] CMP COUNT[SI],AX 比较指令主要用于比较两个数之间的关系。在比较指令之后,根据ZF标志即可判断两者是否相等。 相等的比较: ①若两者相等,相减以后结果为零,ZF标志为1,否则为0。 ②若两者不相等,则可在比较指令之后利用其它标志位的状态来确定两者的大小。 大小的比较: 如果是两个无符号数(如CMP AX,BX)进行比较,则可以根据CF标志的状态判断两数大小。若结果没有产生借位(CF=0),显然AX≥BX;若产生了借位(即CF=1),则AX<BX。 3.乘法指令(分为无符号乘法指令和带符号乘法指令两类) (1) 无符号乘法指令MUL 一般格式 MUL OPRD 完成字节与字节相乘、字与字相乘,且默认的操作数放在AL或AX中,而源操作数由指令给出。8位数相乘,结果为16位数,放在AX中;16位数相乘结果为32位数,高16位放在DX,低16位放在AX中。 【注意】源操作数不能为立即数。 【例如】 MOV AL,FIRST; MUL SECOND ;结果为AX=FIRST*SECOND MOV AX,THIRD; MUL AX ;结果DX:AX=THIRD*THIRD MOV AL,30H CBW ; 字扩展AX=30H MOV BX,2000H MUL BX ; (2) 带符号数乘法指令IMUL 一般格式 IMUL OPRD ;OPRD 为源操作数 这是一条带符号数的乘法指令,同MUL一样可以进行字节与字节、字和字的乘法运算。结果放在AX或DX,AX中。当结果的高半部分不是结果的低半部分的符号扩展时,标志位CF和OF将置位。
|
电工学习网 ( )
GMT+8, 2021-12-6 20:45