文档库 最新最全的文档下载
当前位置:文档库 › 汇编算数运算指令

汇编算数运算指令


几个汇编指令的详解

减法指令包括不带借位的减法指令SUB、带借位的减法指令SBB、减1(减量)指令DEC、求补指令NEG以及比较指令CMP。
① 不带借位的减法指令SUB

【格式及操作】

SUB dest,src ;dest←(dest)-(src)

【功能】

用目标操作数减去源操作数,结果仍送回目标操作数。

SUB指令对操作数的要求以及对状态标志位的影响和ADD指令完全相同。请参考ADD指令。

【例1】

SUB AL,60H
SUB [BX+20H],DX
SUB AX,CX

SUB AL,[BX+SI] ;AL的内容与SS:(BP+SI)单元的内容相减,结果送AL

[top]

② 带借位的减法指令SBB

【格式及操作】

SBB dest,src ;dest←(dest)-(src)-(CF)

【功能】

用目的操作数减去源操作数以及标志位CF的值,结果仍送到目的操作数。

SBB指令对操作数的要求以及对状态标志位的影响与SUB指令完全相同,只是CF也要参加求差运算。

【例2】

SBB BL,30H ;BL←(BL)-30H-(CF)

SBB DX,[SI] ;DX←(DX)-((SI))-(CF)

SBB指令主要用于多字节的减法运算,它与ADC指令的用法基本类似。

【例3】x、y、z均为32位数,分别存放在地址为X、Y、Z的三个存储单元中,用指令序列实现w=x+y+24-z,结果放在W单元中。

解:因为x、y、z均为32位数,所以我们用两个16位寄存器完成32位运算。程序段如下:

MOV AX, X
MOV DX, X+2 ;DX:AX←x
ADD AX, Y
ADC DX, Y+2 ;DX:AX←x+y
ADD AX, 24
ADC DX, 0 ;DX:AX←x+y+24
SUB AX, Z
SBB DX, Z+2 ;DX:AX←x+y+24-z
MOV W, AX
MOV W+2, DX ;32位结果存入W单元

[top]

③ 减1(减量)指令DEC

【格式及操作】

DEC dest ;dest←(dest)-1

【功能】

将目的操作数的内容减1,结果仍然放在目的操作数中。本指令的功能类似于C语言中的“――”运算符,通常在循环程序中用于修改地址指针及循环次数。

DEC指令对操作数的要求以及对标志位的影响与INC指令完全相同。

【例4】

DEC SI ;SI←(SI)-1
DEC BX ;BX←(BX)-1
DEC BYTE PTR[DI] ;(DI)←((DI))-1

【例5】编写一个延时程序,延时时间任意。

解:可以用空循环的方法消耗时间,在循环中对计数器CX减1,直到CX=0为止。

MOV CX,1000H ;用CX作为计数器,计数初值为FFFFH

NEXT:DEC CX ;计数器(CX)减1

JNZ NEXT ;若CX≠0则循环
... ;延时结束

[top]

④ 比较指令CMP

【格式及操作】


CMP dest,src ;(dest)-(src)

【功能】

CMP指令对两个操作数相减,但相减的结果不送回目的操作数,而只是根据相减的情况设置标志位。

比较指令对操作数的要求及对标志位的影响与SUB指令完成相同。

【例6】

CMP BX,2100H ;(BX)-2100H,修改标志位
CMP CL,DH ;(CL)-(DH),修改标志位

比较指令在使用时,一般在其后紧跟一个条件转移指令,根据比较结果来决定程序转向。

【例7】比较AL、BL、CL中带符号数的大小,将最小数放在AL中。

CMP AL,BL ;AL和BL比较
JLE BBB ;若AL≤BL,则转到NEXT
XCHG AL,BL ;若AL>BL,则交换

NEXT: CMP AL,CL ;AL和CL比较
JLE L ;若AL≤CL,则转到STOP
XCHG AL,CL ;若AL>CL,则交换

STOP: HLT

[top]

⑤ 求补指令NEG

【格式及操作】

NEG dest ;dest ← 0-(dest)

【功能】

目的操作数为正数时,本指令计算目的操作数的负数的补码,结果仍然放在目的操作数中。

目的操作数为负数时,本指令计算目的操作数的绝对值,结果仍然放在目的操作数中。

【例8】若AL=47H,则执行 NEG AL 后,AL=B9H,CF=1。
本例中,结果B9H为(-47H)的补码。

NEG指令对六个状态标志位均有影响。但要注意以下两点:

(1)执行NEG指令后,一般情况下都会使CF为1。因为用零减去某个操作数,自然会产生借位,而减法的CF值正是反映无符号数运算中的借位情况。除非给定的操作数为零才会使CF为0。

(2) 若操作数的值为80H(-128)或为8000H(-32768),则执行NEG指令后, 其结果仍为80H或8000H,但OF置1,其它情况下OF均置0。




初学汇编语言 想问下12345678H+87654321H=? 用指令如何表示 谢谢~


DATA SEGMENT
SUM DW ?,?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA ;定义了数据段,还得初始化
MOV DS,AX
MOV AX,5678H ;先加低字
ADD AX,4321H
MOV SUM,AX ;保存低字的和到SUM内存字单元
MOV AX,1234H
ADC AX,8765H ;加高字,因此需把低字可能的进位加进去,所以要用带进位的加法指令
MOV SUM+2,AX ;注:字地址,因此要加2
MOV AX,4C00H
INT 21H
CODE ENDS
END START



汇编语言,想知道ADD和ADDC的具体区别,最好有例子可是说明,不明白这个进位是怎么算的。


ADD 两数相加,不加进位位。
ADDC 两数相加,同时再加个进位位。进位当时为1就加1 为0就加0相当于不加
一般用在多字节数相加中。最低位相加,用ADD ,加完后,

可能产生进位,高字节相加就用ADDC
这样,低字节相加产生的进位就会被加进来。
比如 0080H + 0180H
低字节相加用 ADD
80H+80H=100H 用ADD指令得到 00H 并溢出产生进位 C=1
高字节 相加用 ADDC
00H+01H=01H 用 ADDC 指令两数相加结果 01H会再加上进位位 1 得到 02H
0080H+0180H = 02 00H
再比如
0080H + 0101H
80H+01H = 81H 没有溢出进位为 C=0
00H+01H =01H 用ADDC指令会 再加进位位 C=0 得到 01H
结果 0080H+0101H = 0181H




请说明JMP DI和JMP [DI]指令的区别.
谢谢.
20还有几个问题谢谢;
1.用寄存器BX和SI的基址变址寻址方式,把存储器中的一个字节与AL寄存器的内容相加,并把结果送回存储器中.
2.用寄存器BX和位移量0B2H的寄存器相对寻址方式把存储器的一个字和(CX)相加,并把结果送回存储器中.
3.用位移量为0524H的直接寻址方式把存储器中的一个字与数2A59H相加,并把结果送回该存储单元中.

请说明JMP DI和JMP [DI]指令的区别.
DI就是指放进它里面的东西,如一个内存单元的偏移地址0001H;[DI]表示存储单元里的内容,如偏移地址为0001H内存单元里面放着数据12H,那么[DI]就是指12H.
1.用寄存器BX和SI的基址变址寻址方式,把存储器中的一个字节与AL寄存器的内容相加,并把结果送回存储器中.
ADD AL,[BX][SI]
2.用寄存器BX和位移量0B2H的寄存器相对寻址方式把存储器的一个字和(CX)相加,并把结果送回存储器中.
ADD [BX+B2H],CX
3.用位移量为0524H的直接寻址方式把存储器中的一个字与数2A59H相加,并把结果送回该存储单元中.
题目打错了吧?0524H应该是偏移地址吧。这样的话,代码如下:
MOV AX,2A59H
ADD [0524H],AX

请说明JMP DI和JMP [DI]指令的区别.
谢谢.
20还有几个问题谢谢;
1.用寄存器BX和SI的基址变址寻址方式,把存储器中的一个字节与AL寄存器的内容相加,并把结果送回存储器中.
2.用寄存器BX和位移量0B2H的寄存器相对寻址方式把存储器的一个字和(CX)相加,并把结果送回存储器中.
3.用位移量为0524H的直接寻址方式把存储器中的一个字与数2A59H相加,并把结果送回该存储单元中.


请说明JMP DI和JMP [DI]指令的区别.
DI就是指放进它里面的东西,如一个内存单元的偏移地址0001H;[DI]表示存储单元里的内容,如偏移地址为0001H内存单元里面放着数据12H,那么[DI]就是指12H.
1.用寄存器BX和SI的基址变址寻址方式,把存储器中的一个字节与AL寄存器的内容相加,并把结果送回存储器中.
ADD AL,[BX][SI]
2.用寄存器BX和位移量0B2H的寄存器相对寻址方式把存储器的一个字和(CX)相加,并把结果送回存储器中.
ADD [BX+B2H],CX
3.用位移量为0524H的直接寻址方式把存储器中的一个字与数2A59H相加,并把结果送回该存储单元中.
题目打

错了吧?0524H应该是偏移地址吧。这样的话,代码如下:
MOV AX,2A59H
ADD [0524H],AX


萝莉 你自己看看吧 我也整不明白。。。亲爱滴,加油哦!


相关文档