汇编笔记3.docx

上传人:b****5 文档编号:8576604 上传时间:2023-01-31 格式:DOCX 页数:28 大小:47.48KB
下载 相关 举报
汇编笔记3.docx_第1页
第1页 / 共28页
汇编笔记3.docx_第2页
第2页 / 共28页
汇编笔记3.docx_第3页
第3页 / 共28页
汇编笔记3.docx_第4页
第4页 / 共28页
汇编笔记3.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

汇编笔记3.docx

《汇编笔记3.docx》由会员分享,可在线阅读,更多相关《汇编笔记3.docx(28页珍藏版)》请在冰豆网上搜索。

汇编笔记3.docx

汇编笔记3

算术运算指令可处理4种类型的数1.无符号二进制整数2.带符号二进制整数

3.无符号压缩十进制整数(PackedDecimal)4.无符号非压缩十进制整数

一个8位二进制数可看成4种不同类型的数,所表示的数值亦不同。

数的表示:

二进制数:

可以是8位或16位,若是带符号数,则用补码表示。

压缩十进制数:

一个字节中存放两个BCD码十进制数。

非压缩十进制数:

一字节的低半字节存放十进制数,高半字节为全零。

例如,对十进制数字58:

●压缩十进制数表示:

只需一个字节,即01011000B;

●非压缩十进制数表示:

需两个字节,即00000101B和00001000B。

二进制码(B)

十六进制(H)

无符号二进制(D)

带符号二进制(D)

非压缩十进制

压缩十进制

00000111

07

7

+7

7

07

10001001

89

137

-119

无效

89

11000101

C5

197

-59

无效

无效

1.加法指令(Addition)

⑴ADD加法指令(Addition)

指令格式:

ADD目的,源指令功能:

目的源十目的

⑵ADC带进位的加法指令(AdditionwithCarry)

指令格式:

ADC目的,源指令功能:

目的源十目的十CF

操作数的要求:

(包括上两条指令)

源操作数:

可以是寄存器、存储器、立即数;目的操作数:

只能用寄存器、存储单元。

注意:

★源、目的操作数不能同时为存储器,且类型必须一致,即都是字节或字,目的操作数不可以是立即数;

★这两条指令影响的标志位为:

CF、OF、PF、SF、ZF和AF。

例3.40两种加法指令的实例

ADDAL,18HALAL十18H

ADCBL,CLBLBL十CL十CF

ADCAX,DXAXAX十DX十CF

ADDAL,COST[BX]AL内容和地址=DS:

(COST+BX)的存储字节相加,结果送AL

ADDCOST[BX],BL将BL与物理地址=DS:

(COST十BX)的存储字节相加,结果留在该存储单元中

 例3.41用加法指令对两个8位16进制数5EH和3CH求和,并分析加法运算指令执行后对标志位的影响。

解:

MOVAL,5EHAL=5EH(94)

MOVBL,3CHBL=3CH(60)

ADDAL,BL;结果AL=9AH

ADD对标志位的影响

▲两个数的相加过程:

010111105EH=94

+00111100即:

+3CH=60

100110109AH=154

标志位:

ZF=0,AF=1,CF=0,SF=l,PF=1,OF=1。

▲对标志的解释:

1.两个加数都看成无符号数时,运算结果为9AH,即十进制数154。

在这种情况下,SF和OF都没有意义,我们只关心ZF和CF标志,在BCD码运算或奇偶校验时才考虑AF或PF标志。

2.两个加数都当成带符号数时,符号标志SF和溢出标志OF很重要,而进位标志CF没有意义。

带符号数能表示的范围-128~+127,而本例中,两个正数94和60相加,其和为154,由于154超过了范围,

即产生了溢出,OF=1

⑶INC增量指令(Increment)

指令格式:

INC目的指令功能:

目的目的十1

操作数的要求:

通用寄存器、内存。

注意:

▲这条指令主要用在循环程序中,对地址指针和循环计数器等进行修改;

▲指令执行后影响AF、OF、PF、SF和ZF,但不影响进位标志CF。

▲该指令只有一个操作数时,如果要使内存单元的内容增1,程序中必须说明该存储单元是字还是字节。

INC指令的两个应用例子:

例3.42INCBL;BL寄存器中内容增1例3.43INCBYTEPTR[BX];内存字节单元内容增1

INCCX;CX寄存器中内容增1INCWORDPTR[BX];内存字单元内容增1

其中:

PTR为类型说明符,前面加BYTE说明操作数类型为字节,加WORD则说明操作数类型为字。

⑷AAA加法的ASCII调整指令(ASCIIAdjustforAddition)

指令格式:

AAA指令功能:

将AL寄存器中的运算结果调整为1位非压缩十进制数,仍保留在AL。

如果AF=1,表示向高位有进位,则进到AH寄存器中。

使用前提:

用ADD或ADC指令对两个非压缩十进制数或ASCII码表示的十进制数作加法,运算结果已存在AL。

(注:

非压缩十进制数的高4位为全0,低4位为十进制数字0~9。

例如,将9表示成00001001)

调整过程:

若AL低4位>9或AF=1

则:

①ALAL十6否则:

将AL寄存器的高4位清0。

②用与操作(∧)将AL高4位清0

③AF置1,CF置1,AHAH十l

例3.44若AL=BCD9,BL=BCD5,求两数之和。

解:

设AH=0,则运算过程如下:

ADDAL,BL;00001001……09H

;+00000101……05H

;______________________________

AAA;00001110……低4位>9

;+00000110……加6调整

;______________________________

;00010100

;∧00001111……清高4位

;______________________________

;00000100……AL=04HCF=1,AF=1,AH=1结果为AX=0104H,表示非压缩十进制数14

ASCII码表示的十进制数,高半字节均为3,运算时需用AND指令将它屏蔽。

只要使用AAA指令,可以不必屏蔽高半字节,便能在AX中得到一个正确的非压缩十进制数。

例3.45求ASCII码表示的数9(39H)与5(35H)之和。

解:

设AH=0,则运算过程如下:

MOVAL,‘9’;AL=39H

MOVBL,‘5’;BL=35H

ADDAL,BL;00111001……‘9’

;+00110101……‘5’

;______________________________

AAA;01101110……低4位>9

;+00000110……加6调整

;______________________________

;01110100

;∧00001111……清高4位

;______________________________

;00000100……AL=4CF=1,AF=1,AH=1结果为AX=0104H,表示非压缩十进制数14

在AAA指令后加上一条“或”指令ORAX,3030H,便使AX中的结果变成了ACSII码3134H。

⑸DAA加法的十进制调整指令(DecimalAdjustforAddition)

指令格式:

DAA指令功能:

将两个压缩BCD数相加后的结果调整为正确的压缩BCD数。

使用前提:

相加后的结果必须在AL中,才能使用DAA指令。

调整过程:

1.若AL的低4位>9或AF=1,则ALAL十6,对低4位进行调整;

2.若AL的高4位>9或CF=1,则ALAL十60H,对高4位进行调整,并使CF置1,否则CF置0。

例3.46若AL=BCD38,BL=BCDl5,求两数之和。

解:

运其过程如下:

ADDAL,BL;00111000……38H

;+00010101……15H

;______________________________

DAA;01001101……低4位>9

;+00000110……加6调整

;______________________________

;01010011……AL=53H结果为:

AL=BCD53,CF=0

调整过程:

①若AL的低4位>9或AF=1,则ALAL十6,对低4位进行调整;

②若AL的高4位>9或CF=1,则ALAL十60H,对高4位进行调整,并使CF置1,否则CF置0。

例3.47若AL=BCD88,BL=BCD49,求两数之和。

解:

运算过程为:

ADDAL,BL;10001000……88H

;+01001001……49H

;______________________________

DAA;11010001……AF=1,低4位<9

;+00000110……加6调整

;______________________________

;11010111……调整后,高4位>9

;+01100000……加60H调整

;______________________________

;00110111……AL=37H结果为:

AL=BCD37,CF=1

调整过程:

①若AL的低4位>9或AF=1,则ALAL十6,对低4位进行调整;

②若AL的高4位>9或CF=1,则ALAL十60H,对高4位进行调整,并使CF置1,否则CF置0。

2.减法指令(Subtraction)

⑴SUB减法指令(Subtraction)

指令格式:

SUB目的,源指令功能:

目的目的-源

例3.48SUBAX,BX;AXAX-BXSUBDX,1850H;DXDX-1850H

⑵SBB带借位的减法指令(SubtractwithBorrow)

指令格式:

SUBB目的,源指令功能:

目的目的-源-CF(SBB主要用于多字节减法中)

例3.49SUBBAL,CL;ALAL-CL-CF

⑶DEC减量指令(Decrement)

指令格式:

DEC目的指令功能;目的目的-l

例3.50

DECBX;BXBX-1DECWORDPTR[BP];堆栈段中位于[BP]偏置处的字减1

⑷NEG取补指令(Negate)

指令格式:

NEG目的指令功能:

目的0-目的,即:

对目的操作数取补

例3.51NEGAX;将AX中的数取负NEGBYTEPTR[BX];对数据段中位于[BX]偏置处的字节取负 

⑸CMP比较指令(Compare)

指令格式:

CMP目的,源指令功能:

目的-源

注意:

结果不回送到目的操作数中,仅反映在标志位上。

用途:

用在比较两个数大小又不破坏原操作数的场合。

例3.52CMPAL,80H;AL与80H作比较CMPBX,DATA1;BX与数据段中偏移量为DATA1处的字比较 

减法指令小结:

(上述五种指令都做减法运算)

①对于双操作数指令(SUB、SBB、CMP):

▲源操作数可以是寄存器、存储器或立即数;

▲目的操作数可以是寄存器、存储器,但不能为立即数;

▲两个操作数不能同时为存储器。

②对于单操作数指令(DEC、NEG):

▲目的操作数可以是寄存器、存储器,但不能为立即数;

▲如果是存储器操作数,还必须说明其类型是字节还是字。

3运算之后,除DEC指令不影响CF标志外,它们均影响OF、SF、ZF、AF、PF和CF标志。

在减法操作后,如果源操作数大于目的操作数,需要借位时,进位/借位标志CF将被置1。

例3.53设AL=10110001B,DL=01001010B,求AL-DL。

解:

SUBAL,DL;与加法操作一样,对结果的解释取决于参与运算的数的性质

运算过程如下:

二进制减法当成无符号数当成带符号数

10110001177-79

-01001010-74-)+74

----------------------------------------------------

01100111103+103

运算后标志位:

ZF=0,AF=1,CF=0,SF=0,PF=0,OF=1

讨论:

▲两数为无符号数:

表示177与74的差是103。

CF=0表示没有借位,SF和OF无意义。

▲两数为带符号数:

表示-79-(+74),结果应为-153。

但结果却为正数(103),这是由于-153溢出造成的。

此时,SF和OF有重要意义。

3.乘法指令(Multiply):

⑴MUL无符号数乘法指令

指令格式:

MUL源指令功能:

把源操作数和累加器中的数都当成无符号数,然后将两数相乘。

▲源操作数是一个字节:

AXAL*源。

(即:

原操作数与累加器AL中的内容相乘,乘积为双倍长的16位数,高8位送到AH,低8位送AL。

▲源操作数是一个字:

(DX,AX)AX*源

(即:

原操作数与累加器AX的内容相乘,结果为32位数,高位字放在DX寄存器中,低位字放在AX寄存器中。

操作数要求:

可以是寄存器、存储单元,但不能是立即数;源操作数可以是字节或字;

源操作数是存储单元时,必须在操作数前加BYTEPTR或WORDPTR说明是字节还是字。

例3.56MULDL;AXAL*DLMULCX;(DX,AX)AX*CX

MULBYTEPTR[SI];AXAL*(内存中某字节),B说明字节乘法

MULWORDPTR[BX];(DX,AX)AX*(内存中某字),W说明字乘法

注意:

▲MUL指令执行后影响CF和OF标志。

如果结果的高半部分(字节操作为AH、字操作为DX)不为零,表明其内容是结果的有效位,则CF和OF均置1。

否则,CF和OF均清0。

据此可检测并去除结果中的无效前导零。

▲乘法指令使AF、PF、SF和ZF的状态不定。

例3.58试计算FFH×FFH。

解:

用二进制表示成如下形式:

▲作为无符号数:

表示255×255=65025,结果正确。

▲作为带符号数:

表示(-1)×(-1)=-511,显然结果不正确。

▲可见,用MUL指令作带符号数的乘法,会得到错误的结果;

用IMUL指令,才能使(一1)×(一1)得到正确的结果0000000000000001。

⑵IMUL有符号数乘法指令

指令格式:

IMUL源指令功能:

把源操作数和累加器中的数都作为带符号数,进行相乘。

注意:

▲存放结果的方式与MUL相同:

1.源操作数为字节:

与AL相乘,双倍长结果送到AX中;2.源操作数为字:

与AX相乘,双倍长结果送到DX和AX中,最后给乘积赋予正确的符号。

▲对标志位的影响:

1.乘积的高半部分不是全零或全1,则不是低半部分的符号扩展,那么高位部分就为有效位,表示它是积的一部分,于是置CF=1,OF=1;2.结果的高半部分为全零或全1,表明它仅包含了符号位,那么使CF=0,OF=0。

AF、PF、SF和ZF不定。

例3.59设AL=-28,BL=59,试计算它们的乘积。

解:

IMULBL结果:

1652D=0000011001110100B=0674H-1652D=1111100110001100B=F98CH

则,CF=1,OF=1AX=F98CH=-1652

⑶AAM乘法的(ASCII)调整指令(ASCIIAdjustforMultiply)

指令格式:

AAM

指令功能:

对AL中的两个非压缩十进制数相乘的乘积进行十进制数的调整,在AX中得到正确的非压缩十进制数的乘积,高位在AH中,低位在AL中。

注意:

▲两个ASCII码数相乘之前,先屏蔽掉每个数字的高半字节,使每个字节包含一个非压缩十进制数(BCD数),再用MUL指令相乘,乘积放到AL寄存器中,然后用AAM指令进行调整。

▲标志位的影响:

影响ZF、SF和PF,但AF、CF和OF无定义。

▲8086/8088指令系统中,十进制乘法运算不允许采用压缩十进制数,调整指令仅此一条。

▲只能进行8位数的乘法

调整过程:

把AL寄存器内容除以10,商放在AH中,余数在AL中。

即AHAL/10所得的商;ALAH/10所得的余数。

例3.60求两个非压缩十进制数9和6之乘积。

解:

MOVAL,09H;置初值

MOVBL,06H

MULBL;AL09与06之乘积36H=54

AAM;调整得AH=36H/0AH=05H(十位),;AL=36H%0AH=04H(个位)

结果:

AX=0504H,即BCD数54。

如果AL和BL中分别存放9和6的ASCII码,求两数之积。

解:

用以下指令实现:

ANDAL,0FH;屏蔽高半字节

ANDBL,0FH

MULBL;相乘

AAM;调整

如要将结果转换成ASCII码,可用指令ORAX,3030H实现,使AX=3534H。

4.除法指令(Division):

⑴DIV无符号数除法指令(Division,unsigned)

指令格式:

DIV源指令功能:

对两个无符号二进制数进行除法操作。

▲源操作数为字节,16位被除数必须放在AX中,8位除数为源操作数。

ALAX/源(字节)的商AHAX/源(字节)的余数

若被除数只有8位,必须把它放在AL中,并将AH清0。

▲源操作数为字,32位被除数在(DX,AX)中,16位除数作源操作数。

AX(DX,AX)/源(字)的商DX(DX,AX)/源(字)的余数

若被除数、除数都是16位,则将16位被除数送到AX中,再将DX寄存器清0。

注意:

▲源操作数可以是寄存器、存储单元;可以是字,也可以是字节;但不能是立即数

▲被除数和除数一样,商和余数也都为无符号数。

▲DIV指令执行后,所有标志位均无定义。

⑵IDIV有符号数除法指令(IntegerDivision)

指令格式:

IDIV源指令功能:

对两个带符号二进制数进行除法操作(也称为带符号数除法)

注意:

▲商和余数都是带符号数,且规定余数的符号和被除数的相同;

▲指令执行后,所有标志位均无定义。

▲无论对(DIV)还是(IDIV),都要注意溢出问题:

1.字节操作时:

被除数的高8位绝对值大于除数的绝对值,产生溢出。

即商数超过了目标寄存器AL所能存放数的范围:

对于无符号数,允许最大商为FFH;对于带符号数,允许商的范围为-127~+127,或-81H~+7FH;

2.字操作时:

被除数的高16位绝对值大于除数的绝对值,产生溢出。

即商数超过了目标寄存器AX所能存放数的范围:

对于无符号数,允许最大商为FFFFH;对于带符号数,允许商的范围为-32767~+327或-8001H~7FFFH。

▲溢出时计算机会自动产生一个中断类型号为0的除法错中断,相当于执行了除数为0的运算,所得的商和余数都不确定。

▲带符号数除法指令:

字节操作时要求被除数为16位;字操作时要求被除数为32位;

如果被除数不满足这个条件,不能简单地将高位置0,而应该用符号扩展指令(SignExtension)将被除数转换成除法指令所要求的格式。

例3.61两个无符号数7A86H和04H相除,商应为多少?

解:

MOVAX,7A86H

MOVBL,04H

DIVBL

结果:

①正确的商应为1EA1H。

②由于BL中的除数04H为字节,被除数为字,商1EA1H大于AL中能存放的最大无符号数FFH,产生除法错误中断。

⑶CBW把字节转换为字指令(ConvertBytetoWord)

指令格式:

CBW指令功能:

把寄存器AL中字节的符号位扩充到AH的所有位。

(AH被称为AL的符号扩充)

扩展方法:

▲若AL中的D7=0,则将这个0扩展到AH中,使AH=00H,即:

▲若AL中的D7=1,则将这个1扩展到AH中,使AH=FFH,即:

注意:

CBW指令执行后,不影响标志位。

 

例编程求-38/3的商和余数。

解:

MOVAL,11011010B;被除数:

-38的补码

MOVCH,00000003B;除数:

+3

CBW;将AL符号扩展到AH中,;使AX=111111111101;1010B

IDIVCH;AX/CH,AL=11110100B;=-12(商),;AH=11111110=-2(余数)

⑷CWD把字转换成双字指令(ConvertWordtoDoubleWord)

指令格式:

CWD指令功能:

把AX中字的符号值扩充到DX寄存器的所有位。

扩展方法:

▲若AX的D15=0,则DX0000H,即:

▲若AX的D15=1,则DXFFFFH,即:

注意:

CWD指令执行后,也不影响标志位。

⑸AAD除法的(ASCII)调整指令(ASCIIAdjustforDivision)

指令格式:

AAD指令功能:

在做除法前,把AX中非压缩BCD码转换成二进制数。

调整过程:

ALAH×10+ALAH00

注意:

▲AX中的两位非压缩格式的BCD数除以一个非压缩的BCD数前,要先用AAD指令把AX中的被除数调整成二进制数,并存到AL中,才能用DIV指令进行运算。

▲根据AL寄存器结果影响SF、ZF、PF,但对OF、CF、AF无定义。

例3.63设AX中存有两个非压缩BCD数0307H,即十进制数的37,BL中存有一个非压缩BCD数05H,编程完成AX/BL的运算。

解:

AAD;AL03×10+7=37=25H

DIVBL;AL=7(商),AH=2(余数)

MOVCL,AH;腾出AH

AAM;将2进制数转成非压缩BCD码

逻辑运算

指令的特点:

逻辑运算均是按位操作的,所以操作数被看成串。

源操作数可以是:

立即数、通用寄存器、存储器

目的操作数可以是:

通用寄存器、存储器但是不能同时为存储器

结果的影响:

除了“非”(NOT)指令对FR不影响,其他指令均影响SF、ZF、PF,使CF=OF=0;

逻辑运算

NOT

取反

AND

逻辑乘(与)

OR

逻辑加(或)

XOR

异或

TEST

测试

1NOT取反指令(LogicalNot)

指令格式:

NOT目的指令功能:

目的目的取反

操作数要求:

①可以是8位或16位寄存器、存储器。

②对于存储器操作,需指明是字还是字节。

注意:

指令执行后,对标志位无影响

例3.65NOTAX;AXAX取反

NOTBL;BLBL取反

NOTBYTEPTR[BX];对存储单元内容取反后

;送回该单元

2AND逻辑与指令(LogicalAND)

指令格式:

AND目的,源指令功能:

目的目的∧源

例3.66假设AX中存有数字5和8的ASCII码,即AX=3538H,将它们

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1