寻址方式与指令系统构成_第1页
寻址方式与指令系统构成_第2页
寻址方式与指令系统构成_第3页
寻址方式与指令系统构成_第4页
寻址方式与指令系统构成_第5页
已阅读5页,还剩186页未读 继续免费阅读

下载本文档

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

文档简介

《微机原理与接口技术》

辅助教学电子课件

第三章

寻址方式和指令系统一、指令与指令系统指令:控制计算机完成某种操作的命令指令系统:处理器所能识别的所有指令的集合指令的兼容性:同一系列机的指令都是兼容的。二、指令格式指令中应包含的信息:运算数据的来源运算结果的去向执行的操作指令码的格式:指令码由操作码和操作数字段两部分组成。操作码指示该指令执行的操作。操作数字段指示操作数的类型和操作数的寻址方式。操作码操作数…操作数操作码字段操作数字段操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分操作数是指令执行的参与者,即各种操作的对象有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数3.18086/8088系统的寻址方式8086/8088指令系统操作数的种类分为两大类:3.1.1操作数的种类数据操作数转移地址操作数数据操作数具体数值,也称立即数(im):操作数据在指令中。寄存器(reg):操作数存放在寄存器中。存储器(mem):操作数存放在指定的存储单元中。I/O端口:操作数来自或送到I/O端口。指令的执行速度

对不同的操作数,指令执行的时间不同:存储器

快!立即数寄存器转移地址操作数指令操作的对象不是数据,而是要转移的目标地址。要转移的目标地址包含在指令中,或存放在寄存器中,或存放在存储单元中。对于转移地址操作数,其指令只有一个目标操作数,它是一个供程序转移的目标地址。寻址方式(AddressingMode)

指令中关于如何求出存放操作数有效地址的方法。有效地址EA(EffectiveAddress)根据寻址方式计算得到的地址。

3.1.2寻址方式(AddressingMode)操作数直接包含在指令中,紧跟在操作码之后,作为指令的一部分,这种操作数称为立即数(im)立即数可以是8位(00H~FFH)也可以是16位(0000H~FFFFH)立即数寻址方式 (Immediateaddressing)例3.1

MOVBL,80H MOVAX,0102H指令执行后的结果为:

BL=80H; AX=0102H立即数寻址方式只能作为源操作数,主要用来给寄存器或存储单元赋值。演示操作数存放在指令指定的寄存器(reg)中可以8位寄存器(reg8)

:AH、AL、BH、BL、CH、CL、DH、DL可以16位寄存器(reg16)

:AX、BX、CX、DX、SI、DI、SP、BP及CS、DS、SS、ES寄存器名表示其内容(操作数)寄存器寻址方式(Registeraddressing)例3.2

MOVCL,DL MOVAX,BX如果 DL=50H,BX=1234H,则执行结果为:

CL=50H,AX=1234H演示存储器寻址方式操作数在主存储器中,用主存地址表示程序设计时,8088采用逻辑地址表示主存地址段地址在默认的或用段超越前缀指定的段寄存器中指令中只需给出操作数的偏移地址(有效地址EA)1.直接寻址方式2.寄存器间接寻址方式3.寄存器相对寻址方式4.基址变址寻址方式5.相对基址变址寻址方式存储器寻址方式又分为操作数的有效地址EA直接在指令中给出用中括号包含有效地址,表达存储单元的内容直接寻址方式的操作数默认在存储器的数据段,即默认的段寄存器是DS允许使用段超越前缀改变段寄存器。在操作数的前面写上段寄存器名,再加上冒号“:”。直接寻址方式(Directaddressing)例3.3

MOVAX,[2000H]EA=2000H,如果当前DS=1492H,则操作数存储单元的物理地址为: 14920H+2000H=16920H若 [16920]=9078H执行结果为:AX=9078H

演示MOVAX,ES:[2000H] ;AX←ES:[2000H]例如: MOVAL,VALUE

MOVAL,[VALUE]VALUE也称为为存放操作数单元的符号地址。在用汇编语言编程时,常用符号地址代替数值地址。有效地址在指令中指定的寄存器SI、DI、BX

或BP中,操作数本身在存储器中。若指定的寄存器为:SI、DI、BX,默认的段寄存器是DS若指定的寄存器是BP,默认的段寄存器是SS寄存器间接寻址方式(Registerindirectaddressing)书写指令时,用作间址的寄存器必须加上方括弧,以免与寄存器寻址方式混淆允许使用段超越前缀改变段寄存器例3.4: MOVAX,[SI]如果

DS=3000H,SI=2000H

物理地址=30000H+2000H=32000H若

[32000H]=4050H执行结果为:

AX

=4050H又:

MOV[BP],AL如果 SS=5000H,BP=1000H

物理地址=50000H+1000H=51000H执行结果为:

[51000H]=50HMOVAX,[BX] ;AX←DS:[BX]演示例:段超越

MOVES:[DI],AXMOVDX,DS:[BP]ADDAL,ES:[BX]SUBCS:[SI],AX寄存器相对寻址方式(Registerrelativeaddressing)有效地址EA是一个由指令中指定的8位或16位位移量disp(displacement)与基址或变址寄存器的内容之和,即EA=SIDIBXBP+disp

8disp16若指令中指定的寄存器是SI,DI,BX,则存放操作数的段寄存器默认为DS若指令中指定BP寄存器,则默认的段寄存器应SS允许段超越前缀改变默认段寄存器。位移量可常用符号表示例3.5:如果

DS=3000H

,

BX=1000H

COUNT=1050H对于指令: MOVCX,[BX+COUNT]物理地址=30000H+1000H+1050H=32050H若 [32050H]=4030H执行后: CX=4030H以下三种指令的形式皆允许,它们完全等价:

MOVAL,[BP+TABLE] MOVAL,[BP]+TABLE MOVAL,TABLE[BP]演示MOVAX,[SI+06H] ;AX←DS:[SI+06H]MOVAX,06H[SI] ;AX←DS:[SI+06H]基址变址寻址方式

(Basedindexedaddressing)有效地址是由指令指定的一个基址寄存器BX或BP和一个变址寄存器SI或DI的内容之和。即:SIDIBXBPEA=+若基址寄存器为BX,默认的段寄存器为DS

若基址寄存器为BP,默认的段寄存器为SS允许段跨越演示MOVAX,[BX+SI] ;AX←DS:[BX+SI]MOVAX,[BX][SI] ;AX←DS:[BX+SI]例3.6:MOV[BX+DI],AX若DS=3000H,BX=1000H,DI=1100H则

EA=1000H+1100H=2100H物理地址=30000H+2100H=32100H若

AX=0050H则执行结果为:[32100H]=0050H。指令:

MOVAH,[BP][SI]如果

BP=2000H,SI=1200H, SS=4000H物理地址=40000H+2000H+1200H=43200H若 [43200H]=56H则执行结果为:

AH=56H基址变址相对寻址方式

(Relativeindexedaddressing)有效地址是指令中指定的8位或16位位移量(disp)与一个基址寄存器和一个变址寄存器的内容之和。即:SIDI

BXBPEA=++disp8disp16当基址寄存器为BX时,默认为DS段寄存器当基址寄存器为BP时,默认为SS段寄存器。允许段超越。演示MOVAX,[BX+DI+6] ;AX←DS:[BX+DI+6]MOVAX,6[BX+DI]MOVAX,6[BX][DI]MOVAX,[BX+SI+COUNT]MOVAX,COUNT[BX][SI]MOVAX,[BX+COUNT][SI]MOVAX,[BX]COUNT[SI]MOVAX,[BX+SI]COUNTMOVAX,COUNT[SI][BX]基址加变址相对寻址方式的不同的书写形式:例3.7

MOVAX,MASK[BX][SI]如果

DS=3000H,BX=2000H, SI=1000H,MASK=0520H物理地址 =30000H+2000H+1000H+0520H =33520H若 [33520]=1234H执行结果为

AX=1234H

3.28086的汇编指令系统数据传送指令位操作指令程序控制指令8086的指令系统包括100多条指令,可分为以下六种类型:算术运算指令串操作指令处理器控制指令格式:MOVDST,SRC操作:dst←srcdst表示目的操作数,src表示源操作数。MOV指令可以是字节(8位)操作,也可以是字(16位)操作。3.2.1数据传送指令MOV(Move)数据传送指令演示例:MOVAX,05H

;字操作

MOVBL,’A’

;字节操作不允许dst与src同时皆为‘mem’操作数目的操作数dst不允许是立即数‘im’、段寄存器‘CS’和‘IP’不允许将立即数直接传送给段寄存器‘MOV’指令不影响标志位。dst,src的具体格式为:dst

src说明reg1reg2reg1不能是IP与CSregimreg不能是CS,DS,ES,SS和IPmimregmemreg不能是CS与IPmreg表中:reg为寄存器操作数,mem代表存储器操作数,im代表立即数。例:合法指令 MOV[BX],AX MOVAX,DATA_SEG MOVDS,AX MOVAX,COUNT[BX][SI] MOVAL,‘E’ MOV[SI],DS

MOVAX,DS ;AX←DS MOVES,AX ;ES←AX←DS对段寄存器的操作不灵活MOV指令--立即数传送mov

cl,4 ;cl←4,字节传送mov

dx,0ffh ;dx←00ffh,字传送mov

si,200h ;si←0200h,字传送mov

bvar,0ah ;字节传送;假设bvar是一个字节变量,定义如下:bvardb0mov

wvar,0bh ;字传送;假设wvar是一个字变量,定义如下:wvar

dw0明确指令是字节操作还是字操作以字母开头的常数要有前导0MOV指令--寄存器传送movah,al ;ah←al,字节传送mov

bvar,ch

;bvar←ch

,字节传送movax,bx

;ax←bx,字传送mov

ds,ax ;ds←ax,字传送mov[bx],al ;[bx]←al,字节传送寄存器具有明确的字节和字类型MOV指令--存储器传送moval,[bx] ;al←ds:[bx]mov

dx,[bp] ;dx←ss:[bp+0]mov

dx,[bp+4] ;dx←ss:[bp+4]mov

es,[si] ;es←ds:[si]不存在存储器向存储器的传送指令MOV指令--段寄存器传送mov[si],dsmovax,ds

;ax←dsmov

es,ax ;es←ax←ds对段寄存器的操作不灵活MOV指令的非法形式非法指令的主要现象:两个操作数的类型不一致无法确定是字节量还是字量操作两个操作数都是存储器段寄存器的操作有一些限制非法指令的主要现象:非法指令--两个操作数类型不一致非法指令:

moval,050ah修正:movax,050ah非法指令:

mov

si,dl修正:movdh,0

mov

si,dx在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令非法指令--无法确定是字节量还是字量操作非法指令:mov[bx+si],255 修正: movbyteptr

[bx+si],255

;byteptr

说明是字节操作 ;movwordptr

[bx+si],255

;wordptr

说明是字操作当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明非法指令--两个操作数都是存储器

movbuf2,buf1 ;非法指令,修正:;假设buf2和buf1是两个字变量;movax,buf1;movbuf2,ax;假设buf2和buf1是两个字节变量;moval,buf1;movbuf2,al8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数)非法指令--段寄存器的操作有一些限制

mov

ds,es

;非法指令,修正:

;movax,es;mov

ds,ax

mov

ds,100h

;非法指令,修正:

;movax,100h;mov

ds,ax

mov

cs,[si]

;非法指令8088指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活堆栈是一种按先进后出的原则组织信息存取的特殊的存储空间。用于存放暂时需要保存的数据8086系统的堆栈在存储器中实现。8086系统堆栈的特点:可以有多个堆栈,每个堆栈空间最大为64K。当前正使用的堆栈称为现行堆栈。SS段寄存器存放现行堆栈的段基址。堆栈为16位宽,堆栈的存取操作总是以字为单位进行。

堆栈向上生长SP寄存器指示堆栈的顶部(当堆栈中有信息时)或底部(当堆栈是空的)当为空堆栈时,SP指向栈底;当要压栈时,先SP-2,然后将16位信息存入堆栈;当要弹栈时,先从栈顶取出16位信息,然后SP+2。·········SSSSSSSPSPSP6587658734123412空堆栈PUSHAX:(AX)=1234HPUSHBX:(AX)=8765HPOPAX格式: PUSHsrc操作: SP←SP-2 SS:[SP+1,SP]←srcPUSH(Pushontothestack)进栈指令PUSH指令只允许是字(16位)操作src可以是reg16、mem,但不能是im例:合法指令

PUSHAXPUSHDSPUSH[BX]例:非法指令

PUSHAL ;不允许字节操作PUSH0FFA2H ;src不允许是im演示格式:POPdst操作:dst

←[SP+1,SP]

SP←SP+2POP指令只能字(16位)操作dst可以是mem,reg16,但不能是CS、IP、imPOP(Popfromstack)出栈指令PUSH,POP指令不影响标志位例:合法指令 popax popwvar例:非法指令

popal

;al为reg8

popbvar

;bvar

为8位内存操作数

popds

;dst为段寄存器演示格式:XCHGOPR1,OPR2操作:OPR1←→OPR2指令允许字或字节操作OPR1、OPR2是两个操作数。它们可以是‘reg’或‘mem’,但二者中必有一个是寄存器不允许使用段寄存器和‘IP’不影响标志位XCHG(Exchange)数据交换指令演示例3.8XCHGBX,[BP+SI]如指令执行前

BX=6F30H,BP=0200H,SI=0046H,SS=2F00H,[2F246H]=4154H。OPR2的物理地址=2F000H+0200H+0046H=2F246H则指令执行后

BX=4154H,[2F246H]=6F30H格式:XLATsrc_table

或XLAT操作:AL←[BX+AL]

src_table是表格首地址(符号地址)XLAT(Translate)查表转换指令XLAT指令用于查找代码转换前,预先要构造一个字节表格表格的内容是所要查找的代码表格的首地址提前存入BX寄存器需要查找的代码的序号是相对表格首地址的位移量,要提前存入AL寄存器中该指令执行后可在AL中得到转换后的代码。演示指令XALT把

F0000+0040+0F=F004FH单元的内容送AL寄存器执行后

AL=2CH例3.9:

BX=0040H,AL=0FH,DS=F000H,所建表格如下图:2C存储器F0040HF004FH(BX)→(AL)=0FH···例3.10内存数据段有一16进制数的ASCII码表,首地址为HEX-TABLE,如图所示,欲查出第10个元素(元素序号从0开始),即‘A’的ASCII码。指令序列为:mov

bx,0ffsethex-table;(bx)←表首址moval,0ah;(al)←序号(位移量)xalthex-table;查表转换执行后,

al=41h

(‘A’的ASCII码)‘’指令:

XLATHex_table执行结果把‘A’的ASCII码送入在AL中,即AL=41H存储器30H(‘0’)31H(‘1’)39H(‘9’)41H(‘A’)46H(‘F’)Hex-tableHex-table+10Hex-table+9Hex-table+1Hex-table+15图16进制数的ASCII码表··················IN(Input)输入指令直接寻址方式格式: INAL,PORT;(字节)

INAX,PORT;(字)操作:AL←[PORT] ;(字节)AX←[PORT+1,PORT] ;(字)PORT是I/O端口地址(0~255)间接寻址方式格式: INAL,DX;(字节)

INAX,DX;(字)操作: AL←[DX] ;(字节) AX←[DX+1,DX] ;(字) DX内容是I/O端口地址(0~65535)OUT(Output)输出指令直接寻址方式格式: OUTPORT,AL;(字节) OUTPORT,AX;(字)操作: [PORT]←AL

;(字节)

[PORT+1,PORT]←AX

;(字)PORT是I/O端口地址(0~255)间接寻址方式格式:OUTDX,AL;(字节)

OUTDX,AX;(字)操作:字节 [DX]←AL字 [DX+1,DX]←AXDX内容是I/O端口地址(0~65535)IN和OUT(输入输出)指令专用于CPU与外设(I/O端口)之间传送信息。数据必须经由累加器(AX或AL)传送。直接寻址方式的指令只能寻址256个I/O端口(端口号:0~255或0~FFH)。间接接寻址方式的指令可以寻址64K个I/O端口(端口号:0~65535或0~FFFFH)。IN和OUT指令提供了字与字节两种使用方式,选用哪一种,取决于外设端口的宽度。例3.11

inax,28h

mov

data_word,ax(把端口28h的内容经ax传送到存储单元data_word)

例3.12

mov

dx,3fch

inax,dx(从端口03fch取一个字送到ax寄存器)

例3.13

out5,al

(从al寄存器输出一个字节到端口5)目的地址传送指令LEA(Loadeffectiveaddress)取有效地址指令格式: LEAreg16,mem操作: 把源操作数的EA,传送到目标寄存器reg16

中源操作数mem必须是内存操作数reg16必须是一个16位的通用寄存器例3.14

LEABX,BUFFER MOVBX,BUFFER

前者是把BUFFER的有效地址‘EA’传送给BX,后者把存储单元BUFFEER的内容传送给BX。例3.15

LEABX,MAX[BX][SI]若执行前:

BX=0400H,SI=003CH,MAX=0F62H则

EA=0400+003C+0F62=139EH指令执行后:

BX=139EHLES

(LoadESwithpointer)指针送ES指令格式: LESreg16,mem32操作: reg16←[mem32] ES)←[mem32+2]LDS(LoadDSwithpointer)指针送DS指令格式: LDSreg16,mem32操作: reg16←[mem32] DS←[mem32+2]源操作数mem32是32位的内存操作数。目的操作数reg16是16位的通用寄存器。指令将源操作数指定的存储器中的连续4字节传送给指定的reg16和DS,低2位字节给reg16,高2位字节给DS。LEA、LDS、LES三条指令不影响标志位。例3.17: LESDI,[BX]执行前

DS=B000H,BX=O80AH,[B080AH]=05AEH,[B080CH]=4000H执行后

DI=05AEH,ES=4000H例3.16

LDSSI,[10H]执行前

DS=C000H,SI=0010H,[C0010H]=0180H,[C0012H]=2000H执行后

SI=0180H,DS=2000H。标志传送指令LAHF(LoadAHwithflags)标志送AH指令格式:LAHF操作:AH←FLAG的低字节位只传送了SF、ZF、AF、PF、CF五个标志位SAHF(StoreAHintoflags)AH送标志寄存器格式:SAHF操作:FLAG的低字节←AH

PUSHF(Pushtheflags)标志进栈指令格式:PUSHF操作:SP←SP-2[SP+1,SP]←FLAGS格式:

POPF操作:

FLAG←[SP+1,SP] SP←SP+2POPF(Poptheflags)标志出栈指令LAHF和PUSHF不影响标志位SAHF和POPF由装入的值来确定标志位3.2.2算术指令加法指令ADD(add)加法格式:ADDdst,src操作:dst

←src+dstADC(addwithcarry)带进位加法格式:ADCdst,src操作:dst←src+dst+CFINC(increment)加1格式:INCdst操作:dst

←dst+1dst为寄存器或存储器操作数。src是寄存器、存储器操作数或立即数src和dst不能同为存储器操作数不允许段寄存器参与运算。允许字节操作或字操作。上述指令对条件标志位产生影响,但INC指令对CF位无影响。例如:

addcl,10

adc

dx,si addax,mem

adc

alpha[di],30h incsi以上指令皆合法。例3.18:

moval,7eh

mov

bl,5bh addal,bl执行后, al=7eh+5bh=d9h各状态标志位为:SF=1,ZF=0,AF=1 PF=0,CF=0,OF=1例3.19:要求计算两个多字节的16进制数之和: 3B74AC60F8H+20D59E36C1H=?式中被加数和加数均有五个字节,假设它们已分别存入从DATA1和DATA2开始的两个内存区,且均为低位字节在前,高位字节在后,如图3.8所示。要求相加所得结果仍存回以DATA1为首址的内存区。本例可用循环程序来实现。运算程序流程图见图3.8。mov

cx,0;设置循环次数mov

si,0;置位移量初值clc

;清进位(CF=0)looper:inccxmoval,data2[si];取一个加数adcdata1[si],al;和另一个加数相加incsi;位移量加1cmp

cx,5;循环次数减1jnz

looper ;未完,转loper处继续hlt

;程序暂停

减法指令SUB(subtract)减法格式:SUBdst,src操作:dst

←dst-srcSBB(subtractwithborrow)带借位减法格式:SBBdst,src操作:dst←dst-src-CF其中,CF为借位标志位的值例3.22

SUB[SI+14H],0136H指令执行前DS=3000H,SI=0040H,30054H=4336H指令执行后

4336H0100001100110110

-0136H

-0000000100110110

4200H

0100001000000000

0100001100110110或补码相减

+1111111011001010

1←0100001000000000

所以[30054H]=4200H,SF=0,ZF=0,CF=0,OF=0

例3.23

SUBDH,[BP+4]指令执行前DH=41H,SS=0000H,BP=00E4H,[000E8H]=5AH指令执行后

41H0100000101000001-5AH

-01011010

+10100110

E7H1→1110011111100111

所以

DH=0E7H,SF=1,ZF=0,CF=1,OF=0DEC(Decrement)减1格式:DECdst操作:dst

←dst

-1CMP(Compare)比较格式:CMPdst,src操作:dst-srcCMP不保存运算结果,但影响条件标志位。大小关系两个无符号数比较若CF=0,则被减数大,若CF=1,则被减数小。两个有符号数比较1.若两个数符号相同,可用SF来判断若SF=0,表示被减数大,SF=1则反之。2.若两个数符号不同OF⊕SF=0时,被减数大.OF⊕SF=1时,减数大.若两个所比较的数相等,则ZF=1,否则ZF=0

NEG(Negate)求补格式:NEGdst操作:dst←0-dst例如若原来

AL=0FFH(-1的补码)执行指令 NEGAL后

AL=01(-1的绝对值)dst,

src的意义与加法指令意义相同;可进行字节(8位)或字(16位)运算;以上指令对状态标志位有影响,但DEC指令对CF位无影响例如:SUBAL,37HSBBCX,DXSUBARRAY[DI],AXSBB[SI+6],97DECBLDECWORDPTR[BP][DI]NEGAXNEGBYTEPTR[BX]CMPAL,0AHCMP[BXF5],SI皆为合法指令例3.20内存数据存放了100个带符号数,首地址为AREA1,要求将各数取绝对值后存入以AREA2为首址的内存区。由于100个带符号数中可能既有正数,又有负数,因此先要判断正负。如为正数,可以原封不动的传送到另一内存区;如为负数,则须先求补即可得到负数的绝对值,然后再传送。程序如下: LEASI,AREA1 ;SI←原地址指针

LEADI,AREA2 ;DI←目的地址指针 MOVCX,100 ;CX←循环次数CHECK: MOVAL,[SI] ;取一个带符号数到AL CMPAL,0 ;AL内容不变,但影响标志

JNSNEXT

;若SF=0,则转NEXT NEGAL ;否则求补NEXT: MOV[DI],AL ;传送到目的地址 INCSI ;源地址加1

INCDI ;目的地址加1 DECCX ;循环次数减1

JNZCHECK

;如不等于零,则转CHECK HLT ;停止例3.21在数据段从DATA开始的存储单元中分别存放了两个8位无符号数。比较他们的大小,并将大者传送到MAX单元。编程如下:LEABX,DATA;DATA偏移地址送BXMOVAL,[BX];第一个无符号数送ALINCBX;BX指向第二个无符号数CMPAL,[BX];两数比较JNCDONE

;如CF=0,则转到DONEMOVAL,[BX];否则,第二个无符号数送ALDONE:

MOVMAX,AL ;较大的无符号送MAX单元HLT;停止

IMUL(SignedMultiple)带符号数乘法格式:IMULsrc操作:与MUL相同,但操作数是带符号数乘法指令MUL(UnsignedMultiple)无符号数乘法格式:MULsrc操作:字节运算AX←AL×src

字运算

DX,AX←AX×src

乘法指令是单操作数指令,隐含的目的操作数必须是累加器src为寄存器或存储器操作数,不能是立即数可进行字节或字运算。字节运算时,结果为16位,字运算时,结果为32位。本指令对CF和OF位有影响,对其他条件标志位为无定义对于MUL指令,如果乘积的高半部分(字节运算的AH,字运算时的DX)为0,则CF=OF=0,否则,CF=OF=1对于IMUL指令,如果乘积的高半部分仅仅是乘积低半部分的符号扩展,则CF=OF=0,否则,CF=OF=1。符号扩展就是将乘积的低半部分中的最高位之值送入乘积的高半部分的每一位。例如,字节运算,若:AL<80H,经符号扩展后

AH=0若:AL≥80H,符号扩展后

AH=FFH字运算,若:AX<8000H

,符号扩展后,

DX=0若:AX≥8000H

,符号扩展后,

DX=FFFFH。除法指令8086CPU执行除法时规定:当被除数为字时,除数应为字节;当被除数为双字位时,除数应为字。DIV(Unsigneddivide)除法格式:DIVsrc操作:字节运算

AL←AX/src

的商

AH←AX/src

的余数

字运算

AX←DX,AX/src

的商

DX←DX,AX/src

的余数操作数被认为是无符号数,商和余数皆为无符号数。IDIV(Signeddivide)带符号数除法格式:IDIVsrc操作:与DIV相同,但操作数被认为是带符号数,商和余数也是带符号数src的类型与乘法指令中的一样;除法指令对条件标志为无定义(值不确定);若除数为0,或执行除法时,商超出范围,CPU自动产生类型号为0的内部中断,作中断处理。CWD

字扩展指令格式:CWD操作:若AX<8000H,则DX←0000H,

否则DX←FFFFH符号扩展指令CBW字节扩展指令格式:CBW操作:若AL<80H,则AH←

00H,

否则AH←FFH例如:moval,64h ;AL=64H(机器数), ;表示10进制数100(真值)cbw

;将符号0扩展,AX=0064H, ;仍然表示100movax,0ff00h

;AX=FF00H, ;表示有符号10进制数-256cwd

;将符号位“1”扩展, ;DX.AX=FFFFFF00H

;仍然表示-256BCD码(BinaryCodedDecimal)BCD码是一种用二进制编码表示的十进制数,又称二-十进制数它用4位二进制码表示1位十进制数码,这4位二进制数的权为8421,所以又称8421码。十进制调整指令

表3.2BCD码

十进制

数码

0

1

2

3

4

5

6

7

8

9

BCD码

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

非压缩的BCD码(unpackedBCDformat)以8位二进制数为一组表示1位十进制数;8位中的低4位表示8421的BCD码,而高4位则无意义。压缩的BCD码(packedBCDformat)用4位二进制数表示1位十进制数位,整个十进制数形式为一个顺序的以4位为一组的数串。例如:9502d的压缩的BCD码形式为:

1001010100000010

非压缩的BCD码形式为:uuuu1001uuuu0101uuuu0000uuuu0010数字的ASCⅡ码就是一种非压缩的BCD码形式例如:9d的ASCⅡ码为:39H=00111001其低4位是8421BCD码(9),高4位无意义。真值(十进制) 8 64二进制编码 08H 40H压缩BCD码 08H 64H非压缩BCD码 08H 0604HASCII码 38H 3634H编码的比较调整的意义算术运算指令都是二进制运算指令,若作BCD码的运算,会出现错误,必须进行调整才能得到正确的BCD码运算结果。在进行十进制数算术运算时应分两步进行:①先按二进制数运算规则运算,得到中间结果;②再用十进制调整指令对中间结果进行修正,得到正确的结果。例如 34+23=57

00110100

34的BCD码

+ 0010001123的BCD码

01010111

57的BCD码

结果正确,不作调整。例如:7+6=13

00000111;7的BCD码

+ 00000110;6的BCD码

00001101;结果错(和>9,AF=0)

+ 00000110

;加6调整

00010011 ;13的BCD码,正确

两个4位二进制数之和>9,应作加6调整例如:48+29=77

01001000 ;48的BCD码+ 00101001

;29的BCD码

01110001

;错误(有进位,AF=1)+ 00000110

;加6调整

01110111

;77的BCD码,正确

两个4位二进制数之和<9,但有

AF=1,应作加6调整。例如57+46=103

01010111

+01000110

10011101

;中间结果,低4位>9

+00000110

;加6调整

10100011

;中间结果,高4位>9

+01100000

;加60H调整

CF←1

00000011;正确结果CF=1加法运算后,低4位>9时,调整指令需作加06H调整;高4位>9时,调整指令需作加60H调整。

例如:72+91=163

01110010

+10010001

CF←1

00000011 ;中间结果,CF=1

+01100000 ;加60H调整

01100011 ;正确结果加法运算后,当CF=1(有进位产生)时,调整指令应作加60H处理。DAA(decimaladjustforaddition)加法的十进制调整格式:DAA操作:将AL中的和调整成压缩的BCD格式。压缩的BCD码调整指令调整方法:若AL的低4位>9或AF=1,则AL←AL+06H,AF←1若AL的高4位>9或CF=1,则AL←AL+60H,CF←1DAA指令之前必须先执行ADD或ADC指令加数和被加数都必须是2位的压缩BCD数和要存入AL寄存器。

DAA指令对OF无定义,但影响其他标志位。例3.27

ADDAL,BL

DAA执行前, AL=28H,BL=68H执行ADD后,AL=90H,AF=1,CF=0和不是正确的BCD码形式。执行DAA指令,因为AF=1,CF=0

而作调整:

AL←AL+06H

得到 AL=96H,CF=0,AF=1DAS(decimaladjustforsubtraction)减法的十进制调整指令格式:DAS操作:把AL中的差调整成压缩的BCD码格式调整方法:若AL的低4位>9或AF=1,则AL←AL-06H,AF←1若AL的高4位>9或CF=1,则AL←AL-60H,CF←1DAS指令仅对AL内容作调整,不改变AH的内容。在DAS指令之前必须先执行SUB或SBB指令减数和被减数都必须是2位的压缩BCD数DAS指令对OF位无影响,对其他条件标志位产生影响。AAA(ASCIIadjustforaddition)加法的ASCII调整指令格式:AAA操作:将AL中的和调整到非压缩的BCD码格式,AH←AH+调整产生的进位值非压缩的BCD码调整指令调整方法:若AL

∧0FH>09H

或AF=1,则AL←AL+06H,AH←AH+1,AF←1,CF←1,AL←AL∧0FH否则AL←AL∧0FH,CF←0,AF←0AAA指令之前必须先执行ADD或ADC指令加数和被加数都必须是1位压缩BCD数和要存入AL寄存器。AAA指令影响AF和CF标志,对其他标志无定义例3.30

ADDAL,BL AAA如指令执行前,AX=0535H(5的ASCII码)BL=39H(9的ASCII码)ADD指令执行完后AL=6EH,BL=39H,AH=05H,AF=CF=0执行AAA,因AL∧0FH=0EH>9H作调整:AL←AL+06H,得

AL=74HAH←AH+1,得AH=06HAF←1,CF←1AL←AL∧0FH,得AL=04H最终结果为AH=06H,AL=04H,即AX=0604H,CF=AF=1AAS(ASCIIadjustforsubtraction)减法的ASCII码调整指令格式:AAS操作:把AL中的差调整到非压缩的BCD码格式,AH←AH-调整产生的借位值。调整方法:若AL∧0FH>9

或AF=1,则AL←AL-6,AH←AH-1AF←1,CF←1,AL←AL∧0FH否则AL←AL∧0FHAAS指令的使用要求和对标志位的影响与AAA指令类似。AAM(ASCIIadjustformultiplication)乘法的ASCII调整指令格式:AAM操作:对AL中的乘积进行调整,方法为:AH←AL/0AH的商;AL←AL/0AH的余数AAM指令之前必须执行MUL指令;乘数与被乘数是高4位为0的1位非压缩型BCD码对SF,ZF和PF位有影响,对AF,CF和OF位无定义AAD(ASCIIadjustfordivision)除法的ASCII调整指令格式:AAD操作:AL←AH×0AH+AL; AH←0AAD指令是用在DIV指令之前,对AX中的被除数进行调整;被除数是存放在AX中的2位非压缩BCD数,除数是1位非压缩BCD数,每个BCD数的高4位全为0;指令据AL的结果设置SF、ZF、PF位,对OF、CF和AF无定义。

3.2.3逻辑运算和移位指令共有五条:AND(and)逻辑与OR(or)逻辑或XOR(exclusive)异或NOT(not)逻辑非TEST(test)测试逻辑运算指令NOT逻辑非指令格式:NOTdst操作:dst

←dstAND

逻辑与指令格式:ANDdst,src操作:dst

dst∧srcOR

逻辑或指令格式:ORdst,src操作:dst

←dstVsrcTEST测试指令格式:

TESTdst,src操作:

dst

src

结果影响状态标志位XOR异或指令格式:

XORdst,src操作:

dst

←dst

src以上指令可进行字节或字操作dst与src的意义与算术运算指令的类似除NOT指令外,其余四条指令都对条件标志位产生影响为:CF=OF=0AF位无定义SF、ZF、PF据运算结果而定。例3.35判断一个从端口地址为PORT的外设输入的数据,若数据的第1、3、5位中的任一位不为零,则转移到NEXT。程序段为:

IN AL,PORT

TEST AL,00101010B JNZ NEXT . . .

NEXT:SHL/SAL逻辑左移/算术左移(shiftlogicalleft/shiftarithmeticleft)格式: SHL/SALdst,1/CL

操作:将dst顺序向左移1位或移CL寄存器中指定的位数,低位补00LHdstCF移位和循环指令演示SHR逻辑右移指令格式:SHRdst,1/CL0CFLHdstSAR算术右移指令格式:SARdst,1/CLLHCFdst演示演示ROL循环左移指令格式:ROLdst,1/CLROR循环右移指令格式:RORdst,1/CL

LHLHdstCFLHCFdst演示演示RCR带进位循环右移指令格式:RCRdst,1/CLLHLHdstCFLHCFdstRCL带进位循环左移指令格式:RCLdst,1/CL演示演示移位和循环指令可进行字节和字操作dst可以是reg和mem操作数移位次数可以是1或由CL中内容来确定指令对条件标志位的影响移位指令:影响除AF位以外的其他标志位循环指令:只影响CF和OF位对OF位的影响仅当移为次数为1时才有意义,该位设置规则为:指令执行前后,最高位相同时OF=0,否则OF=1例如:以下均为移位指令的合法形式SHLBL,1SHRWORD

PTR

BLOCK,CLSARDI,CLROLBYTE

PTR[DI],1RORBH,CLRCLAL,CLRCRWORD

PTR

TABLE[BX],1例如;将DX.AX中32位数值左移一位

shl ax,1

rcl

dx,1DXAXCF0例3.38要求测试AL寄存器中的第5位的状态是“0”还是“1”,则可利用以下指令实现:MOVCL,5

;CL←移位次数RORAL,CL ;CF←AL的第5位JNCZERO ;若CF=0,转ZERO

:

ZERO:

:3.2.4串操作指令有5条指令MOVS(Movestring)串传送CMPS(Comparestring)串比较SCAS(Scanstring)串扫描LODS(Loadfromstring)从串取STOS(Storeintostring)存入串MOVS串传送格式:[REP]MOVS

dst-string,src-string

[REP]MOVSB

[REP]MOVSW操作:[ES:DI]←[DS:SI] SI←SI+1,DI←DI+1(字节操作)

SI←SI+

2,DI←DI+

2(字操作)当方向标志DF=0时用“+”,DF=1时用“-”。目的串在附加段,段基值在ES中;源串通常在数据段,段基值由DS提供。源串可以段超越,目的串则不允许;在第一种格式中,应表明操作数是字还是字节,指令中的dst和src只提供给汇编检查之用,并不允许用其他寻址方式来确定操作数。第二、三种格式则明确指定是字节或字操作,不用写操作数。传送指令不影响状态标志位。方括号项[REP]是可选项,REP为重复性前缀。重复性前缀REP的使用格式:REP

stringprimitive其中stringprimitive

代表串指令(MOVS,STOS)操作:①如CX=0则退出REP,否则执行指令②CX←CX-1③执行其后串指令④重复①~③例3.39将数据段中首地址为BUFFER1的200个字节传送到附加段首地址位BUFFER2的内存区中。用MOV指令编程如下:对DS,ES初始化LEASI,BUFFER1 ;SI←源串首地址指针LEADI,BUFFER2 ;DI←目的串首地址指针MOVCX,200 ;CX←字节串长度AGA:

;标号,即为转移的目的地址MOVAL,[SI]

;AL←从源串取1个字节MOVES:[DI],AL

;目的串←ALINCSI

;源串地址指针+1INCDI

;目的串地址指针+1DECCX

;循环次数-1JNZ

AGA

;未完,转移到AGA处继续…用MOVSB指令编程如下:…LEASI,BUFFER1 ;(SI)←源串首地址指针LEADI,BUFFER2 ;(DI)←目的串首地址指针MOVCX,200 ;(CX)←字节串长度CLD

;使DF=0,则地址自动增量AGA:

MOVSB

;传送1个字节,并地址自动+1DECCX

;计数-1JNZ

AGA

;未传送完继续…用REPMOVSB格式编程如下:…对DS,ES初始化LEASI,BUFFER1 ;SI←源串首地址LEADI,BUFFER2 ;DI←目的串首地址MOVCX,200 ;CX←字节串长度CLD

;使DF=0,则地址自动增量REPMOVSB

;传送200个字节…LODS从串取指令格式:

LODSsrc_string LODSB/LODSW操作字节操作: AL←[DS:SI],SI←SI+

1字操作:

AX←[DS:SI],SI←SI+

2LODS指令不影响状态标志位,而且一般不带重复前缀。例3.40内存中以BUFFER为首址的缓冲区内有10个非压缩型BCD码形式的十进制数,将这些十进制数顺序显示在屏幕上。编程如下:LEASI,BUFFER;(SI)←缓冲区首址MOVCX,10;(CX)←字符串长度CLD

;

DF=0MOVAH,02H ;(AH)←功能号GET:

LODSB

;取一个BCD码到AL

ORAL,30H;BCD码转换为ASCII码MOV DL,AL ;(DL)←字符INT 21H ;显示DEC CX ;(CX)←(CX)-1JNZ GET

;未完成10个字符则继续…STOS存入串指令格式:

[REP]STOS[ES:]dst_string

[REP]STOSB/ [REP]STOSW操作字节操作:

[ES:DI]←AL,DI←DI+1字操作:

[ES:DI]←AX,DI←DI+2STOS指令对状态标志无影响,指令通常与REP配合使用。例3.41数据块BLOCK1由英文字母、数字和各种其它符号组成,其结束符是回车符CR(ASCII码为0DH)。将该数据块传送到以BLOCK2为首址的内存区,并将其中所有的英文小写字母(a~z)转换成相应的大写字母(A~Z),其余不变。英文大、小写字母的ASCII码为:

‘a’=61H

‘A’=41H

‘b’=62H

‘B’=42H

‘z’=7AH

‘Z’=5AH即大、小写字母的ASCII码相差20H编程如下:LEA SI,BLOCK

;(SI)←源地址指针LEA DI,BLOCK2

;(DI)←目的地址指针CLD

;DF=0NEXT:LODSB

;取1个字符到ALCMP AL,0DH

;是否回车符JZ DONE

;是,转DONE

CMP AL,61H

;是否小于‘a’JC OK

;是,则转OKCMPAL,7AH ;是否大于‘z’JNCOK

;是,则转OKSUBAL,20H ;否则,A减20HOK:

STOSB

;送入存储器JMPNEXT

;转移到NEXTDONE:

HLT ;停止CMPS串比较指令格式:[REPE/REPNE]CMPSsrc_string,dst_string[REPE/REPNE]CMPSB(字节)[REPE/REPNE]CMPSW(字)操作:[DS:SI]-[ES:DI] SI←SI+1,DI←DI+1(字节操作) SI←SI+2,DI←DI+2(字操作)运算结果影响状态标志位REPE

(当相等/为零

温馨提示

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

评论

0/150

提交评论