汇编算数运算指令
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
几个汇编指令的详解
减法指令包括不带借位的减法指令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
萝莉 你自己看看吧 我也整不明白。。。亲爱滴,加油哦!