章数据运算与输入输出教学_第1页
章数据运算与输入输出教学_第2页
章数据运算与输入输出教学_第3页
章数据运算与输入输出教学_第4页
章数据运算与输入输出教学_第5页
已阅读5页,还剩116页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章数据运算与输入输出4.1算术运算4.2逻辑运算4.3移位和循环移位4.4CPU控制指令4.5字符的输入与输出2024/1/281汇编语言程序设计

掌握算术运算指令,掌握逻辑运算指令和移位指令,以及编程完成有关数值计算和表达式计算,进一步熟练上机操作,并在DEBUG下运行和观察程序运行结果。在掌握了字符的输入和输出后,应能在程序中完成将计算结果直接在屏幕上输出。本章要点第4章数据运算与输入输出2024/1/282汇编语言程序设计4.1算术运算一、加法指令二、减法指令三、乘法指令四、除法和符号扩展指令五、表达式计算第4章数据运算与输入输出2024/1/283汇编语言程序设计对操作数的要求尤其应注意算术运算指令对标志位的影响无符号数和有符号数的区别

学习算术运算指令应注意4第4章数据运算与输入输出2024/1/284.1算术运算CF=1,则表示无符号数运算产生溢出OF=1,则表示有符号数运算产生溢出区别主要表现在对溢出的判断:2024/1/2842024/1/282024/1/2842024/1/28

ADD(ADDition)加法指令格式:ADDDST,SRC

执行的操作:(DST)<——(SRC)+(DST)说明:目的操作数:8/16/32位的寄存器/存储器源操作数:与目的操作数同类型的reg/mem/imm一、加法指令指令执行的结果影响标志位AF、CF、OF、PF、SF和ZF。5.1算术运算5第4章数据运算与输入输出2024/1/28

[例1]ADDAH,BH指令执行前,设AH=56H,BH=24H。指令执行

01010110 AH + 00100100 BH 01111010 AH

指令执行后,AH=7AH,BH=24H,CF=OF=SF=ZF=PF=AF=0。

4.1算术运算6第4章数据运算与输入输出2024/1/28

[例2]ADDWORDPTR[BX],9F76H

指令执行前,设DS=2000H,BX=1000H,(21000H)=88H,(21001H)=0A9H。 指令执行:

1010100110001000 + 1001111101110110 1 0100100011111110指令执行后,(21000H)=0FEH,(21001H)=48H,CF=OF=1,ZF=SF=PF=AF=0。

4.1算术运算7第4章数据运算与输入输出2024/1/28

ADC(ADdwithCarry)带进位加法指令格式:ADCDST,SRC 执行的操作:(DST)<——(SRC)+(DST)+CF这条指令主要用于多字节(或多字)相加。[例3]两个无符号的双精度数(双字)的加法的指令序列。

ADDAX,CX ;低位字相加

ADCDX,BX ;高位字带进位相加4.1算术运算8第4章数据运算与输入输出2024/1/28

INC(INCrement)加1指令格式:INCOPR

执行的操作:(OPR)<——(OPR)+1说明:其中OPR可以是reg/mem,但不能是立即数和段寄存器操作数。

这条指令一般用于在循环指令中修改指针和循环次数用。该指令影响OF、SF、ZF、PF和AF,但是CF标志位不受影响。4.1算术运算9第4章数据运算与输入输出2024/1/28

SUB(SUBtruction)减法指令格式:SUBDST,SRC

执行的操作:(DST)<——(DST)-(SRC)说明:DST和SRC的寻址方式的规定同ADD指令

二、

减法指令指令执行的结果影响标志位AF、CF、OF、PF、SF和ZF。4.1算术运算10第4章数据运算与输入输出2024/1/28SBB(SuBtructwithBorrow) 带借位减法格式:SBBDST,SRC

执行的操作:(DST)<——(DST)-(SRC)-CF

主要用于多字节相减。

指令执行的结果影响条件标志位。

4.1算术运算11第4章数据运算与输入输出2024/1/28DEC(Decrement)减1指令格式:DECOPR 执行的操作:(OPR)<——(OPR)-1说明:其中OPR可以是寄存器和存储器操作数,但不能是立即数和段寄存器操作数。 该指令影响OF、SF、ZF、PF和AF,但是CF标志位不受影响(同INC)。 这条指令一般用于在循环指令中修改指针和循环次数用。(同INC)4.1算术运算12第4章数据运算与输入输出2024/1/28NEG(Negate)求补指令格式:NEGOPR

执行的操作:(OPR)<——(OPR)补 或(OPR)<——0--(OPR)

影响6个标志位,只有对0求补时,CF=0,其余CF=1。对操作数的规定同INC指令4.1算术运算13第4章数据运算与输入输出2024/1/28CMP(Compare)比较指令格式:CMPOPR1,OPR2执行的操作:(OPR1)-(OPR2)

该指令同SUB指令一样执行减法运算,唯一不同的是,该指令不保存结果。 指令执行的结果影响标志位。

4.1算术运算14第4章数据运算与输入输出2024/1/28MUL无符号数乘法指令格式:MUL SRC ;B/W执行的操作:AXAL(SRC) ;字节操作

DX、AXAX(SRC)

;字操作其中:隐含目的操作数

SRC可以是寄存器操作数和内存操作数

SRC不能使用立即数和段寄存器

IMUL带符号数乘法指令参加乘法运算的是有符号数,格式、操作方法和规定同MUL指令三、乘法指令4.1算术运算15第4章数据运算与输入输出2024/1/28双操作数带符号乘法指令格式:IMUL DST,SRC ;W/DW执行的操作:DST(DST)(SRC)

其中:DES为reg16或reg32,

SRC为reg16/men16或reg32/mem32。

三操作数带符号乘法指令格式:IMUL DST,SRC,imm ;W/DW执行的操作:DST(SRC)imm

其中:DES为reg16或reg32,

SRC为reg16/men16或reg32/mem32。286以后增加的乘法指令*4.1算术运算16第4章数据运算与输入输出2024/1/28乘法指令对标志位的影响除CF、OF以外无定义。对MUL: 乘积的高一半是0,CF=OF=0,否则为1。对IMUL

乘积的高一半是低一半的符号扩展,CF=OF=0, 否则为1。对2操作数或3操作数的IMUL

乘积的结果正常,CF=OF=0;若结果溢出,CF=OF=1。4.1算术运算17第4章数据运算与输入输出2024/1/28乘法指令举例[例4] MUL BL指令执行前,AL=B4H=180,BL=11H=17指令执行后,AX=0BF4H=3060,BL=11H,CF=OF=1[例5] IMUL BL指令执行前,AL=B4H=-76,BL=11H=17指令执行后,AX=FAF4H=-1292,BL=11H,CF=OF=1(指令的执行:先将AL去掉符号,即76=4CH,4CH11H=050CH,正负得负,将050CH取补,得到结果。)[例6] MUL BL指令执行前,AL=04H=4,BL=11H=17指令执行后,AX=0044H=68,BL=11H,CF=OF=0[例7] IMUL BL指令执行前,AL=FBH=-5,BL=11H=17指令执行后,AX=FFABH=-85,BL=11H,CF=OF=04.1算术运算18第4章数据运算与输入输出2024/1/28DIV无符号数除法指令(unsignedDIVide)IDIV带符号数除法指令(sIgnedDIVide)CBW字节转换为字指令(ConvertBytetoWord)CWD字转换为双字指令(ConvertWordtoDoubleword)

四、除法和符号扩展指令4.1算术运算19第4章数据运算与输入输出2024/1/28除法指令

DIV无符号数除法指令格式:DIV SRC ;B/W执行的操作:ALAX/(SRC)的商 ;字节操作

AH

AX/(SRC)的余数

AX

DXAX/(SRC)的商 ;字操作

DX

DXAX/(SRC)的余数其中:SRC的规定同乘法指令

DIV指令的被除数、除数、商和余数都是无符号数。

4.1算术运算20第4章数据运算与输入输出2024/1/28除法指令

IDIV

带符号数除法指令格式:IDIV SRC ;B/W执行的操作:与DIV相同,即:

ALAX/(SRC)的商 ;字节操作

AH

AX/(SRC)的余数

AX

DXAX(SRC)的商 ;字操作

DX

DXAX(SRC)的余数其中:SRC的规定同乘法指令

IDIV指令的被除数、除数、商和余数都是带符号数

余数的符号同被除数的符号4.1算术运算21第4章数据运算与输入输出2024/1/28除法指令对标志位的影响标志位AF、CF、OF、PF、SF、ZF均无定义4.1算术运算22第4章数据运算与输入输出2024/1/28除法指令的几点注意1.用IDIV指令时,商的范围应在-128~127或32768~32767。若超出该范围则作为除数为0处理,产生0号中断,而不会使OF=1。2.用IDIV指令时,余数的符号一定要和被除数相同。例如-308,得到商为-3,余数为-6,而不是商-4,余2。4.1算术运算23第4章数据运算与输入输出2024/1/28除法指令的几点注意3.除法运算中,要求16位数除以8位数,当被除数只有8位时,必须将此8位数据放在AL中,并对高8位AH进行符号扩展。同样,要求32位数除以16位数,当被除数只有16位时,必须将此16位数据放在AX中,并对高16位DX进行符号扩展。如果不对AH或DX进行符号扩展,可能会得到错误的结果。例如,4812:

MOV AL,30H ;被除数48(30H)用AL存放已足够

MOV BL,12 ;或MOV BL,0CH DIV BL ;如果AH中有非0数据,则结果错误正确: MOV AL,30H MOV AH,0 ;无符号数

MOV BL,12 DIV BL或: MOV AL,30H CBW ;适用于无/有符号数

MOV BL,12 DIV BL4.1算术运算24第4章数据运算与输入输出2024/1/28除法指令的几点注意4.除法运算中的符号扩展:对于无符号数除法指令DIV:

只要将AH或DX寄存器清0即可对于带符号数除法指令IDIV:

AH或DX的扩展就是低位字节(AL)或低位字(AX)的符号扩展,具体是: 把AL中的最高位扩展到AH的8位中(正数为00H,负数为FFH); 把AX中的最高位扩展到DX的16位中(正数为0000H,负数为FFFFH);专门的符号扩展指令CBW和CWD

4.1算术运算25第4章数据运算与输入输出2024/1/28除法指令举例[例8] DIV BL指令执行前,AX=0400H=1024,BL=B4H=180指令执行后,AH=7C4H=124(余数),AL=05H(商), 不影响标志位[例9] IDIV BL指令执行前,AX=0400H=1024,BL=B4H=-76指令执行后,AH=24H=36(余数),AL=F3H=-13(商), 不影响标志位,注意余数与被除数同号。(指令的执行:先将BL求补,即为4CH=76,0400H4CH得商0DH=13、余数24H=36,正数除以负数,商应为负数,所以对结果0DH求补,得到商的结果F3H=-13,余数符号不变。)带符号数的除法同带符号的乘法指令一样,先求补变成无符号数,结果商再求补,余数符号同被除数。4.1算术运算26第4章数据运算与输入输出2024/1/28CBW字节转换为字指令(ConvertBytetoWord)格式:CBW执行的操作:AL中的符号位扩展到8位的AH中。若AL中 最高位为0,则AH=00H;若AL中最高位为1, 则AH=FFH;CWD字转换为双字指令(ConvertWordtoDouble-word)格式:CBW执行的操作:AX中的符号位扩展到16位的DX中。若AX中 最高位为0,则DX=0000H;若AX中最高位 为1,则DXH=FFFFH;

符号扩展指令4.1算术运算27第4章数据运算与输入输出2024/1/28符号扩展指令不影响标志位CDQ双字转换为四字指令(ConvertDouble-wordtoQuad-word)格式:CDQ执行的操作:EAX中的符号位扩展到EDX,形成EDX:EAX的64位数据。CWDE字转换为双字指令(ConvertWordtoExtendedDoubleword)格式:CBWE执行的操作:AX中的内容扩展为EAX。4.1算术运算28第4章数据运算与输入输出2024/1/28

利用算术运算指令根据优先级顺序进行。注意操作数的类型、执行指令所使用的寄存器,以及中间结果的存放。

五、表达式计算4.1算术运算29第4章数据运算与输入输出2024/1/28[例10] 计算(V-(X

Y+Z-540))/X其中X、Y、Z、V均为16位带符号数,已分别装入X、Y、Z、V字单元中。要求计算结果的商存人AX中,余数存人DX中。 MOV AX,X IMUL Y MOV CX,AX MOV BX,DX MOV AX,Z CWD ADD CX,AX ADC BX,DX SUB CX,540 SBB BX,0 MOV AX,V CWD SUB AX,CX SBB DX,BX IDIV X4.1算术运算30第4章数据运算与输入输出2024/1/28[例11]A、B、C、D均为有符号字变量,计算:Z=确定计算顺序如下:A+B→(A+B)/2→暂存中间结果;A-C→暂存中间结果;B+C→(B+C)*3→(B+C)*3/(A-C)→(B+C)*3/(A-C)+

(A+B)/2→保存最终结果。确定各次运算的数据类型:A+B扩展为32b,(A+B)/2结果为16b;(B+C)*3结果为32b,A-C结果为16b,(B+C)*3/(A-C)

结果为16b,最终结果为16b。4.1算术运算31第4章数据运算与输入输出2024/1/28MOV AX,A ;取操作数AADD AX,B ;进行运算“A+B”CWD ;把被除数扩展为32bMOV BX,2 ;除数转入寄存器IDIV BX ;进行运算(A+B)/2MOV BX,AX ;把商转存到BXMOV CX,A ;取分母第一个操作数SUB CX,C ;进行运算“A-C”MOV AX,B ;取分子第一个操作数ADD AX,C ;进行运算“B+C”MOV DX,3 ;乘数转入寄存器IMUL DX ;进行运算(B+C)*3IDIV CX ;进行运算(B+C)*3/(A-C)ADD AX,BX ;运算(B+C)*3/(A-C)+(A+B)/2MOV Z,AX ;保存最终结果4.1算术运算32第4章数据运算与输入输出2024/1/284.2BCD数运算* (十进制调整指令)一、压缩BCD数运算二、非压缩BCD数运算第4章数据运算与输入输出2024/1/2833汇编语言程序设计

算术运算指令都是二进制数的运算,为了便于十进制运算,8088指令系统有一组用于十进制调整的指令,将二进制的运算结果调整得到十进制的结果。 BCD码(BinaryCodedDecimal)用4位二进制数表示1位十进制数,又称8421码。十进制数与BCD码对应表0 00011 00012 00103 0011: :9 1001十进制调整指令

BCD码34第4章数据运算与输入输出2024/1/284.2BCD数运算2024/1/28342024/1/28

在PC机中有压缩的BCD码和非压缩的BCD码两种格式表示。压缩的BCD码 用4位二进制数表示一个十进制数位,整个十进制数形成为一个顺序的以4位为一组的数串。如

4567的压缩型BCD码表示为4567H或 0100010101100111B非压缩的BCD码 以8位二进制数表示一个十进制数位,8位中的低4位表示BCD码,而高4位没有意义。如

4567的非压缩型BCD码表示为04050607H等或

0100

0101

0110

0111B4.2BCD数运算35第4章数据运算与输入输出2024/1/28BCD运算的调整原理

[例12]用BCD码计算27 27H+ 00110110 36H————————— 01011101 低4位大于9(冗余码)+ 00000110 加6调整————————— 01100011 63 正确结果4.2BCD数运算36第4章数据运算与输入输出2024/1/28BCD运算的调整原理

[例13]用BCD码计算19 19H+ 00101000 28H————————— 01000001 低4位向高位产生进位+ 00000110 加6调整————————— 01000111 47 正确结果4.2BCD数运算37第4章数据运算与输入输出2024/1/28BCD运算的调整原理[例14]用BCD码计算56 56H+ 01110111 77H————————— 11001101 低4位大于9+ 00000110 加6调整————————— 11010011 高4位大于9+ 01100000 高位加6调整—————————100110011 133 结果正确4.2BCD数运算38第4章数据运算与输入输出2024/1/28BCD码运算调整规则

1.凡是对应位运算结果大于9时,则该位加6调整。

2.若该位和数有向高位进位时,也在该位加6调整。3.低位调整结果使高位大于9时,高位进行加6调整。4.2BCD数运算39第4章数据运算与输入输出2024/1/28一、压缩型BCD调整指令

DAA(DecimalAdjustforAddition)

DAS(DecimalAdjustforSubtraction)4.2BCD数运算40第4章数据运算与输入输出2024/1/28加法的十进制调整指令

DAA(DecimalAdjustforAddition)格式:DAA执行的操作:(DAA指令前必须先执行ADD或ADC 的加法指令将两个压缩型BCD码相加, 且结果在AL中)

AL

把AL中的和调整到压缩型BCD格式对标志位的影响:对OF无定义,但影响其它标志

4.2BCD数运算41第4章数据运算与输入输出2024/1/28[例15] ADD AL,BL DAA指令执行前,AL=28H,BL=68H先执行ADD指令:

00101000 AL+ 01101000 BL————————— 10010000 低4位向高位产生进位再执行DAA指令:

ALAL+6

得到AL=96H,为压缩的BCD码96d,十进制加法的结果。4.2BCD数运算42第4章数据运算与输入输出2024/1/28减法的十进制调整指令DAS(DecimalAdjustforSubtraction)格式:DAS执行的操作:(DAS指令前必须先执行SUB或SBB 的加法指令将两个压缩型BCD码相减, 且结果在AL中)

AL

把AL中的差调整到压缩型BCD格式对标志位的影响:对OF无定义,但影响其它标志

4.2BCD数运算43第4章数据运算与输入输出2024/1/28[例16] SUB AL,BL DAS指令执行前,AL=86H,BL=07H先执行SUB指令:

10000110 AL+ 00000111 BL————————— 01111111 低4位向高位有借位再执行DAS指令:

ALAL-6

得到AL=79H,为压缩的BCD码79d,十进制减法的结果。4.2BCD数运算44第4章数据运算与输入输出2024/1/28二、非压缩型BCD调整指令

AAA(AsciiAdjustforAddition)AAS(AsciiAdjustforSubtraction)AAM(AsciiAdjustforMultiplication)AAD(AsciiAdjustforDivision)4.2BCD数运算45第4章数据运算与输入输出2024/1/28加法的ASCII调整指令

AAA(AsciiAdjustforAddition)格式:AAA执行的操作:(AAA指令前必须先执行ADD或ADC 的加法指令将两个非压缩型BCD码相加, 且结果在AL中)

AL

把AL中的和调整到非压缩型BCD格式

AHAH+调整中产生的进位值(0或1)对标志位的影响:影响AF和CF,其余标志位无定义

4.2BCD数运算46第4章数据运算与输入输出2024/1/28[例17] ADD AL,BL AAA指令执行前,AX=0535H,BL=39H先执行ADD指令:

00110101 AL,5的ASCII码+ 00111001 BL,9的ASCII码————————— 01101110 低4位大于9再执行DAS指令:

ALAL+6

AHAH+1,AF置1,AL高4位清0,AF送CF。得到AX=0604H,为非压缩的BCD码55+9=64的正确结果。

4.2BCD数运算47第4章数据运算与输入输出2024/1/28两个数的加法要分4次进行。最低2位数的加法(78+66)用ADD指令相加,DAA指令调整。其余三次加法用ADC指令相加,DAA指令调整。上面的4次运算可以用循环实现。运算前通过指令“ADDAL,0”把CF清零,4次加法统一使用ADC指令实现。[例18]用BCD数进行运算:12345678EP401.ASM4.2BCD数运算48第4章数据运算与输入输出2024/1/28DATA SEGMENTA DD 12345678H B DD 33445566HX DD ?DATA ENDS4.2BCD数运算49第4章数据运算与输入输出2024/1/28CODE SEGMENT ASSUME DS:DATA,CS:CODESTART: MOVAX,DATA MOV DS,AX MOV DI,0 ;设置指针初值

MOV CX,4 ;循环次数

ADD AL,0 ;CF清零,CLC,AND等NEXT: MOVAL,BYTEPTRA[DI];取出A的两位BCD数

ADC AL,BYTEPTRB[DI];与B的对应两位相加

DAA ;BCD加法调整

MOV BYTEPTRX[DI],AL ;保存结果

INC DI ;修改指针

LOOP NEXT ;计数和循环控制

MOV AX,4C00H INT 21HCODE ENDS END STARTEP401.ASM4.2BCD数运算50第4章数据运算与输入输出2024/1/284.2逻辑运算逻辑与指令 AND逻辑或指令 OR逻辑非指令 NOT逻辑异或指令 XOR测试指令 TEST第4章数据运算与输入输出2024/1/2851汇编语言程序设计1.按位操作2.NOT为单操作数指令,不允许立即数和段寄存器。3.其余为双操作数指令,操作数的规定同算术运算指令。逻辑运算指令的特点

4.2逻辑运算52第4章数据运算与输入输出2024/1/28逻辑指令对标志位的影响NOT指令不影响标志位AND、OR、XOR、TEST指令:使CF=OF=0,AF无定义影响SF、ZF、PF。53第4章数据运算与输入输出2024/1/284.2逻辑运算格式:AND DST,SRC ;B/W执行的操作:(DST)

(DST)AND(SRC)

用途: 使某操作数中的若干位不变、若干位清0,称之为屏蔽某些位。1. AND逻辑与指令54第4章数据运算与输入输出2024/1/284.2逻辑运算逻辑运算指令举例

[例19] 要求屏蔽一字节中的0、1位,可用

AND AL,0FCH指令执行前,AL=0B9H 10111001 AND 11111100 ————————— 10111000 指令执行后:AL=0B8H,达到屏蔽的目的。55第4章数据运算与输入输出2024/1/284.2逻辑运算逻辑运算指令举例

[例20] 要求屏蔽一字节中的高4位,可用

AND AL,0FH指令执行前,AL=39H 00111001 AND 00001111 ————————— 00001001

指令执行后:AL=09H,达到屏蔽的目的。56第4章数据运算与输入输出2024/1/284.2逻辑运算格式:OR DST,SRC ;B/W执行的操作:(DST)

(DST)OR(SRC) 用途: 使某操作数中的若干位不变、若干位置1。 也可以对两个操作数进行组合。2. OR逻辑或指令57第4章数据运算与输入输出2024/1/284.2逻辑运算逻辑运算指令举例

[例21] 要求将AL中的内容最高位置1,可用

OR AL,80H指令执行前,AL=2BH 00101011 OR 10000000 ————————— 10101011 指令执行后:AL=0ABH58第4章数据运算与输入输出2024/1/284.2逻辑运算格式:XOR DST,SRC ;B/W执行的操作:(DST)

(DST)XOR(SRC)

用途: 可使某操作数清0,同时使CF=0; 也可使某个操作数中的若干位不变、若干位取反。3. XOR逻辑异或指令59第4章数据运算与输入输出2024/1/284.2逻辑运算逻辑运算指令举例

[例22] 要求将AL中的操作数0、1位变反,其它位保持不变。

XOR AL,3指令执行前,AL=0B9H 10111001 XOR 00000011 ————————— 10111010 指令执行后:AL=0BAH60第4章数据运算与输入输出2024/1/284.2逻辑运算逻辑运算指令举例

[例23] 要求将AX寄存器的内容清0,可用

XOR AX,AX指令执行后,AX=0,且CF=OF=0。

00101011 XOR 00101011 ————————— 00000000 注意:与MOVAX,0的区别。61第4章数据运算与输入输出2024/1/284.2逻辑运算格式:NOT OPR ;B/W执行的操作: (OPR)

(OPR)取反

注意: 不允许立即数和段寄存器; 不影响标志位。4. NOT逻辑非指令62第4章数据运算与输入输出2024/1/284.2逻辑运算逻辑运算指令举例

[例24] NOT AL指令执行前,AL=65H=01100101B指令执行后,AL=10011010B=9AH63第4章数据运算与输入输出2024/1/284.2逻辑运算格式:TEST DST,SRC ;B/W执行的操作:

(DST)AND(SRC),不回送结果,影响标志位 用途: 在不希望改变原有的操作数的情况下,用来检测某一位或某几位是否满足条件,可作为条件转移指令的先行指令。64第4章数据运算与输入输出2024/1/284.2逻辑运算5.TEST测试指令逻辑运算指令举例

[例25] 若要检测AL中的最高位是否为1,若为1则转到EXIT去执行,否则继续顺序执行。

TEST AL,80H JNZ EXIT

EXIT: :65第4章数据运算与输入输出2024/1/284.2逻辑运算逻辑运算指令举例

[例26] 判断AL中的无符号数是否为偶数,若为奇数则将其改变为偶数。

TEST AL,1 JZ DOWN AND AL,0FEH DOWN:66第4章数据运算与输入输出2024/1/284.2逻辑运算*386及以后机型增加的指令,简单了解:

位测试

BT位测试并置1 BTS位测试并置0 BTR位测试并变反 BTC正向位扫描 BSF反向位扫描 BSR67第4章数据运算与输入输出2024/1/284.2逻辑运算4.3移位和循环移位第4章数据运算与输入输出2024/1/2868汇编语言程序设计一般移位指令

SHLSHRSALSLR循环移位

ROLRORRCLRCR双精度移位指令(386以上)

SHLD SHRDSHL(SHiftlogicalLeft) 逻辑左移

SHR(SHiftlogicalRight) 逻辑右移

SAL(ShiftArithmeticLeft) 算术左移

SAR(ShiftArithmeticRight) 算术右移

ROL(ROtateLeft) 循环左移

ROR(ROtateRight) 循环右移

RCL(RotateLeftthroughCarry)带进位循环左移

RCR(RotateRightthroughCarry)带进位循环右移

SHLD(ShiftLeftDouble) 双精度左移

SHRD(ShiftRightDouble) 双精度右移69第4章数据运算与输入输出2024/1/284.3移位和循环移位移位指令的格式

(以SHL逻辑左移指令为例,适用于所有的移位指令)格式:SHL OPR,CNT ;B/W其中:

OPR为通用寄存器和内存操作数,不允许立即数和段寄存器;移位次数由CNT决定,CNT可取1或CL寄存器数(8086),32位机CNT可取8位立即数,从1~31,例3.68。SHL AL,1 ;CNT=1每执行一次只以一位MOV CL,7SHL AL,CL;CNT为CL移位次数大于1,应在移位指令前,把移位次数置于CL寄存器中。70第4章数据运算与输入输出2024/1/284.3移位和循环移位双精度移位指令的格式

(以SHLD逻辑左移指令为例,适用于所有的移位指令)格式:SHLD DST,REG,CNT ;W/DW其中:

DST为除立即数以外的字或双字操作数;

REG为寄存器操作数,长度同DST;移位次数由CNT决定,CNT可取1到31或CL寄存器数;执行后REG内容不变。例: SHLD EBX,ECX,16执行前,(EBX)=12345678H,(ECX)=13572468H执行后,(EBX)=56781357H,(ECX)=13572468H,CF=071第4章数据运算与输入输出2024/1/284.3移位和循环移位移位指令执行的操作图示

SHL和SAL两条指令的功能完全一样;在DBUG下,只使用SHL;双精度移位指令的操作见图3.15。72第4章数据运算与输入输出2024/1/284.3移位和循环移位移位指令对标志位的影响一般移位指令影响标志位CF、OF、PF、SF和ZF。循环移位指令只影响CF和OF。AF无定义OF位只有当CNT=1时才有效。在执行一位移位后,如果移位前后符号位发生了变化,则OF=1,否则OF=0。73第4章数据运算与输入输出2024/1/284.3移位和循环移位移位指令举例

[例27] SAL AH,1指令执行前,AH=0A5H=10100101B指令执行后,AL=01001010B=4AH,且CF=1,OF=1,ZF=0,SF=0,PF=0。74第4章数据运算与输入输出2024/1/284.3移位和循环移位移位指令举例

[例28] MOV CL,5 SAR WORDPTR[DI],CL指令执行前,DS=2000H,DI=0100H,(20100H)=64H,(20101H)=00H。指令执行后,(20100H)=03H,(20101H)=00H,且CF=0,OF=0。相当于100/32=375第4章数据运算与输入输出2024/1/284.3移位和循环移位移位指令的主要用途

循环移位可以改变操作数中所有位的位置。移位指令常用来做乘以2或除以2操作:

带符号数: SAL用来乘以2 SAR用来除以2

无符号数: SHL用来乘以2 SHR用来除以2移位指令也常用于数据的组合。76第4章数据运算与输入输出2024/1/284.3移位和循环移位移位指令举例

[例29] AX=0012H,BX=0034H,要求把它们装配在一起形成AX=1234H。

MOV AX,0012H MOV BX,0034H MOV CL,8 ROL AX,CL ;ROR,SHL,SAL OR AX,BX ;ADD[例30] 两个非压缩型BCD码AH=05H,AL=09H,要求把它们组合成压缩型BCD码,结果放在AL中。

MOV CL,4 ROL AH,CL ;ROR,SHL,SAL OR AL,AH ;ADD77第4章数据运算与输入输出2024/1/284.3移位和循环移位4.4CPU控制指令一、标志处理指令二、处理器控制指令第4章数据运算与输入输出2024/1/2878汇编语言程序设计一、标志处理指令

7条处理标志位的指令,直接对CF、DF、IF进行操作,改变标志位的状态。都是无操作数指令。CLI IF0STI IF1CLC CF0STC CF1CMC CF取反CLD DF0STD DF14.4CPU控制指令79第4章数据运算与输入输出2024/1/28二、处理器控制指令

也都是无操作数指令HLT:暂停指令:使CPU暂停程序执行,进入暂停状态。复位信号RESET可使CPU退出暂停状态。NOP:空操作:不执行如何对数据的操作,但是使用了3个时钟周期,1个字节,并使IP加1。用于软件延时或者在程序调试时取代其他指令的位置。4.4CPU控制指令80第4章数据运算与输入输出2024/1/284.5输入与输出一、字符的输出二、字符的输入2024/1/2881汇编语言程序设计第4章数据运算与输入输出一、字符的输出向显示器输出信息有三种方法:

通过操作系统的服务程序(INT21H)输出;通过“基本输入输出系统(BIOS)”输出;把显示内容(ASCII代码)直接写入“显示存储器(VideoRAM,VRAM)”,由显示器接口电路转换输出。本章首先介绍使用DOS功能调用进行输出的方法。82第4章数据运算与输入输出2024/1/284.5输入与输出(1)输出单个字符例:下面的程序在显示器上输出数字字符“9”:

MOV AH,2 ;功能号02H MOV DL,39H ;字符“9”的ASCII代码

INT 21H ;调用21H号系统服务程序DL←待输出字符的ASCII代码AH←02HINT21H字符“9”显示在光标(Cursor)位置,光标向右移动一个字符位置。83第4章数据运算与输入输出2024/1/284.5输入与输出[例31]在显示器上输出文字“Hello!”CODE SEGMENTASSUME CS:CODESTART: LEA BX,STRING MOV CX,7ONE: MOV DL,CS:[BX] ;取一个字符的ASCII码

MOV AH,2 ;单个字符输出的功能号

INT 21H ;DOS调用,输出一个字符

INC BX ;修改指针

LOOP ONE ;计数与循环控制

MOV AX,4C00H INT 21HSTRING DB “Hello!”CODE ENDS END STARTEP402A.ASM84第4章数据运算与输入输出2024/1/284.5输入与输出MOV CX,11……STRING DB 0DH,0AH,“Hello!”,0DH,0AHSTRING在代码段里定义,取字符需要增加段跨越前缀“CS:[BX]”,否则会到“DS:[BX]”处取字符,输出不确定的内容。代码为0DH的字符称为“回车(CarriageReturn,CR)”,把光标移动到本行的第一个字符位置,代码为0AH的字符称为“换行(LineFeed,LF)”,把光标移动到下一行的相同位置上。EP402B.ASM85第4章数据运算与输入输出2024/1/284.5输入与输出(2)输出一个字符串

字符串以字符“$”为结束标志,该字符本身不输出。DS:DX←待输出字符串的首地址AH←09HINT 21H86第4章数据运算与输入输出2024/1/284.5输入与输出CODE SEGMENT ASSUME CS:CODE,DS:CODESTART: MOVAX,CODE

MOV DS,AX LEA DX,STRING MOV AH,9 INT 21H MOV AX,4C00H INT 21HSTRING DB0AH,0DH,“Hello!”,0AH,0DH,‘$’CODE ENDS END STARTEP402C.ASM87第4章数据运算与输入输出2024/1/284.5输入与输出[例32]在显示器上用十进制格式输出单字节无符号数的值。DATA SEGMENTX DB10110111BC10 DB10DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART: MOVAX,DATA MOVDS,AX MOVCX,3 ;循环次数

MOVAL,XEP403.ASM88第4章数据运算与输入输出2024/1/284.5输入与输出ONE: MOV AH,0 ;高8位清零

DIV C10 ;执行16b÷8b除法

PUSHAX ;把余数(在AH中)压入堆栈

LOOPONE MOV CX,3 ;重新装载CXTWO: POP DX ;从堆栈中弹出余数(在DH中)

XCHGDH,DL ;把余数交换到DL OR DL,30H ;转换成数字的ASCII代码

MOVAH,2 INT 21H ;向显示器输出一个字符

LOOPTWO MOVAX,4C00H INT21HCODE ENDS ENDSTART89第4章数据运算与输入输出2024/1/284.5输入与输出二、字符的输入(1) AH←01 INT 21H

键盘输入字符后返回,ASCII码在AL中,并回显。(2) AH←07 INT 21H

键盘输入字符后返回,ASCII码在AL中,无回显。(3)AH←08 INT 21H

键盘输入字符后返回,ASCII码在AL中,无回显。同时检测Ctrl+Break和Ctrl+C键的组合。(1)输入一个字符90第4章数据运算与输入输出2024/1/284.5输入与输出[例33]从键盘输入5个个位数字,求它们的和,存入SUM。DATA SEGMENTSUM DB ?DATA ENDS;---------------------------------------------CODE SEGMENTASSUME DS:DATA,CS:CODESTART: MOVAX,DATA MOV DS,AX EP404A.ASM91第4章数据运算与输入输出2024/1/284.5输入与输出 MOV CX,5 ;循环次数

MOV SUM,0 ;累加器清零ONE: MOV AH,1 ;输入单个字符的功能号

INT 21H ;输入一个字符,ASCII码在AL中

AND AL,0FH ;ASCII码转换成二进制数

ADD SUM,AL ;累加

LOOP ONE ;计数与循环

MOV AX,4C00H INT 21HCODE ENDS END START92第4章数据运算与输入输出2024/1/284.5输入与输出DS:DX←输入缓冲区首地址AH←0AHINT 21H第一字节:输入字符存放区的大小。第二字节:由系统填入实际输入的字符个数,不包括回车。第三字节之后:输入字符存放区,存放输入的字符和回车。BUFFERDB81,?,81DUP(?)输入缓冲区格式:(2)输入一个字符串如果从键盘上输入“ABCDE↙”,返回后,缓冲区各字节依次为:81,5,41H,42H,43H,44H,45H,0DH,……。93第4章数据运算与输入输出2024/1/284.5输入与输出[例34]从键盘输入最多5个个位数字,求它们的和,存入SUM。DATA SEGMENTSUM DB ?BUFFER DB 6,?,6DUP(?)DATA ENDSCODE SEGMENTASSUME DS:DATA,CS:CODESTART: MOV AX,DATA MOV DS,AX LEA DX,BUFFER ;装载输入缓冲区首地址

MOV AH,0AH ;行输入功能代号

INT 21H ;调用系统服务EP404B.ASM94第4章数据运算与输入输出2024/1/284.5输入与输出 MOV SUM,0 ;累加器清零

MOV CL,BUFFER+1;循环次数

MOV CH,0 LEA BX,BUFFER+2;装载字符存放区首地址ONE: MOV AL,[BX] ;取出一个字符

AND AL,0FH ;ASCII码转换成二进制数

ADD SUM,AL ;累加

INC BX ;修改指针

LOOP ONE ;计数与循环

MOV AX,4C00H INT 21HCODE ENDS END START95第4章数据运算与输入输出2024/1/284.5输入与输出[例35]从键盘上输入不大于65535的十进制数,转换成二进制数。DATA SEGMENTBUFFER DB6,?,6DUP(?)C10 DW10X DW?DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART: MOVAX,DATA MOVDS,AX LEA DX,BUFFER ;装载输入缓冲区首地址

MOV AH,0AH ;行输入功能代号

NT 21H ;输入一个数,以回车结束。EP405.ASM96第4章数据运算与输入输出2024/1/284.5输入与输出2024/1/28962024/1/282024/1/28962024/1/282024/1/28962024/1/28 MOV AX,0 ;累加器清零

MOV CL,BUFFER+1 ;循环次数

MOV CH,0 LEA BX,BUFFER+2 ;字符存放区首地址ONE: MUL C10 ;P=P×10 MOV DL,[BX] ;取出一个字符

AND DL,0FH ;转换成二进制数

ADD AL,DL ;累加

ADC AH,0 INC BX ;修改指针

LOOP ONE ;计数与循环

MOV X,AX ;保存结果

MOV AX,4C00H INT 21HCODE ENDS END START4.5输入与输出97第4章数据运算与输入输出2024/1/28[例36]用查表法将一个32位二进制无符号数按十六进制数显示。EP406.ASM98第4章数据运算与输入输出2024/1/284.5输入与输出2024/1/28982024/1/282024/1/28982024/1/282024/1/28982024/1/28注意使用32位寻址第4章 小结第4章数据运算与输入输出2024/1/2899汇编语言程序设计

算术、逻辑、移位指令数量较多,主要用于数值计算和表达式计算,应该注意每条指令对标志位的影响。其中的CMP和TEST指令,在下一章的分支和循环程序中也经常用到。

字符的输入输出,特别是1、2、9、10号功能调用应熟练掌握,灵活使用。谢谢!2024/1/28100汇编语言程序设计第4章数据运算与输入输出8、串操作指令

字符串连续地存贮在内存储器中,每个字符的编码占用一个字节。2024/1/28101汇编语言程序设计一、与无条件重复前缀配合使用的串指令二、与有条件重复前缀配合使用的指令串操作指令的共同特点:

2024/1/28102汇编语言程序设计源操作数由DS:[SI]提供(有时也可以由AL、AX、EAX提供);

目的操作数由ES:[DI]提供每执行一次串操作,自动修改SI和(或)DI,使其指向下一个字节、字或双字方向标志DF控制对SI、DI递增或是递减

指令STD将DF置1,指令CLD将DF清0一、与无条件重复前缀REP配合使用的指令

2024/1/28103汇编语言程序设计1.MOVS字符串传送指令格式:MOVSB/MOVSW/MOVSD

执行的操作:

(1)目的操作数单元←源操作数,即ES:[DI]←DS:[SI](2)修改SI和DI值2024/1/28104汇编语言程序设计2.REP串重复操作前缀格式:

REP串操作指令

执行的操作:重复执行串操作指令,直到CX的值为零如果(CX)≠0:(1)(CX)=(CX)-1

(2)执行串指令(3)转向(1)如果(CX)=0,结束本指令操作2024/1/28105汇编语言程序设计[例1]把长度为100的字符串str1复制到str2开始的存储单元中:假设已经执行如下指令,装载了DS:SI和ES:DI。

MOVAX,SEGstr1 ;源数据的段地址

MOVDS,AX ;送入DS LEASI,str1 ;源数据的起始偏移地址送入SI MOVAX,SEGstr2 ;目的数据的段地址

MOVES,AX ;送入ES LEADI,str2 ;目的数据的起始偏移地址送入DI2024/1/28106汇编语言程序设计

MOVCX,100 ;字符串长度送入CXAGAIN:MOVAL,[SI] ;从源数据区取出一个字节

MOVES:[DI],AL ;存入目的数据区

INCSI ;修改源数据区指针

INCDI ;修改目的数据区指针

LOOPAGAIN ;重复上面的操作100次(1)用循环控制方法编写的程序2024/1/28107汇编语言程序设计

CLD ;方向标志DF清0 MOVCX,100 ;字符串长度送人CX REPMOVSB ;执行100次MOVSB指令(2)用字符串传送指令编写的程序

MOVCX,100 ;字符串长度送入CXAGAIN:MOVSB ;从源数据传送一个字节到目的数据区

LOOPAGAIN ;重复上面的操作100次(3)用带重复前缀的字符串传送指令编写的程序2024/1/28108汇编语言程序设计格式:STOSB/STOSW/STOSD执行的操作:(1)目的存储单元←累加器字节操作:ES:[DI]←(AL)字操作:ES:[DI]←(AX)双字操作:ES:[DI]←(EAX)(2)修改DI值IN

3.STOS存字符串指令2024/1/28109汇编语言程序设计MOV DI,1000HMOV CX,100XOR AL,ALREP STOSBSTOS可以与REP联用MOV DI,1000HMOV CX,50MOV AX,0FFHREP STOSW两组指令序列分别执行后的结果有什么不同?2024/1/28110汇编语言程序设计格式:LODSB/LODSW/LODSD执行的操作:(1)累加器←源存储单元字节操作:(AL)←DS:[SI]

字操作:(AX)←DS:[SI]

双字操作:(EAX)←DS:[SI]

(2)修改SI值4.LODS取字符串指令LODS一般不与REP联用二、与有条件重复前缀配合使用的指令

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论