汇编语言程序设计第3章寻址方式_第1页
汇编语言程序设计第3章寻址方式_第2页
汇编语言程序设计第3章寻址方式_第3页
汇编语言程序设计第3章寻址方式_第4页
汇编语言程序设计第3章寻址方式_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

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

文档简介

计算机是通过执行指令序列来解决问题的,因而每种计算机都有一组指令集供给用户使用,这组指令集就称为计算机的指令系统。

指令系统即一组指令的集合。第3章80x86的指令系统和寻址方式

指令系统(百度百科)

计算机所能执行的全部指令的集合,它描述了计算机内全部的控制信息和“逻辑判断”能力。不同计算机的指令系统包含的指令种类和数目也不同。一般均包含算术运算型、逻辑运算型、数据传送型、判定和控制型、输入和输出型等指令。指令系统是表征一台计算机性能的重要因素,它的格式与功能不仅直接影响到机器的硬件结构,而且也直接影响到系统软件,影响到机器的适用范围。

指令微机完成规定操作的命令,一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。

一条指令通常由操作码字段和操作数字段两部分组成。指令的格式:

[名字:]操作码[操作数[,操作数]][;注释]其中,操作码用助记符表示,指明了指令的操作性质及功能,操作码字段在机器里的表示比较简单,只需对每一种操作指定确定的二进制代码即可。地址码则给出了操作数或操作数的地址。

操作数

计算机在运行过程需要的数据称为操作数,用符号或符号地址来表示操作数或操作数的地址。指令的操作数字段的情况比较复杂,可以在指令中,寄存器中或存储单元中。如果操作数在存储器里,一个存储单元20位的物理地址如何求得呢?另外,操作数常常不是单个的数,往往是成组的以表格或数组的形式存放在存储器的某一区域,在这种情况下,指令用什么方式来指定操作数地址更好呢?

寻址方式

根据指令内容确定操作数地址的过程称为寻址。80x86的寻址方式有:与数据有关的寻址方式

用来确定操作数地址从而找到操作数。与转移地址有关的寻址方式

用来确定转移指令及CALL指令的转向地址。本节数据寻址方式的讨论中均以MOV传送指令为例,指令中逗号之前的操作数为目的操作数,逗号后面的操作数为源操作数。如:

MOVAX,BX

;AX为目的操作数,BX为源操作数;指令的执行结果是将BX的内容传到AX中去。1.8086的寻址方式

与数据有关的寻址方式:以MOV

指令为例立即寻址MOVAX,3069H寄存器寻址MOVAL,BH直接寻址MOVAX,[2000H]寄存器间接寻址MOVAX,[BX]

寄存器相对寻址MOVAX,COUNT[SI]

基址变址寻址MOVAX,[BP][DI]相对基址变址寻址MOVAX,MASK[BX][SI]存储器寻址(1)立即寻址方式*——操作数在指令中给出指令格式:MOVAL,5MOVAX,3064HMOVAL,‘A’*

只能用于

SRC字段

MOV40H,AL

*SRC和DST的字长一致

MOVAH,3064H

请参看教材P.36(2)寄存器寻址方式*—操作数在指定的寄存器中

MOVAX,BXMOVAL,BHMOVAX,3064H*

字节寄存器只有

AHALBHBLCHCLDHDL*SRC和DST的字长一致

MOVAH,BX

*

CS不能用

MOV指令改变

MOVCS,AX

请参看教材P.36-P.38逻辑地址、段地址、偏移地址、有效地址(EA)和物理地址之间的关系如何?有效地址的组成成分有四种:位移量基址变址比例因子请参看教材P.38、P.39表3.1除上述两种寻址方式外,以下各种寻址方式的操作数都在除代码段以外的存储区中。各种访存类型下所对应的段的默认选择关系?改变系统所指定的默认段采用什么方法?请参看教材P.39和表3.2默认的段寄存器访问存储器的方式可跨越的段寄存器偏移地址取指令

CS无IP堆栈操作

SS无SP一般数据访问

DSCSESSS有效地址EABP作为基址的寻址

SSCSDSESBP串操作的源操作数

DSCSESSSSI串操作的目的操作数

ES无DI段寄存器的使用规定50(3)直接寻址方式*—有效地址EA由指令直接给出

例:MOVAX,[2000H]

EA=2000H,假设(DS)=3000H,那么PA=32000H*

隐含的段为数据段DS*

可使用段跨越前缀

MOVAX,ES:[2000H]*

操作数地址可由变量(符号地址)表示,但要注意VALUEDB10变量的属性MOVAH,VALUE

MOVAX,VALUE

MOVAX,WORDPTRVALUE

5030

32000AHAL30(AX)=3050H请参看教材P.39-P.40(4)寄存器间接寻址*—EA在基址寄存器(BX/BP)

或变址寄存器(SI/DI)中

MOVAX,[BX]PA=16d(DS)+(BX)MOVAX,ES:[BX]PA=16d(ES)+(BX)MOVAX,[BP]PA=16d(SS)+(BP)*不允许使用AX、CX、DX存放EAMOVAX,[CX]

*

SRC和DST的字长一致

MOVDL,[BX];[BX]指示一个字节单元

MOVDX,[BX];[BX]指示一个字单元*

适于数组、字符串、表格的处理请参看教材P.40-P.41

有效地址=(BX)(BP)8位(SI)16位(DI)+位移量(5)寄存器相对寻址方式*指令格式:MOVAX,COUNT[SI]或

MOVAX,[COUNT+SI]

假设(DS)=3000H,(SI)=2000H,COUNT=3000H,

则:PA=35000H

假设(35000H)=1234H,那么(AX)=1234H*适于数组、字符串、表格的处理请参看教材P.40(BX)(SI)(BP)(DI)(6)基址变址寻址方式*指令格式:

MOVAX,[BX][DI]MOVAX,[BX+DI]MOVAX,ES:[BX][SI]*适于数组、字符串、表格的处理*必须是一个基址寄存器和一个变址寄存器的组合

MOVAX,[BX][BP]

MOVAX,[SI][DI]

有效地址=+请参看教材P.41-P.42(7)相对基址变址寻址方式

MOVAX,MASK[BX][SI]

MOVAX,MASK[BX+SI]

或MOVAX,[MASK+BX+SI]

有效地址=(BX)(SI)8位(BP)(DI)16位++位移量请参看教材P.42-P.43直接写出变量名是直接寻址方式变量名加减一个常量还是直接寻址方式变量名和一个寄存器则是寄存器相对寻址方式利用offset后跟一个变量名则是立即数寻址方式[BX+SI+16]去掉16=[BX+SI][BX+SI+16]去掉SI=[BX+16][BX+SI+16]去掉SI+16=[BX]寻址方式小结1:1、区别MOVAX,126

和MOVAX,[126]2、区别MOVAX,BX

和MOVAX,[BX]3、在双操作数中,源和目的操作数的地址不能同时为存储器寻址。4、段跨越前缀可修改操作数所在的段,不能用CS做段跨越前缀。

寻址方式小结2:例:编写一段显示字符串STRING的程序

DATASEGMENTSTRINGDB‘HAPPYNEWYEAR!’,0DH,0AH,‘$’COUNTDW17DATAENDS(1)直接寻址

movdl,string

movah,2

int21h;显示字符‘H’

movdl,string+1

movah,2

int21h;显示字符‘A’::(2)寄存器间接寻址

mov

cx,count;mov

cx,17

mov

bx,offsetstring;string的偏址

bxNext:movdl,[bx]

movah,2

int21h;显示一个字符

incbxloopnext;循环指令(3)寄存器相对寻址

mov

cx,count;mov

cx,17

mov

si,0Next:movdl,string[si];movdl,[string+si]

movah,2

int21h;显示一个字符

incsiloopnext;循环指令(4)基址变址寻址

mov

cx,count;mov

cx,17

mov

bx,offsetstring;string的偏址

bx

mov

si,0Next:movdl,[bx][si];movdl,[bx+si]

movah,2

int21h;显示一个字符

incsiloopnext;循环指令(5)DOS显示字符串功能

mov

dx,offsetstring;string的偏址

dx

;leadx,string

movah,9

int21h;显示一串字符80x86新增的寻址方式

EA=(基址寄存器)+(变址寄存器)

比例因子+位移量(1)比例变址寻址方式

例:MOVEAX,COUNT[ESI

4](2)基址比例变址寻址方式

例:MOVECX,[EAX][EDI

4]

(3)相对基址比例变址寻址方式

例:MOVEAX,TABLE[EBP][EDI

4]▲16位和32位寻址的差异地址成分16位寻址32位寻址基址寄存器BX、BP任何32位通用寄存器变址寄存器SI、DI除ESP外的任何32位通用寄存器比例因子11、2、4、83.1.2与转移地址有关的寻址方式:段内寻址段内直接寻址JMPNEARPTRNEXT

段内间接寻址JMPTABLE[BX]

段间寻址

段间直接寻址JMPFARPTRNEXT

段间间接寻址JMPDWORDPTR[BX]用来确定转移指令及转子(CALL)指令的转向地址。(1)段内直接寻址转向的有效地址=当前(IP)+位移量(8bit/16bit)

例:JMPNEARPTRNEXT近转移-32768~+32767

JMPSHORTNEXT

短转移-128~+127

位移量为-0BH,0F5H是位移量的补吗。当前(IP)(2)段内间接寻址

转向的有效地址是一个寄存器或存储单元的内容。(可用除立即数以外的任何一种数据寻址方式得到)

例:TABLE=20A2H(BX)=1256H(SI)=528EH(DS)=2000H(232F8H)=3280H(264E4H)=2450H

JMPBX;(IP)=1256H

JMPTABLE[BX]JMPWORDPTRTABLE[BX];(IP)=3280H

JMP[BX][SI]JMPWORDPTR[BX][SI];(IP)=2450H请参看教材P.45code1segment……

jmp

farptrnext……code1endscode2segment……next:…...……code2ends(3)段间直接寻址

用指令中提供的转向段地址和偏移地址取代CS和IP

例:请参看教材P.46(4)段间间接寻址

用存储器中的两个相继字的内容取代CS和IP

(存储单元的地址可用存储器寻址方式得到)

例:

JMPDWORDPTR[INTERS+BX]

PA=(DS)×24+(BX)+INTERS(PA+1,PA)→IP(PA+3,PA+2)→CS请参看教材P.46第3章练习Page107

3.13.33.53.73.113.13

数据传送指令

算术指令

逻辑指令

串处理指令

控制转移指令

处理机控制与杂项操作指令3.38086的指令系统重点关注:指令的汇编格式指令的基本功能指令支持的寻址方式指令的执行对标志位的影响指令的特殊要求学习指令的注意事项指令的功能——该指令能够实现何种操作。指令支持的寻址方式——该指令中的操作数可以采用何种寻址方式指令对标志的影响——该指令执行后是否对各个标志位有影响,以及如何影响其他方面——该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等

通用数据传送指令

MOV、MOVSX、MOVZX(386)

PUSH、POP、PUSHA、POPA(286)

PUSHAD、POPAD(386)

XCHG

累加器专用传送指令

IN、OUT、XLAT请参看教材P.473.3.1数据传送指令1:

地址传送指令

LEA、LDS、LES、LFS、LGS、LSS(386)

标志寄存器传送指令

LAHF、SAHFPUSHF、POPFPUSHFD、POPFD(386)

类型转换指令

CBW、CWD、CDQ(386)

BSWAP(486)数据传送指令2:传送指令:MOVDST,SRC执行操作:(DST)(SRC)

1、通用数据传送指令请参看教材P.48-P.49MOV指令的机器语言可以有7种格式:

MOVmem/reg1,mem/reg2MOVreg,dataMOVac,memMOVmem,acMOVsegreg,mem/regMOVmem/reg,segregMOVmem/reg,dataDST、SRC不能同时为段寄存器

MOVDS,ES

立即数不能直接送段寄存器

MOVDS,2000H

*DST不能是立即数和CS*DST、SRC不能同时为存储器寻址*不影响标志位注意:MOVAX,DSEGMOVDS,AX请参看教材P.48-P.49例3.20-3.24

简单了解(2)MOVSX和(3)MOVZX(4)进栈指令:PUSHSRC

执行操作:(SP)

(SP)–2((SP)+1,(SP))

(SRC)PUSH指令可以有4种格式:PUSHregPUSHmemPUSHdataPUSHsegreg但8086不允许使用立即数寻址方式。

(5)出栈指令:POPDST执行操作:(DST)

((SP)+1,(SP))

(SP)

(SP)+2POP指令允许的格式有:POP

regPOP

memPOP

segreg(CS除外)堆栈:‘先进后出’的存储区,段地址存放在SS中,SP在任何时候都指向栈顶,进出栈后自动修改SP。注意:

*堆栈操作必须以字为单位。

*不影响标志位

*不能用立即寻址方式

PUSH1234H

*DST不能是CSPOPCS

请参看教材P.50-P.51例3.29:假设(AX)=2107H,执行

PUSHAX********(SP)

PUSHAX执行前(SP)

********07H21H低地址

高地址PUSHAX执行后进栈方向(SP)

********07H21HPOPBX执行前(SP)

********07H21H低地址

高地址

POPBX执行后

(BX)=2107H例3.30:POPBX出栈方向例:PUSHDSSUBAX,AXPUSHAX…………RET例:PUSHAXPUSHBXPUSHCX……;其间用到AX、BX、CXPOPCX;后进先出

POPBXPOPAX(6)PUSHAAX,CX,DX,BX,指令执行前的SP,BP,SI,DI。PUSHAD(7)

POPASP出栈后如何处理?

POPAD请参看教材P.52(8)XCHG交换指令

交换指令:XCHGOPR1,OPR2

执行操作:(OPR1)

(OPR2)注意:

*不影响标志位

*两个操作数必须有一个在寄存器中*不允许使用段寄存器

例:XCHGBX,[BP+SI]XCHGAL,BH请参看教材P.52-P.532、累加器专用传送指令(只限使用AX或AL)

输入指令IN(I/O

CPU)

长格式:INAL,PORT(字节)

INAX,PORT(字)执行操作:(AL)

(PORT)(字节)

(AX)

(PORT+1,PORT)(字)

短格式:INAL,DX(字节)

INAX,DX(字)执行操作:(AL)((DX))(字节)

(AX)((DX)+1,(DX))(字)

输出指令OUT(CPU

I/O)长格式:OUTPORT,AL(字节)

OUTPORT,AX(字)执行操作:(PORT)

(AL)(字节)

(PORT+1,PORT)

(AX)(字)短格式:OUTDX,AL(字节)

OUTDX,AX(字)执行操作:((DX))

(AL)(字节)

((DX)+1,(DX))

(AX)(字)请参看教材P.54注意:*不影响标志位*前256个端口号00H~FFH可直接在指令中指定(长格式)*

如果端口号

256,端口号

DX(短格式)例3.36:INAX,28H MOVDATA_WORD,AX例3.37:MOVDX,3FCHINAX,DX例3.38:OUT5,AL例:Sound程序

mov

dx,100inal,61handal,11111100bsound:

xoral,2;101out61h,al;ONOFFON

mov

cx,140h;脉宽Wait1:loopwait1

dec

dx

jnesound设备控制寄存器端口61H1/00控制其它外部设备与门放大器2号定时器门控10(3)换码指令:XLAT或XLATOPR执行操作:(AL)

((BX)+(AL))注意:

*不影响标志位*字节表格(长度不超过256)

首地址

(BX)*需转换的代码位移量(AL)请参看教材P.55例:MOVBX,OFFSETTABLE;(BX)=0040HMOVAL,3XLATTABLE

指令执行后(AL)=33H33HF0043(BX)

30HF0040TABLE31HF0041(AL)=332HF0042(DS)=F000H3、地址传送指令

有效地址送寄存器指令:LEAREG,SRC

执行操作:(REG)

SRC

指针送寄存器和DS指令:LDSREG,SRC

执行操作:(REG)

(SRC)(DS)

(SRC+2)

相继二字

寄存器、DS

指针送寄存器和ES指令:LESREG,SRC

执行操作:(REG)

(SRC)(ES)

(SRC+2)

相继二字

寄存器、ES请参看教材P.55表3.4以上内容例3.40:LEABX,[BX+SI+0F62H]

LDSSI,[10H]

LESDI,[BX]40H00H00H30HTABLE(DS):1000HMOVBX,TABLE;(BX)=0040HMOVBX,OFFSETTABLE

;(BX)=1000HLEABX,TABLE

;(BX)=1000HLDSBX,TABLE;(BX)=0040H

;(DS)=3000HLESBX,TABLE;(BX)=0040H

;(ES)=3000H注意:

*不影响标志位*REG不能是段寄存器*SRC必须为存储器寻址方式请参看教材P.55例3.414、标志寄存器传送指令

标志送AH指令:LAHF

执行操作:(AH)

(FLAGS的低字节)

AH送标志寄存器指令:SAHF

执行操作:(FLAGS的低字节)

(AH)

标志进栈指令:PUSHF

执行操作:(SP)

(SP)-2((SP)+1,(SP))

(FLAGS)

标志出栈指令:POPF

执行操作:(FLAGS)

((SP)+1,(SP))(SP)

(SP)+2*影响标志位请参看教材P.585、类型转换指令

CBWAL

AX

执行操作:若(AL)的最高有效位为0,则(AH)=00H

若(AL)的最高有效位为1,则(AH)=FFH

CWDAX

(DX,AX)

执行操作:若(AX)的最高有效位为0,则(DX)=0000H

若(AX)的最高有效位为1,则(DX)=FFFFH

例:(AX)=0BA45HCBW;(AX)=0045HCWD;(DX)=0FFFFH(AX)=0BA45H注意:*无操作数指令*隐含对AL或AX进行符号扩展*不影响条件标志位请参看教材P.58算术指令:

加法指令

ADD、ADC、INC、XADD(486)

减法指令

SUB、SBB、DEC、NEG、CMP

CMPXCHG(486)、CMPXCHG8B(Pentium)

乘法指令

MUL、IMUL

除法指令

DIV、IDIV

十进制调整指令

DAA、DAS(压缩的BCD码调整指令)

AAA、AAS、AAM、AAD(非压缩)

加法指令

加法指令:ADDDST,SRC

执行操作:(DST)

(SRC)+(DST)

带进位加法指令:ADCDST,SRC

执行操作:(DST)

(SRC)+(DST)+CF

加1指令:INCOPR

执行操作:(OPR)

(OPR)+1注意:*除INC指令不影响CF标志外,均对条件标志位有影响。请参看教材P.59加法指令对条件标志位的影响1结果为负0否则SF=1结果为00否则ZF=1和的最高有效位有向高位的进位0否则CF=1两个操作数符号相同,而结果符号与之相反0否则OF=那么,CF和OF的区别是什么呢?CF位表示无符号数相加的溢出。OF位表示带符号数相加的溢出。请参看教材P.59下-P.60上说明

00001001+0111110010000101

带:(+9)+(+124)=-123OF=1

无:9+124=133CF=0

00000111+11111011100000010带:(+7)+(-5)=+2OF=0无:7+251=2CF=1

10000111+11110101101111100带:(-121)+(-11)=+124OF=1无:135+245=124CF=1举例:n=8bit带符号数(-128~127),无符号数(0~255)

00000100+0000101100001111带:(+4)+(+11)=+15OF=0无:4+11=15CF=0带符号数和无符号数都不溢出带符号数溢出无符号数溢出带符号数和无符号数都溢出请参看教材P.60下-P.61上例3.45例3.46:双精度数的加法

(DX)=0002H(AX)=0F365H(BX)=0005H(CX)=0E024H

指令序列

ADDAX,CX;(1)ADCDX,BX;(2)

(1)执行后,(AX)=0D389H

CF=1OF=0SF=1ZF=0(2)执行后,(DX)=0008HCF=0OF=0SF=0ZF=0

因此,结果正确。请参看教材P.61

减法指令减法指令:SUBDST,SRC执行操作:(DST)

(DST)-(SRC)带借位减法指令:SBBDST,SRC执行操作:(DST)

(DST)-(SRC)-CF减1指令:DECOPR执行操作:(OPR)

(OPR)-1求补指令:

NEGOPR执行操作:(OPR)

-(OPR)

把操作数按位求反后末位加1。比较指令:CMPOPR1,OPR2执行操作:(OPR1)-(OPR2)注意:*除DEC指令不影响

CF标志外,均对条件标志位有影响。请参看教材P.62减法指令对条件标志位(CF/OF/ZF/SF)的影响:CF位表示无符号数减法的溢出。OF位表示带符号数减法的溢出。1被减数的最高有效位有向高位的借位0否则CF=1两个操作数符号相反,而结果的符号与减数相同0否则OF=1减法转换为加法运算时无进位0否则CF=或请参看教材P.63上NEG指令对CF/OF的影响0操作数为01否则CF=1操作数为-128(字节运算)或操作数为-32768(字运算)0否则OF=

00011110+00011111NEG指令对CF/OF的影响0操作数为01否则CF=1操作数为-128(字节运算)或操作数为-32768(字运算)0否则OF=

00001111+000110000

10000111+00011000例3.48SUB[SI+14H],0136H例3.49SUBDH,[BP+4]请参看教材P.63例3.50:x、y、z均为双精度数,分别存放在地址为X,X+2;

Y,Y+2;Z,Z+2的存储单元中,用指令序列实现

w

x+y+24-z,并用W,W+2单元存放wMOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2;x+yADDAX,24ADCDX,0;x+y+24SUBAX,ZSBBDX,Z+2;x+y+24-zMOVW,AXMOVW+2,DX;结果存入W,W+2单元请参看教材P.643、乘法指令

无符号数乘法指令:MULSRC

带符号数乘法指令:IMULSRC

执行操作:字节操作数(AX)

(AL)*(SRC)

字操作数(DX,AX)

(AX)*(SRC)注意:

*AL(AX)为隐含的乘数寄存器。*AX(DX,AX)为隐含的乘积寄存器。*SRC不能为立即数。*除CF和OF外,对条件标志位无定义。请参看教材P.64-P.65乘法指令对CF/OF的影响:例3.52:(AL)=0B4H,(BL)=11H

(1)

IMULBL

;(AX)(AL)*(BL)

;B4*11CC*11=0FAF4H-1292D

;

(AX)=0FAF4H

CF=OF=1(2)

MULBL

;(AX)(AL)*(BL)

;B4*11

=0BF4H=3060D

;(AX)=0BF4H

CF=OF=100乘积的高一半为零11否则MUL指令:CF,OF=00乘积的高一半是低一半的符号扩展11否则

IMUL指令:CF,OF=

除法指令

无符号数除法指令:DIVSRC

带符号数除法指令:IDIVSRC

执行操作:字节操作(AL)

(AX)/(SRC)的商

(AH)

(AX)/(SRC)的余数字操作

(AX)

(DX,AX)/(SRC)的商

(DX)

(DX,AX)/(SRC)的余数注意:

*AX(DX,AX)为隐含的被除数寄存器。*AL(AX)为隐含的商寄存器。*AH(DX)为隐含的余数寄存器。*SRC不能为立即数。*对所有条件标志位均无定义。如何判别结果有效?请参看教材P.66-P.67例:x,y,z,v均为16位带符号数,计算

(v-(x*y+z–540))/xMOVAX,XIMULY;x*y→(DX,AX)MOVCX,AXMOVBX,DXMOVAX,ZCWD;Z→(DX,AX)ADDCX,AXADCBX,DX;x*y+z→(BX,CX)SUBCX,540SBBBX,0;x*y+z-540MOVAX,VCWD;V→(DX,AX)SUBAX,CXSBBDX,BX;v-(x*y+z-540)IDIVX;(v-(x*y+z-540))/x→(AX)

余数→(DX)

十进制调整指令BCD码:用二进制编码的十进制数,又称二--十进制数压缩的BCD码:用4位二进制数表示1位十进制数

例:(59)10=(01011001)BCD非压缩的BCD码:用8位二进制数表示1位十进制数例:(59)10=(0000010100001001)BCD数字的ASCII码是一种非压缩的BCD码

DIGIT ASCII BCD0 30H 001100001 31H 001100012 32H 00110010… … …9 39H 00111001UNPAK00H09H05H03H例:写出(3590)10的压缩BCD码和非压缩BCD码,并分别把它们存入数据区PAKED和UNPAK压缩BCD: (3590)10=(0011010110010000)BCD非压缩BCD:

(3590)10=(00000011000001010000100100000000)BCDPAKED90H35H问题的提出:十进制调整指令19压缩BCD:00011001

2700100001+110

+08+00001000

(00100111)BCDAF=1(1)压缩的BCD码调整指令●DAA加法的十进制调整指令●DAS减法的十进制调整指令(2)非压缩的BCD码调整指令(了解)●AAA加法的ASCII码调整指令●AAS减法的ASCII码调整指令●AAM乘法的ASCII码调整指令●AAD除法的ASCII码调整指令压缩BCD运算举例:(1)MOVAL,BCD1;BCD1=34H

ADDAL,BCD2;BCD2=59H,(AL)=8DH

DAA;8DH+06H=93H

MOVBCD3,AL;BCD3=93H(2)MOVAL,BCD1;BCD1=34H

SUBAL,BCD2;BCD2=59H,(AL)=0DBH

DAS;0DBH-60H-06H=75H

MOVBCD3,AL;BCD3=75=-25(10n’补码)非压缩BCD运算举例:(1)MULBL;(AX)=(AL)×(BL)=08×09

AAM;(AL)/0AH=48H/0AH→0702(2)AAD;(AX)→(AH)×0AH+(AL)=48H

DIVBL;(AL)=(AX)/(BL)=48H/4=12HAAM;(AL)/0AH=12H/0AH=0108第3章作业Page109

3.14~3.17

逻辑指令:

逻辑运算指令

AND、OR、NOT、XOR、TEST

移位指令

SHL、SHR、SAL、SAR、

ROL、ROR、RCL、RCR请参看教材P.68下请参看教材P.68下逻辑非指令:NOTOPR*OPR不能为立即数执行操作:(OPR)

(OPR)*不影响标志位

逻辑与指令:ANDDST,SRC执行操作:(DST)

(DST)

(SRC)逻辑或指令:ORDST,SRC执行操作:(DST)

(DST)

(SRC)异或指令:XORDST,SRC执行操作:(DST)

(DST)

(SRC)测试指令:TESTOPR1,OPR2

执行操作:(OPR1)

(OPR2)CFOFSFZFPFAF00***无定义

根据运算结果设置

逻辑运算指令请参看教材P.69至少有一个操作数必须存放在寄存器中,另一个操作数可以使用任意寻址方式,只有源操作数可以为立即数例:屏蔽AL的第0、1两位

ANDAL,0FCH例:置AL的第5位为1

ORAL,20H

例:使AL的第0、1位变反

XORAL,3例:测试某些位是0是1

TESTAL,1JZEVEN

********

OR00100000**1*****

******01XOR00000011

******10

********

AND11111100******00********

AND000000010000000*请参看教材P.69-P.69的例题•用AND指令可以使操作数的某些位被屏蔽,把AND指令的源操作数设置成一个立即数,并把需要屏蔽的位设为0。•用OR指令可以使操作数的某些位置1,把OR指令的源操作数设置成一个立即数,并把需要置1的位设为1。•用TEST指令测试操作数的某位是否为0,把TEST指令的源操作数设置成一个立即数,其中需要测试的位应设为1。•要测试操作数的某位是否为1,则可先把该操作数求反,然后用TEST指令测试。

•用XOR指令可以使操作数的某些位变反,把XOR指令的源操作数设置成一个立即数,并把需要变反的位置1。•XOR指令还可以用来测试某一操作数是否与另一确定的操作数相等。如:XORAX,042EHJZMATCH•由于逻辑指令执行后,CF=0,因此,很多程序中经常用到寄存器自身“与”,“或”,“异或”等操作,其主要目的是使CF清0。

CF0逻辑左移SHLOPR,CNT逻辑右移SHROPR,CNT算术左移SALOPR,CNT(同逻辑左移)算术右移SAROPR,CNT

0CFCF

4.移位指令循环左移ROLOPR,CNT循环右移ROROPR,CNT带进位循环左移RCLOPR,CNT带进位循环右移RCROPR,CNTCF

CFCFCF注意:

*OPR可用除立即数以外的任何寻址方式*CNT=1,SHLOPR,1CNT>1,MOVCL,CNTSHLOPR,CL;以SHL为例*条件标志位:

CF=移入的数值

1CNT=1时,最高有效位的值发生变化0CNT=1时,最高有效位的值不变移位指令:

SF、ZF、PF根据移位结果设置,AF无定义循环移位指令:

不影响SF、ZF、PF、AFOF=请参看教材P.73下请参看教材P.74-P.75的例题例:(AX)=0012H,(BX)=0034H,把它们装配成(AX)=1234H

例:(BX)=84F0H(1)(BX)为无符号数,求

(BX)/2

SHRBX,1

;(BX)=4278H(2)(BX)为带符号数,求

(BX)×2

SALBX,1

;(BX)=09E0H,OF=1(3)(BX)为带符号数,求

(BX)/4MOVCL,2 SARBX,CL;(BX)=0E13CHMOVCL,8ROLAX,CLADDAX,BX

0000

(SP)MOVCH,4;循环次数MOVCL,4;移位次数NEXT:ROLBX,CLMOVAX,BXANDAX,0FHPUSHAXDECCHJNZNEXT00080004000F(3)(BX)=84F0H,把

(BX)

中的16位数每4位压入堆栈3.3.4串处理指令:

设置方向标志指令

CLD、STD

串处理指令

串重复前缀

MOVSB/MOVSWREPSTOSB/STOSWREPE/REPZLODSB/LODSWREPNE/REPNZCMPSB/CMPSWSCASB/SCASW

请参看教材P.75与REP配合工作的MOVS/STOS

温馨提示

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

评论

0/150

提交评论