《微机原理与应用》第3章寻址方式与指令系统构(09年).ppt_第1页
《微机原理与应用》第3章寻址方式与指令系统构(09年).ppt_第2页
《微机原理与应用》第3章寻址方式与指令系统构(09年).ppt_第3页
《微机原理与应用》第3章寻址方式与指令系统构(09年).ppt_第4页
《微机原理与应用》第3章寻址方式与指令系统构(09年).ppt_第5页
已阅读5页,还剩205页未读 继续免费阅读

下载本文档

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

文档简介

微机原理与接口技术 主讲 易凡 武汉大学物理学院电子科学与技术系,第三章 寻址方式和指令系统,基本概念,指令系统 微处理器能执行的各种指令的集合。 寻址方式(Addressing Mode) 指令中关于如何求出存放操作数有效地址的方法。 有效地址EA(Effective Address) 根据寻址方式计算得到的地址。,3.1 指令码的格式:,指令码是一字节或多字节的二进制编码,CPU可以直接执行 多字节编码分成操作码和操作数两个字段部分 操作码指示该指令执行的操作 操作数字段指示操作数的类型和操作数的寻址方式,操作码字段,操作数字段,操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 操作数是指令执行的参与者,即各种操作的对象 有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数,3.1 指令码的格式:,3.2 8086/8088系统的寻址方式,8086/8088指令系统操作数的种类分为两大类:,3.1.1 操作数的种类,数据操作数 转移地址操作数,3.1.1 操作数的种类(续),数据操作数 具体数值,也称立即数 (im):操作数据在指令中。 寄存器(reg):操作数存放在寄存器中。 存储器(mem):操作数存放在指定的存储单元中。 I/O端口:操作数来自或送到I/O端口。,转移地址操作数 指令操作的对象不是数据,而是要转移的目标地址。 要转移的目标地址可以直接在指令中给出,也可由指定的寄存器或内存单元给出。,3.2.2寻址方式(Addressing Mode),操作数直接包含在指令中,紧跟在操作码之后,作为指令的一部分,这种操作数称为立即数(im) 立即数可以是8位(00HFFH),也可以是16位(0000HFFFFH) 立即数寻址方式只能作为源操作数,主要用于给寄存器或存储单元赋值。,立即数寻址方式(Immediate addressing ),立即数寻址方式(续),例3.1 MOV BL ,80H MOV AX ,0102H 指令执行后的结果为: BL = 80H ;AX = 0102H,演示,操作数存放在指令指定的寄存器(reg)中 指定的寄存器(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 用寄存器名表示其内容(操作数),寄存器寻址方式( Register addressing),例3.2 MOV CL , DL MOV AX , BX 如果 DL = 50H, BX = 1234H, 则执行结果为: CL = 50H , AX = 1234H,演示,寄存器寻址方式(续),存储器寻址方式,操作数在主存储器中,用主存地址表示 程序设计时,8088采用逻辑地址表示主存地址 段地址在默认的或用段超越前缀指定的段寄存器中 指令中只需给出操作数的偏移地址(有效地址EA) 存储器寻址方式又分为 直接寻址方式 寄存器间接寻址方式 寄存器相对寻址方式 基址变址寻址方式 相对基址变址寻址方式,直接寻址方式(Direct addressing),操作数的有效地址(EA)直接在指令中给出,用中括号包含有效地址,表达存储单元的内容 直接寻址方式的操作数默认在存储器的数据段,即默认的段寄存器是DS 允许使用段超越前缀改变段寄存器。在操作数的前面写上段寄存器名,再加上冒号“:”。,例 3.3 MOV AX, 2000H EA2000H 如果 DS=1492H,则操作数存储单元的物理地址为: 14920H2000H=16920H 若 16920=9078H 执行结果为:AX= 9078H,演示,段超越前缀的写法 MOV AX, ES: 2000H ;AXES:2000H,直接寻址方式(续),直接寻址方式(续),例如: MOV AL , VALUE 或 MOV AL , VALUE,在用汇编语言编程时,常用符号地址代替数值地址。,VALUE也称为为存放操作数单元的符号地址,寄存器间接寻址方式 (Register indirect addressing ),有效地址在指令中指定的寄存器SI、 DI、BX 或BP中,操作数本身在存储器中。 若指定的寄存器为:SI、 DI、BX,默认的段寄存器是DS 若指定的寄存器是BP,默认的段寄存器是SS 书写指令时,用作间址的寄存器必须加上方括弧 ,以免与寄存器寻址方式混淆 允许使用段超越前缀改变段寄存器,例3.4: MOV AX, SI 如果 DS=3000H ,SI = 2000H 物理地址=30000H+2000H=32000H 若 32000H=4050H 执行结果为: AX =4050H,寄存器间接寻址方式(续),又: MOV BP , AL 如果 SS=5000H , BP=1000H 物理地址=50000H+1000H=51000H 执行结果为: 51000H=50H,演示,段超越前缀的情况 MOV AX, ES:BX ;AXES:BX,段超越之例: MOV ES:DI,AX MOV DX,DS:BP ADD AL,ES:BX SUB CS:SI,AX,寄存器间接寻址方式(续),寄存器相对寻址方式 (Register relative addressing),有效地址EA是由指令中指定的8位或16位位移量disp (displacement)与基址或变址寄存器的内容之和,即,若指令中指定的寄存器是SI, DI, BX,则存放操作数的段寄存器默认为DS 若指令中指定BP寄存器,则默认的段寄存器应SS 允许段超越前缀改变默认段寄存器 位移量常用符号表示,寄存器相对寻址方式(续),例3.5:如果 DS=3000H , BX=1000H COUNT=1050H 对于指令: MOV CX,BX+COUNT 物理地址=30000H+1000H+1050H=32050H 若 32050H=4030H 执行后: CX=4030H,寄存器相对寻址方式(续),以下三种指令的形式皆允许,它们完全等价: MOV AL,BP+TABLE MOV AL,BP+TABLE MOV AL,TABLEBP,演示,MOV AX, SI+06H ;AXDS:SI+06H,MOV AX, 06HSI ;AXDS:SI+06H,寄存器相对寻址方式(续),基址变址寻址方式 (Based indexed addressing),有效地址是由指令指定的一个基址寄存器BX或BP和一个变址寄存器SI或DI的内容之和。 即:,若基址寄存器为BX, 默认的段寄存器为DS 若基址寄存器为BP, 默认的段寄存器为SS 允许段跨越,演示,MOV AX, BX+SI ;AXDS:BX+SI,MOV AX, BXSI ;AXDS: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 。,基址变址寻址方式(续),又指令: MOV AH , BPSI 如果 BP=2000H, SI=1200H , SS=4000H 物理地址=40000H+2000H+1200H=43200H 若 43200H=56H,则执行结果为: AH=56H,基址变址相对寻址方式 ( Relative indexed addressing ),有效地址是指令中指定的8位或16位位移量(disp)与一个基址寄存器和一个变址寄存器的内容之和。即:,当基址寄存器为BX时, 默认为DS段寄存器 当基址寄存器为BP时,默认为SS段寄存器。 允许段超越。,演示,MOV AX, BX+DI+6 ;AXDS:BX+DI+6,MOV AX, 6BX+DI,MOV AX, 6BXDI,基址变址相对寻址方式(续),MOV AX , BX+SI+COUNT MOV AX , COUNTBXSI MOV AX , BX+COUNTSI MOV AX , BXCOUNTSI MOV AX , BX+SICOUNT MOV AX , COUNTSIBX,基址加变址相对寻址方式的不同的书写形式:,基址变址相对寻址方式(续),例3.7 MOV AX , MASKBXSI 如果 DS=3000H , BX=2000H , SI=1000H , MASK=0520H 物理地址=30000H+2000H+1000H+0520H=33520H 若 33520=1234H 执行结果为 AX=1234H,基址变址相对寻址方式(续),3.3 8086的汇编指令系统,数据传送指令 位操作指令 程序控制指令,8086的指令系统包括100多条指令, 可分为以下六种类型:,算术运算指令 串操作指令 处理器控制指令,数据传送指令MOV(Move) 格式: MOV DST , SRC 操作: dst src dst表示目的操作数,src表示源操作数。 MOV 指令允许字节(8位)操作或字(16位)操作,3.2.1 数据传送指令,演示,例: MOV AX , 05H ; 字操作 MOV BL , A ; 字节操作,dst , src的具体形式为:,表中: reg为寄存器操作数, mem代表存储器操作数, im代表立即数,MOV指令操作数的形式,MOV指令操作数的形式(续),不允许dst与src同时皆为内存操作数mem 目的操作数dst不允许是立即数im 、段寄存器CS和IP 不允许将立即数直接传送给段寄存器 MOV指令不影响标志位。,例:合法指令 MOV BX , AX MOV AX , DATA_SEG MOV DS , AX MOV AX , COUNTBXSI MOV AL , E MOV SI , DS MOV AX , DS ;AXDS MOV ES , AX ;ESAXDS,对段寄存器的操作不灵活,MOV指令(续),MOV指令立即数传送,mov cl , 4 ;cl4,字节传送 mov dx , 0ffh ;dx00ffh,字传送 mov si , 200h ;si0200h,字传送 mov bvar , 0ah ;字节传送 ;假设bvar是一个字节变量,定义如下:bvar db 0 mov wvar , 0bh ;字传送 ;假设wvar是一个字变量,定义如下:wvar dw 0,明确指令是字节操作还是字操作,以字母开头的常数要有前导“0”,MOV指令寄存器传送,mov ah , al ;ahal,字节传送 mov bvar , ch ;bvarch ,字节传送 mov ax , bx ;axbx,字传送 mov ds , ax ;dsax,字传送 mov bx , al ;bxal,字节传送,寄存器具有明确的字节和字类型,MOV指令存储器传送,mov al , bx ;alds:bx mov dx , bp ;dxss:bp+0 mov dx , bp+4 ;dxss:bp+4 mov es , si ;esds:si,不存在存储器向存储器的传送指令,MOV指令段寄存器传送,mov si , ds ; ds:si ds mov ax , ds ;axds mov es , ax ;esaxds,对段寄存器的操作不灵活,MOV指令的非法形式,两个操作数的类型不一致 无法确定是字节量还是字量操作 两个操作数都是存储器 段寄存器的操作有一些限制,非法指令两个操作数类型不一致,非法指令:mov al,050ah 修正: mov ax,050ah 非法指令:mov si,dl 修正: mov dh,0 mov si,dx,在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令,非法指令无法确定是字节量还是字量操作,非法指令:mov bx+si , 255 修正: mov byte ptr bx+si , 255 ;byte ptr 说明是字节操作 ;mov word ptr bx+si , 255 ;word ptr 说明是字操作,当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明,非法指令两个操作数都是存储器,非法指令: mov buf2, buf1 修正:假设buf2和buf1是两个字变量; mov ax , buf1 mov buf2 , ax 假设buf2和buf1是两个字节变量 mov al , buf1 mov buf2 , al,8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数),非法指令段寄存器的操作有一些限制,非法指令:mov ds , es 修正: mov ax , es mov ds , ax 非法指令:mov ds , 100h 修正: mov ax , 100h mov ds , ax 非法指令:mov cs, si,8088指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活,进栈指令PUSH(Push onto the stack),格式: PUSH src 操作: SP SP 2 SS:SP 1, SP src,指令说明 PUSH指令只允许是字(16位)操作 src可以是reg16 、 mem, 但不能是im,例:合法指令 PUSH AX PUSH DS PUSH BX,例:非法指令 PUSH AL ;不允许字节操作 PUSH 0FFA2H ; src不允许是im,演示,进栈指令PUSH(Push onto the stack),出栈指令POP(Pop from stack),格式: POP dst 操作: dst SP 1 , SP SP SP 2 指令说明 POP指令只能字(16位)操作 dst可以是mem,reg16,但不能是CS、IP、im,PUSH,POP指令不影响标志位,例:合法指令 pop ax pop wvar,例:非法指令 pop al ; al为reg8 pop bvar ; bvar 为8位内存操作数 pop ds ; dst为段寄存器,演示,出栈指令POP(Pop from stack),数据交换指令XCHG(Exchange),格式: XCHG OPR1 , OPR2 操作: OPR1 OPR2 指令说明 允许字或字节操作 OPR1、OPR2是两个操作数。它们可以是reg或mem,但二者中必有一个是寄存器 不允许使用段寄存器和IP 不影响标志位,演示,XCHG指令(举例),例3.8 XCHG BX , BP+SI 如指令执行前: BX =6F30H, BP =0200H, SI =0046H, SS =2F00H, 2F246H=4154H。 OPR2的物理地址=2F000H+0200H+0046H=2F246H 则指令执行后: BX =4154H , 2F246H=6F30H,换码指令XLAT(Translate),格式: XLAT src_table 或 XLAT 操作: AL BX+AL,指令说明 src_table是表格首地址 (符号地址) 转换前,预先要构造一个字节表格,表格的内容是所要换取的代码 表格的首地址提前存入BX寄存器 需要转换的代码应该是相对表格首地址的位移量, 要提前存入AL寄存器中 该指令执行后可在AL中得到转换后的代码。,演示,指令XALT把 F0000+0040+0F=F004FH 单元的内容送AL寄存器 执行XALT后 AL=2CH,例3.9: BX=0040H, AL=0FH, DS=F000H, 所建表格如下图:,2C,存储器,F0040H,F004FH,(BX) ,(AL)=0FH, ,XLAT指令(举例),00,例3.10 内存数据段有一16进制数的ASCII码表,首地址为hex_table,如图所示,欲查出第10个元素(元素序号从0开始),即A的ASCII码。指令序列为: mov bx , 0ffset hex_table ; (bx) 表首址 mov al , 0ah ; (al) 序号(位移量) xalt hex_table ; 查表转换 执行后, al=41h (A的ASCII码),XLAT指令(举例),指令: XLAT Hex_table 执行结果把A的ASCII码送入在AL中, 即 AL=41H,例3.10图示 16进制数的ASCII码表, , , , , , ,直接寻址方式 格式: IN AL , PORT ;(字节操作) IN AX , PORT ;(字操作) 操作: AL PORT ;(字节操作) AX PORT+1, PORT ;(字操作),PORT是I/O端口地址(0255),输入指令IN (Input),间接寻址方式 格式: IN AL , DX ;(字节) IN AX , DX ;(字) 操作: AL DX ;(字节) AX DX+1,DX ;(字),DX内容是I/O端口地址(065535),输入指令IN (Input),输出指令OUT(Output),直接寻址方式 格式: OUT PORT , AL ;(字节) OUT PORT , AX ;(字) 操作: PORT AL ;(字节) PORT+1 , PORT AX;(字),PORT是I/O端口地址(0255),间接寻址方式 格式: OUT DX , AL ;(字节操作) OUT DX , AX ;(字操作) 操作: DX AL ;(字节操作) DX+1 , DX AX ;(字操作),DX内容是I/O端口地址(065535),输出指令OUT(Output),指令说明,IN和OUT(输入输出)指令专用于 CPU与外设(I/O端口)之间传送信息。 数据必须经由累加器(AX或AL)传送。 直接寻址方式的指令只能寻址256个I/O端口(端口号:0255或0FFH) 。 间接接寻址方式的指令可以寻址64K个I/O端口(端口号: 065535或0FFFFH) 。 IN和OUT指令提供了字与字节两种使用方式, 选用哪一种, 取决于外设端口的宽度。,例3.11 in ax , 28h mov data_word , ax (把端口28h的内容经ax传送到存储单元data_word) 例3.12 mov dx , 3fch in ax , dx (从端口03fch取一个字送到ax寄存器) 例3.13 out 5 , al (从al寄存器输出一个字节到端口5),输入、输出指令举例,目的地址传送指令,取有效地址指令LEA(Load effective address) 格式: LEA reg16 , mem 操作: 把源操作数的EA,传送到目标寄存器 reg16 中,指令说明 源操作数mem必须是内存操作数 reg16必须是一个16位的通用寄存器,例3.14 LEA BX , BUFFER MOV BX , BUFFER 前者是把BUFFER的有效地址EA传送给BX, 后者把存储单元BUFFEER的内容传送给BX。 例3.15 LEA BX , MAXBXSI 若执行前: BX=0400H, SI=003CH, MAX=0F62H 则 EA=0400+003C+0F62=139EH 指令执行后: BX=139EH,LEA指令举例,指针送ES指令LES (Load ES with pointer) 格式: LES reg16 , mem32 操作: reg16 mem32,ES mem32+2,指针送DS指令LDS (Load DS with pointer) 格式: LDS reg16 , mem32 操作: reg16 mem32,DS mem32+2,目的地址传送指令(续),指令说明,源操作数mem32是32位的内存操作数。 目的操作数reg16是16位的通用寄存器。 指令将源操作数指定的存储器中的连续4字节传送给指定的reg16和DS, 低2位字节给reg16, 高2位字节给DS。 LEA、LDS、LES三条指令不影响标志位。,例3.17: LES DI , BX 执行前 DS=B000H , BX =O80AH , B080AH=05AEH , B080CH=4000H 执行后 DI=05AEH , ES =4000H,例3.16 LDS SI, 10H 执行前 DS=C000H , SI=0010H , C0010H=0180H , C0012H=2000H 执行后 SI=0180H , DS=2000H 。,LEA指令举例,标志传送指令,标志送AH指令LAHF (Load AH with flags) 格式: LAHF 操作: AH FLAG的低字节位 只传送了SF、ZF、AF、PF、CF五个标志位,AH送标志寄存器SAHF(Store AH into flags) 格式: SAHF 操作: FLAG的低字节 AH,标志进栈指令PUSHF(Push the flags),格式: PUSHF 操作: SP SP 2,SP+1 , SP FLAGS,格式: POPF 操作: FLAGSP+1,SP,SP SP +2,标志出栈指令POPF(Pop the flags),LAHF和PUSHF不影响标志位 SAHF和POPF由装入的值来确定标志位,3.2.2 算术指令,加法指令,加法指令ADD(add) 格式:ADD dst , src 操作:dst src + dst,带进位加法指令ADC(add with carry) 格式:ADC dst ,src 操作:dst src + dst + CF,加1指令INC(increment ) 格式:INC dst 操作 :dst dst+1,指令说明 dst为寄存器或存储器操作数。 src是寄存器、存储器操作数或立即数 src和dst不能同为存储器操作数 不允许段寄存器参与运算。 允许字节操作或字操作。 上述指令对条件标志位产生影响,但INC指令对CF位无影响。,加法指令,例如: add cl ,10 adc dx , si add ax , mem adc alphadi , 30h inc si 以上指令皆合法。,例3.18: mov al , 7eh mov bl , 5bh add al , 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。,加法指令(举例),取一个字节加数,初始化:置循环次数, 清SI, 清进位标志CF,开始,与一个被加数字节 相加,结果送内存区,(SI)+1,循环次数1,循环次数=0?,结束,N,Y,例3.19的流程图,例3.19中的存储区,图 3.8 例3.19 的存储区和流程,mov cx , 0 ; 设置循环次数 mov si , 0 ; 置位移量初值 clc ;清进位(cf=0) looper: inc cx mov al , data2si ;取一个加数 adc data1si , al ;和另一个加数相加 inc si ;位移量加1 cmp cx , 5 ;循环次数减1 jnz looper ;未完, 转loper 处继续 Hlt ;程序暂停,加法指令(举例),减法指令SUB(subtract ) 格式:SUB dst , src 操作 :dst dst src,带借位减法指令SBB (subtract with borrow) 格式:SBB dst , src 操作: dst dst src CF 其中,CF为借位标志位的值,减法指令,减1指令DEC (Decrement) 格式: DEC dst 操作: dst dst 1,比较指令CMP(Compare) 格式:CMP dst , src 操作:dst src CMP不保存运算结果,但影响条件标志位。,减法指令(续),NEG (Negate)求补 格式: NEG dst 操作: dst 0 dst,指令说明 dst , src的意义与加法指令意义相同; 可进行字节(8位)或字(16位)运算; 以上指令对状态标志位有影响,但DEC指令对CF位无影响,减法指令(续),例如 : SUB AL , 37H SBB CX , DX SUB ARRAYDI , AX SBB SI+6 , 97 DEC BL DEC WORD PTR BPDI NEG AX NEG BYTE PTRBX CMP AL , 0AH CMP BXF5 , SI 皆为合法指令,减法指令(举例),例3.20 内存数据存放了100个带符号数,首地址为AREA1, 要求将各数取绝对值后存入以AREA2为首址的内存区。由于100个带符号数中可能既有正数,又有负数,因此先要判断正负。如为正数,可以原封不动的传送到另一内存区;如为负数,则须先求补即可得到负数的绝对值,然后再传送。程序如下:,例如若原来 AL = 0FFH (-1的补码) 执行指令 NEG AL 后 AL = 01(-1的绝对值),减法指令(举例),LEA SI,AREA1 ; SI 原地址指针 LEA DI,AREA2 ; DI 目的地址指针 MOV CX,100 ; CX 循环次数 CHECK:MOV AL,SI ; 取一个带符号数到AL CMP AL,0 ; AL内容不变, 但影响标志 JNS NEXT ; 若SF=0,则转NEXT NEG AL ; 否则求补 NEXT: MOV DI, AL ; 传送到目的地址 INC SI ; 源地址加1 INC DI ; 目的地址加1 DEC CX ; 循环次数减1 JNZ CHECK ; 如不等于零, 则转CHECK HLT ; 停止,减法指令(举例),例3.21 在数据段从DATA开始的存储单元中分别存放了两个8位无符号数。比较他们的大小,并将大者传送到MAX单元。编程如下: LEA BX,DATA ; DATA偏移地址送BX MOV AL,BX ; 第一个无符号数送AL INC BX ; BX指向第二个无符号数 CMP AL,BX ; 两数比较 JNC DONE ; 如 CF =0,则转到DONE MOV AL,BX ; 否则,第二个无符号数送AL DONE: MOV MAX,AL ; 较大的无符号送MAX单元 HLT ; 停止,减法指令(举例),减法指令(举例),例3.22 SUB SI14H , 0316H 指令执行前 DS =3000H, SI =0040H, 30054H =4336H 指令执行后 4336H 0100 0011 0011 0110 0136H 0000 0001 0011 0110 4200H 0100 0010 0000 0000 0100 0011 0011 0110 或补码相减 1111 1110 1100 1010 10100 0010 0000 0000 所以 30054H =4200H, SF=0, ZF=0, CF=0, OF=0,减法指令(举例),例3.23 SUB DH , BP4 指令执行前 DH = 41H , SS = 0000H, BP = 00E4H , 000E8H=5AH 指令执行后 41H 0100 0001 0100 0001 5AH 0101 1010 1010 0110 E7H 11110 0111 1110 0111 所以 DH = 0E7H , SF=1, ZF=0, CF=1, OF=0,乘法指令,带符号数乘法指令IMUL(Signed Multiple) 格式:IMUL src 操作:与MUL相同,但操作数是带符号数,无符号数乘法指令MUL(Unsigned Multiple) 格式: MUL src 操作: AX ALsrc(字节运算) DX , AXAXsrc(字运算),指令说明 乘法指令是单操作数指令,隐含的目的操作数必须是累加器 src为寄存器或存储器操作数, 不能是立即数 可进行字节或字运算。字节运算时,结果为16位,字运算时,结果为32位。 本指令对CF和OF位有影响,对其他条件标志位为无定义。,乘法指令(续),对标志位的影响: 对于MUL指令, 如果乘积的高半部分(字节运算的AH, 字运算时的DX)为0, 则CF=OF=0, 否则, CF=OF=1 对于IMUL指令, 如果乘积的高半部分仅仅是乘积低半部分的符号扩展, 则CF=OF=0, 否则, CF=OF=1。,符号扩展就是将乘积的低半部分中的最高位之值送入乘积的高半部分的每一位。,乘法指令(对标志位的影响),例如, 字节运算, 若: AL80H , 符号扩展后,AH=0 若: AL80H , 符号扩展后,AH=FFH 例如,字运算, 若: AX8000H , 符号扩展后, DX=0 若: AX8000H , 符号扩展后, DX=FFFFH。,乘法指令(对标志位的影响),例3.24 AL =0B4H , BL=11H 0B4H 为无符号数的180D,带符号数的-76D 11H 为无符号数的17D, 带符号数的+17D 执行 IMUL BL 指令语句后, 乘积为:AX=0FAF4H=-1292D ; 而 AHFFH(AL的符号扩展), 所以 OF=CF=1 执行 MUL BL 后, 乘积为:AX=0BF4H=3060D 而 AH0, 所以 OF=CF=1,8086CPU执行除法时规定: 当被除数为字时,除数应为字节; 当被除数为双字位时,除数应为字。,除法指令,除法指令DIV(Unsigned divide) 格式:DIV src 操作:AL AX/src 的商(字节运算) AH AX/src 的余数 AX DX ,AX/src 的商(字运算) DX DX ,AX/src 的余数,操作数被认为是无符号数,商和余数皆为无符号数。,带符号数除法指令IDIV (Signed divide) 格式:IDIV src 操作:与DIV相同,但操作数被认为是带符号数, 商和余数也是带符号数,指令说明 src的类型与乘法指令中的一样; 除法指令对条件标志为无定义(值不确定); 若除数为0,或执行除法时,商超出范围,CPU自动产生类型号为0的内部中断,作中断处理。,除法指令(续),符号扩展指令,字扩展指令CWD 格式:CWD 操作:若 AX 8000H, 则 DX0000H, 否则 DX FFFFH,字节扩展指令CBW 格式:CBW 操作:若 AL80H , 则 AH00H, 否则 AHFFH,例如: mov al , 64h ;AL64H(机器数), ;表示10进制数100(真值) cbw ;将符号“0”扩展,AX0064H, ;仍然表示100 mov ax , 0ff00h ;AXFF00H, ;表示有符号10进制数256 cwd ;将符号位“1”扩展, ;DX ,AXFFFFFF00H ;仍然表示256,符号扩展指令(举例),例3.25 设 AX =0400H , BL=0B4H AX 为无符号数的1024D, 带符号数的+1024D BL 为无符号数的180D,带符号数的-76D 执行 DIV BL 的结果为: AH=7CH=124D 余数 AL=05H=5D 商 执行 IDIV BL 的结果为: AH=24H=36D 余数 AL=0F3H=-13D 商,符号扩展指令(举例),例3.26 计算(V-(XYZ540)X 其中X、Y、Z、V均为16为带符号数,已分别装入X、Y、Z、V单元。要求计算结果的商存入AX, 余数存入DX寄存器。 编程如下: mov ax , x ; multiply x imul y ; by y and mov cx , ax ; store product mov bx , dx ; in bx, cx mov ax , z ; add sign-extended y cwd ; to the,符号扩展指令(举例),add cx , ax ; product adc bx , dx ; in BX,CX sub cx , 540 ; subtract 540 sbb bx , 0 ; from BX, CX mov ax , v ; subtract (BX,CX) cwd ; from sign-extended v sub ax , cx ; and sbb dx , bx ; divide by x leave idiv x ; quotient in AX ; and remainder in DX,符号扩展指令(举例),十进制调整指令,BCD码(Binary Coded Decimal) BCD码是一种用二进制编码表示的十进制数,又称二十进制数 它用4位二进制码表示1位十进制数码,这4位二进制数的权为8421,所以又称8421码。,非压缩的BCD码(unpacked BCD format) 以8位二进制数为一组表示1位十进制数; 8位中的低4位表示8421的BCD码,而高4位则无意义。,压缩的BCD码(packed BCD format) 用4位二进制数表示1位十进制数位,整个十进制数形式为一个顺序的以4位为一组的数串。,十进制调整指令(续),例如:9502d的压缩的BCD码形式为: 1001 0101 0000 0010 非压缩的BCD码形式为: uuuu1001 uuuu0101 uuuu0000 uuuu0010 数字的ASC码就是一种非压缩的BCD码形式 例如:9d的ASC码为:39H=0011 1001 其低4位是8421BCD码(9), 高4位无意义。,十进制调整指令(BCD码举例),编码比较 真值(十进制) 8 64 二进制编码 08H 40H 压缩BCD码 08H 64H 非压缩BCD码 08H 0604H ASCII码 38H 3634H,调整的意义 算术运算指令都是二进制运算指令,若作BCD码的运算,会出现错误,必须进行调整才能得到正确的BCD码运算结果。 在进行十进制数算术运算时应分两步进行: 先按二进制数运算规则运算,得到中间结果; 再用十进制调整指令对中间结果进行修正,得到正确的结果。,十进制调整指令(调整的意义),例如 34+23=57 0011 0100 34的BCD码 + 0010 0011 23的BCD码 0101 0111 57的BCD码 结果正确,不作调整。,十进制调整指令(调整的意义举例),例如: 76=13 0000 0111 ; 7的BCD码 0000 0110 ; 6的BCD码 0000 1101 ; 结果错(和9, AF=0) 0000 0110 ; 加6调整 0001 0011 ; 13的BCD码, 正确,两个4位二进制数之和9, 应作加6调整,例如: 48+29=77 0100 1000 ; 48的BCD码 0010 1001 ; 29的BCD码 0111 0001 ; 错误(有进位,AF=1) 0000 0110 ; 加6调整 0111 0111 ; 77的BCD码,正确,两个4位二进制数之和9, 但有 AF=1,应作加6调整,十进制调整指令(调整的意义举例),例如 57+46=103 0101 0111 0100 0110 1001 1101 ; 中间结果,低4位9 0000 0110 ; 加6调整 1010 0011 ; 中间结果,高4位9 0110 0000 ; 加60H调整 CF1 0000 0011 ; 正确结果 CF=1,十进制调整指令(调整的意义举例),加法运算后,低4位9时,调整指令需作加06H调整;高4位9时,调整指令需作加60H调整。,例如: 72+91=163 0111 0010 1001 0001 CF1 0000 0011 ; 中间结果, CF=1 0110 0000 ; 加60H调整 0110 0011 ; 正确结果,加法运算后,当CF=1(有进位产生)时,调整指令应作加60H处理。,十进制调整指令(调整的意义举例),格式:DAA 操作:将AL中的和调整成压缩的BCD格式。,加法的十进制调整指令DAA(decimal adjust for addition),调整方法: 若 AL的低4位9或AF=1, 则ALAL06H , AF1 若AL的高4位9或CF=1, 则ALAL60H , CF1,指令说明 DAA指令之前必须先执行ADD或ADC指令 加数和被加数都必须是2位的压缩BCD数 和要存入AL寄存器 DAA指令对OF无定义, 但影响其他标志位。,例3.27 ADD AL , BL DAA 执行前, AL=28H , BL=68H 执行ADD后, AL=90H , AF=1, CF=0 和不是正确的BCD码形式。 执行DAA指令,因为 AF=1, CF=0,故而作调整: ALAL+06H 得到 AL=96H , CF=0 , AF=1,DAA应用举例,减法的十进制调整指令DAS(decimal adjust for subtraction),格式:DAS 操作:把AL中的差调整成压缩的BCD码格式,调整方法: 若AL的低4位9或AF=1 , 则AL AL06H , AF1 若AL的高4位9或CF=1 , 则AL AL60H , CF1,指令说明 DAS指令仅对AL内容作调整,不改变AH的内容。 在DAS指令之前必须先执行SUB或SBB指令 减数和被减数都必须是2位的压缩BCD数 DAS指令对OF位无影响,对其他条件标志位产生影响。,例3.28 SUB AL , AH DAS 如执行前, AL=86H , AH=07H 执行SUB后, AL=7FH, CF=0, AF=1, 结果错误 执行DAS, 作调整:AL=AL06H 得到: AL=79H, CF=0, AF=1 , 结果正确,DAS指令举例,例3.29 设(BCD1)=1234H, (BCD2)=4612H, 试写出指令序列完成(BCD3)(BCD1)(BCD2) 。 mov al , bcd1 sub al , bcd2 das mov bcd3 , al mov al , bcd1+1 sbb al , bcd2+1 das mov bcd3+1 , al,DAS指令举例,加法的ASCII调整指令AAA (ASCII adjust for addition),格式:AAA 操作:将AL中的和调整到非压缩的BCD码格式, AHAH调整产生的进位值,调整方法: 若AL 0FH 09H 或 AF=1, 则ALAL+06H , AHAH+1,AF 1, CF 1 , ALAL 0FH 否则 ALAL 0FH ,CF 0 ,AF 0,指令说明 AAA指令之前必须先执行ADD或ADC指令 加数和被加数都必须是1位压缩BCD数 和要存入AL寄存器。 AAA指令影响AF和CF标志,对其他标志无定义,例3.30 ADD AL , BL AAA 如指令执行前,AX=0535H(5的ASCII码),BL=39H(9的ASCII码) ADD指令执行完后 AL = 6EH, BL=39H, AH = 05H, AF=CF= 0,AAA指令应用举例,执行AAA, 因 AL0FH=0EH9H 作调整:ALAL+06H,得 AL=74H;AHAH+1,得 AH=06H AF1,CF 1;ALAL0FH,得 AL=04H 最终结果为:AH= 06H, AL = 04H, 即: AX = 0604H , CF=AF=1,减法的ASCII码调整指令AAS(ASCII adjust for subtraction),格式: AAS 操作: 把AL中的差调整到非压缩的BCD码格式, AH AH 调整产生的借位值。,调整方法: 若AL0FH9 或 AF=1, 则AL AL 6 , AH AH1;AF1 , CF 1 , AL AL 0FH 否则 AL AL 0FH,AAS指令的使用要求和对标志位的影响与AAA指令类似,例3.31 完成非压缩BCD码的运算:134=9 mov ax , 0103h ; ah = 01h, al = 03h mov bl , 04h ; bl = 04h sub al , bl ; al = 03h 04h = ffh aas ; ax = 0009h 调整过程: alal6 , 得 al = f9h ah ah 1 , 得 ah = 0 CF=AF=1 al al 0fh,得 al = 09h 最终结果为 ax = 0009h,AAS应用举例,乘法的ASCII调整指令AAM(ASCII adjust for multiplication),格式: AAM 操作:对AL中的乘积进行调整,指令说明 AAM指令之前必须执行MUL指令; 乘数与被乘数是高4位为0的1 位非压缩型BCD码 对SF, ZF和PF位有影响,对AF, CF和OF位无

温馨提示

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

评论

0/150

提交评论