大三上限选汇编语言课件第3章_第1页
大三上限选汇编语言课件第3章_第2页
大三上限选汇编语言课件第3章_第3页
大三上限选汇编语言课件第3章_第4页
大三上限选汇编语言课件第3章_第5页
已阅读5页,还剩135页未读 继续免费阅读

下载本文档

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

文档简介

3.380x86的指令系统80x86的指令系统中共有136种基本指令,可以分成6个功能组:

数据传送(Datatransfer)25

算术运算(Arithmetic)21

逻辑运算和移位指令(Logic&Shift)21

串处理(Stringmanipulation)7

控制转移(ControlTransfer) 47

处理机控制(ProcessorControl)15先介绍以下内容:1.

学习指令的要点2.

指令中操作数的表示3.

书写指令注意事项先介绍以下内容:1.

指令助记符表2.

学习指令的要点3.

利用DEBUG程序,学习指令系统4.

指令中操作数的表示5.

书写指令注意事项1.指令助记符表1.学习指令的要点从以下几个方面来掌握一条指令:

指令的助记符

指令的格式:操作数的个数、类型(B,W,DW)

执行的操作:指令执行后的结果包括:哪些寄存器、内存单元的值发生了变化对标志位有无影响,哪些受影响

特点及注意事项只介绍常用的指令,其他需要时可自学。重点关注:指令的汇编格式指令的基本功能指令支持的寻址方式指令的执行对标志位的影响指令的特殊要求D:\>DEBUG

-A

;汇编指令0AF8:0100MOVAL,B5

0AF8:0102ADDAL,8F

0AF8:0104

-R

;显示指令执行前各寄存器的值AX=0000BX=0000CX=0000DX=0000、、、、、、CS=0AF8IP=0100NVUP

EIPLNZNA

PO

NC-T=1002

;执行指令,查看结果AX=0044BX=0000CX=0000DX=0000、、、、、、CS=0AF8IP=0104OVUPEIPL

NZ

ACPECY0AF8:01042080FC01AND[BX+SI+01FC],AL-

10110101

+

10001111进位1

111111

01000100编程完成B5h+8Fh=?学习加法ADD指令及其对状态标志位的影响。3.利用DEBUG学习指令系统(示例)2.指令中操作数的表示符号表示内容data立即数操作数reg通用寄存器操作数8位:AH、AL、BH、BL、CH、CL、DH、DL16位:AX、BX、CX、DX、BP、SP、SI、DIsegreg段寄存器CS、DS、SS、ESmem或[]存储器操作数(5种寻址方式)src源操作数dst目的操作数

(

)注释时表示寄存器、存储器、端口的内容oprd1oprd2两操作数3.书写指令注意事项:不区分字母的大小写。下列写法表示同一条指令:MOVAX,1ABDHmovax,1abdh

不添加指令系统没有的指令,即不自创助记符。将MOVAL,0写成MOVEAL,0JMPlable写成JUMPlable

注意操作数的范围对字节操作指令0~FFH0~255对字操作指令0~FFFFH0~65535

MOVAL,260

MOVAX,70000MOVAL,1FFHMOVAL,2ABCDH

对无操作数指令,不添加操作数。

STCAL

对单操作数指令,操作数不能是立即数。

IMUL6

对双操作数指令①不能两个同为存储器操作数

MOV[DI],[SI]

②目的操作数不能是立即数

ADD3,AL

两个操作数的类型应相同

SUBAX,BL

若value定义为字类型存储器变量:

MOVCL,value[BX]

内存操作数的属性应明确。

MOV[BX],0MOVbyteptr[BX],0MOVwordptr[BX],0MOV[BX],ALMOV[BX],AXA、B、C、D、E、F开头的十六进制数前面加0,与H结尾的标识符区别。如寄存器名:AH、BH、CH、

DH

变量名:abcdH等例

movAL,0AHmovAL,AHmovBX,0abcdHCS和IP的值只在控制转移指令中修改。对非控制转移指令,取完指令后IP值自动指向下条指令。段寄存器CS的值,只在MOV、PUSH中可作操作数,且这两条指令执行结果不改变CS值。MOVAX,CSPUSHCSIP、PSW两个寄存器不作为操作数在指令中出现。movIP,1234HmovPSW,0F0FHPSW状态寄存器的值由指令执行后确定,不同的指令对各标志的影响不同。

数据传送是最基本、最重要的一种操作实际程序中,使用的比例最高

changePROC

LEASI,num+2MOVCL,num+1MOVCH,0MOVAX,0MOVDI,10next:MULDI

MOVBH,0MOVBL,[SI]ANDBL,0FHADDAX,BXINCSILOOPnextzero:MOVBX,AXRETchangeENDP

汇编子程例:寄存器寄存器寄存器内存单元寄存器I/O端口设置寄存器、内存单元的初始值3.3.1

数据传送指令

按传送内容,可分为四类:

通用数据传送指令

累加器专用传送指令

地址传送指令

标志寄存器传送指令

特点:

1.除POPF/FD、SAHF外,其他传送指令对标志位均无影响

2.唯一允许以段寄存器做操作数的指令且只有MOV、PUSH、POP这三条允许通用传送指令(8) MOV MOVSX MOVZX PUSH POP PUSHA/PUSHAD POPA/POPAD XCHG

传送带符号扩展传送带零扩展传送进栈出栈所有寄存器进栈所有寄存器出栈交换(1)MOV传送指令格式

MOVDST,SRC执行

(DST)←(SRC)reg/mem/segreg←regreg/segreg←memreg/mem←segregreg/mem←data

可实现例:①reg/mem/segreg←reg通用寄存器/存储器/段寄存器←通用寄存器

MOVAL,BLMOV[BX],ALMOVDS,AX②reg/segreg←mem通用寄存器/段寄存器←存储器

MOVAL,[BX]MOVDS,[BX+SI]

③reg/mem←segreg通用寄存器/存储器←段寄存器

MOVBX,CSMOV[BX],DS

④reg/mem←data通用寄存器/存储器←立即数

MOVAl,9MOVBX,OFFSETbufferMOVBYTEPTR[value],0MOVWORDPTR[BX],1MOV指令特点及注意事项:

双操作数指令(注意双操作指令的特点)可进行字节或字传送不允许存储器传送到存储器MOV[BX],valueMOV[DI],[SI]MOVAX,valueMOV[BX],AXMOVAL,[SI]MOV[DI],AL

可对DS、ES、SS赋值但不允许立即数直接传送给段寄存器MOVDS,AXMOVES,[BX]MOVDS,1000HMOVAX,1000HMOVDS,AX

CS不能做目的操作数,不能通过传送指令改变CS的值

MOVCS,AX

不允许段寄存器传送到段寄存器

MOVES,DSMOVAX,DSMOVES,AXD:\MASM>DEBUG-A1693:0100MOVES,DS^Error1693:0100MOVAX,DS1693:0102MOVES,AX1693:0104-例编程将CL寄存器的内容传送到200:100H单元中。MOVAX,200HMOVDS,AX;(DS)=200HMOV[100H

],CL;(02100H)=(CL)编程1:MOVAX,200HMOVDS,AX;(DS)=200HMOVDI,100H;(DI)=100HMOV[DI

],CL;(02100H)=(CL)编程2:MOV[200:100H],CL

MOV指令应用(自学)例:实现将AREA1开始的100个数据传送到AREA2开始的单元。……AREA1:AREA2:100个数据分析题意:

①可以用200条MOV指令来完成100个数据传送,指令操作重复,每个数据传送后的地址是变化的。②可以利用循环, 但每循环一次要修改地址(源地址和目的地址),必须把地址放在寄存器当中,用寄存器间接寻址来寻找操作数.得到如下程序:

MOVSI,OFFSETAREA1 MOVDI,OFFSETAREA2 MOVCX,100AGAIN: MOVAL,[SI] MOV[DI],AL

INCSI ;修改地址指针

INCDI ;修改地址指针

DECCX ;修改个数

JNZAGAIN

…MOVSX

带符号扩展传送MOVZX

带零扩展传送格式:MOVSX/

MOVZX

DST,SRC执行的操作:(DST)

符号扩展(SRC)例:

MOVSXEAX,CLMOVSXEDX,[EDI]MOVZXDX,ALMOVZXEAX,[EDI]注意:

1.目的操作数必须是16位或32位寄存器

2.源操作数的长度一定要小于目的操作数

3.MOVSX的源操作数应是有符号数,而MOVZX的源操作数应是无符号数什么是堆栈,为什么需要堆栈堆栈是按照先进后出原则组织的一段内存区域存在于堆栈段中,SP在任何时候都指向栈顶。通常用于存放一些重要数据,

如:程序的地址、或是需要恢复的数据。为方便数据的存放和恢复,设置专门的指针,指向堆栈中要操作的单元。段值由SS给出,偏移地址由SP给出

SS→堆栈段寄存器(stacksegment)SP→堆栈指针寄存器(stackpoint)堆栈:“先进后出”的存储区,堆栈使用的场合用堆栈保存恢复信息

子程序的调用、返回以及中断调用、返回

用堆栈传送数据(程序设计中介绍)注意事项

堆栈是一重要数据结构,使用堆栈应有明确目的。不乱用堆栈操作,不乱修改堆栈内容。PUSH、POP、PUSHF、POPF、CALL、RET、INT、IRET

乱修改SS和SP的内容包括乱用BP参与的存储器操作数

乱用指令

进栈指令:PUSHSRC

执行操作:(SP)

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

(SRC)

把一个字从源操作数(src)

由SP指向堆栈顶部。特点:

单操作数指令操作数为16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:CS,DS,ES,SSmem:字类型例:假设(AX)=2107H,执行

PUSHAX(SP)

低地址高地址(SP)

07H21H低地址高地址进栈方向********PUSHAX执行前PUSHAX执行后D:\MASM>DEBUG-A

;汇编两条指令1693:0100MOVAX,12341693:0103PUSHAX1693:0104-R

;显示指令执行前寄存器值AX=0000

BX=0000CX=0000DX=0000

SP=FFEE

BP=0000SI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0100NVUPEIPLNZNAPONC1693:0100B83412MOVAX,1234-T=1002

;执行CS:100开始处的两条指令

….AX=1234

BX=0000CX=0000DX=0000

SP=FFEC

BP=0000SI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0104NVUPEIPLNZNAPONC1693:010403C6ADDAX,SI-DSS:FFECL10

;查看栈顶内容1693:FFE0341200004...1693:FFF0FFFFFFFFFFFFFFFF-FFFFFFFFFFFFFFFF

.........…-例利用DEBUG学习PUSH指令注意相关寄存器和内存单元内容的变化出栈指令:POPDST

执行操作:(DST)

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

(SP)+2把现行SP所指向堆栈顶部的一个字

指定的目的操作数(dest),同时进行修改堆栈指针的操作。特点:单操作数指令操作数为16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:DS,ES,SS,不允许是CSmem:字类型例:POPBX(SP)

低地址高地址(SP)

07H21H低地址高地址出栈方向07H21H

(BX)=2107HPOPBX执行前POPBX执行后********-A

1693:0100MOVBP,SP;取当前栈顶地址

1693:0102MOVWORDPTR[BP],1234;用MOV指令使栈顶内容为1234H1693:0107POPBX;出栈指令1693:0108-R

;查看指令执行前状态AX=0000BX=0000CX=0000DX=0000SP=FFEE

BP=0000SI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0100NVUPEIPLNZNAPONC1693:010089E5MOVBP,SP-T=100

;执行CS:100处的第一条mov指令AX=0000BX=0000CX=0000DX=0000SP=FFEE

BP=FFEESI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0102NVUPEIPLNZNAPONC1693:0102C746003412MOVWORDPTR[BP+00],1234SS:FFEE=0000-T

;执行下一条mov指令AX=0000BX=0000CX=0000DX=0000SP=FFEE

BP=FFEESI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0107NVUPEIPLNZNAPONC1693:01075BPOPBX-T

;执行pop指令,注意BX,SP的变化AX=0000BX=1234CX=0000DX=0000SP=FFF0BP=FFEESI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0108NVUPEIPLNZNAPONC1693:0108F5CMC-例在DEBUG下学习POP指令PUSHA/PUSHADPOPA/POPAD所有16位/32位寄存器进栈所有16位/32位寄存器出栈执行操作进栈顺序AX,CX,DX,BX,SP,BP,SI,DIEAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI

(SP)←(SP)-16(32)出栈顺序DI,SI,BP,SP,BX,DX,CX,AXEDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX(SP)←(SP)+16(32)

交换指令:XCHGOPR1,OPR2

执行操作:(OPR1)

(OPR2)例:XCHGBX,[BP+SI]XCHGAL,BH注意:

*

可进行字或字节操作,不影响标志位

*

不允许对立即数、段寄存器做操作数

XCHGAX,4

XCHGBX,DS

输入指令(I/O

CPU)

长格式:INAL,PORT

(字节)

INAX,PORT

(字)

INEAX,PORT

(双字)

累加器专用传送指令(只限使用AX或AL)执行操作:(AL)

(PORT)(字节)

(AX)

(PORT+1,PORT)(字)

(AX)

(PORT+3,PORT+2,PORT+1,PORT)(双字)

短格式:INAL,DX

(字节)

INAX,DX

(字)

INEAX,DX

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

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

(AX)((DX)+3,(DX)+2,(DX)+1,(DX))

(双字)

长格式:OUTPORT,AL

(字节)

OUTPORT,AX

(字)

OUTPORT,EAX

(双字)执行操作:(PORT)

(AL)(字节)

(PORT+1,PORT)

(AX)(字)

(PORT+3,PORT+2,PORT+1,PORT)

(EAX)

(双字)输出指令(CPU

I/O)

短格式:OUTDX,AL

(字节)

OUTDX,AX

(字)

OUTDX,EAX

(双字)执行操作:((DX))

(AL)(字节)

((DX)+1,(DX))

(AX)(字)

((DX)+3,(DX)+2,(DX)+1,(DX))

(AX)

(双字)注意:*

不影响标志位*

前256个端口号00H~FFH可直接在指令中指定(长格式)*如果端口号

256,端口号

DX(短格式)例:INAX,28H;MOVDX,28H;INAX,DXMOVDATA_WORD,AX例:MOVDX,3FCHINAX,DX例:OUT5,AL例:测试某状态寄存器(端口号27H)的第2位是否为1INAL,27HTESTAL,00000100BJNZERROR;若第2位为1,转ERROR处理Sound程序

movdx,100

inal,61handal,11111100bsound:xoral,2

out61h,almovcx,140hwait1:loopwait1decdxjnesound设备控制寄存器端口61H1/00

控制其它外部设备与门放大器2号定时器门控10(BX)

30HF004031HF0041(AL)=332HF004233HF0043TABLE(DS)=F000H换码指令:XLAT

或XLATOPR执行操作:(AL)

((BX)+(AL))表格符号地址(首地址),只是为了提高可读性而设置,汇编时仍用BX。例:MOVBX,OFFSETTABLE;(BX)=0040HMOVAL,3XLATTABLE

指令执行后(AL)=33H注意:

*

不影响标志位*

字节表格(长度不超过256)

首地址

(BX)*

需转换代码(AL)XLAT指令使用方法:先建立一个字节表格;表格首偏移地址存入BX;需要转换代码的序号(相对与表格首地址位移量)存入AL;

(表中第一个元素的序号为0)执行XLAT指令后,表中指定序号的元素存于AL中。

(AL)为转换的代码。XLAT指令应用:若把字符的扫描码转换成ASCII码;或数字0~9转换成7段数码所需要的相应代码(字形码)等就要用XLAT指令。例:内存的数据段中有一张十六进制数字的ASCII码表。

首地址为:Hex_table,欲查出表中第10个元素(‘A’)执行指令序列:MOVBX,OFFSETHex_tableMOVAL,0AHXLATHex_table假设: (DS)=F000H,

Hex_table=0040H

(AL)=0AH执行XLAT以后:(AL)=41H=(F004AH), 即“A”的ASCII码。30H31H32H...39H41H42H...46H...Hex_tableHex_table+1Hex_table+2Hex_table+0AHHex_table+0BHHex_table+0FH'F''B''A''9''1''2''0'16进制数的ASCII码表

地址传送指令

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

执行操作:(REG)

SRC

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

执行操作:(REG)

(SRC)(DS)

(SRC+2)

4个相继字节

寄存器(通常是SI)、DS

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

执行操作:(REG)

(SRC)(ES)

(SRC+2)

4个相继字节

寄存器(通常是DI)、ES例:LEABX,[BX+SI+0F62H]

LDSSI,[10H]

LESDI,[BX]40H00H00H30H

TABLE(DS):1000HMOVBX,TABLE;(BX)=0040HMOVBX,OFFSETTABLE

;(BX)=1000HLEABX,TABLE

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

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

;(ES)=3000H注意:

*

不影响标志位

*

REG不能是段寄存器

*

SRC必须为存储器寻址方式

标志寄存器传送指令

标志送AH指令:LAHF

执行操作:(AH)

(PSW的低字节)

AH送标志寄存器指令:SAHF

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

(AH)

标志进栈指令:PUSHF

执行操作:(SP)

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

(PSW)

标志出栈指令:

POPF

执行操作:(PSW)

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

(SP)+2*影响标志位

类型转换指令

CBWAL

AX

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

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

CWDAX

(DX,AX)

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

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

例:(AX)=0BA45HCBW;(AX)=0045HCWD;(DX)=0FFFFH(AX)=0BA45H注意:

*

无操作数指令

*隐含对AL或AX进行符号扩展

*不影响条件标志位

加法指令

ADD、ADC、INC

减法指令

SUB、SBB、DEC、NEG、CMP

乘法指令

MUL、IMUL

除法指令

DIV、IDIV

十进制调整指令

DAA、DAS、

AAA、AAS、AAM、AAD3.3.2算术指令

加法指令

加法指令:ADDDST,SRC

执行操作:(DST)

(SRC)+(DST)

带进位加法指令:ADCDST,SRC

执行操作:(DST)

(SRC)+(DST)+CF

加1指令:INCOPR

执行操作:(OPR)

(OPR)+1注意:*

除INC指令不影响CF标志外,均对条件标志位有影响。加法指令对条件标志位(CF/OF/ZF/SF)的影响:CF位表示无符号数相加的溢出。OF位表示带符号数相加的溢出。1结果为负0否则SF=1结果为00否则ZF=1和的最高有效位有向高位的进位0否则CF=1两个操作数符号相同,而结果符号与之相反0否则OF=n=8bit带符号数(-128~127)无符号数(0~255)

00000100+0000101100001111带:(+4)+(+11)=+15OF=0无:4+11=15CF=0带符号数和无符号数都不溢出00001001+0111110010000101

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

无:9+124=133CF=0带符号数溢出无符号数溢出00000111+1111101100000010带:(+7)+(-5)=+2OF=0无:7+251=2CF=1带符号数和无符号数都溢出10000111+1111010101111100带:(-121)+(-11)=+124OF=1无:135+245=124CF=1例:双精度数的加法

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

指令序列

(1)ADDAX,CX

(2)ADCDX,BX

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

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

减法指令减法指令:SUBDST,SRC

执行操作:(DST)

(DST)-(SRC)带借位减法指令:SBBDST,SRC

执行操作:(DST)

(DST)-(SRC)-CF减1指令:DECOPR

执行操作:(OPR)

(OPR)-1求补指令:NEGOPR

执行操作:(OPR)

-(OPR)比较指令:CMPOPR1,OPR2

执行操作:(OPR1)-(OPR2)注意:*除DEC指令不影响

CF标志外,均对条件标志位有影响。减法指令对条件标志位(CF/OF/ZF/SF)的影响:CF

位表示无符号数减法的溢出。OF

位表示带符号数减法的溢出。1被减数的最高有效位有向高位的借位0否则CF=1两个操作数符号相反,而结果的符号与减数相同0否则OF=1减法转换为加法运算时无进位0否则CF=或NEG指令对CF/OF的影响:0操作数为01否则CF=1操作数为-128(字节运算)或操作数为-32768(字运算)0否则OF=例: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单元

乘法指令

无符号数乘法指令:MULSRC

执行操作:

字节操作数(AX)

(AL)*(SRC)

字操作数(DX,AX)

(AX)*(SRC)

双字操作(EDX,EAX)

(EAX)*(SRC)

带符号数乘法指令:IMULSRC注意:

*AL(AX、EAX)为隐含的乘数寄存器。*

AX((DX,AX)、(EDX,EAX))为隐含的乘积寄存器。*

SRC不能为立即数。*除CF和OF外,对条件标志位无定义。乘法指令对CF/OF的影响:例:(AX)=16A5H,(BX)=0611H

(1)

IMULBL

;(AX)(AL)*(BL)

;A5*11

5B*11=060B

F9F5

;

(AX)=0F9F5H

CF=OF=1(2)

MULBX

;(DX,AX)(AX)*(BX)

;16A5*0611=00895EF5

;

(DX)=0089H(AX)=5EF5H

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

IMUL指令:CF/OF=对于80286+,还有(1)双操作数的IMUL格式:IMUL REG,SRC执行的操作:字操作:(REG16)(REG16)*SRC双字操作:(REG32)(REG32)*SRC注:

1、SRC与REG长度要一致

2、SRC可以是任一种寻址方式

3、SRC为立即数时,可以是8位、16位、32位立即数对于80286+,还有(2)三操作数的IMUL格式:IMUL REG,SRC,IMM执行的操作:字操作:(REG16)SRC*IMM双字操作:(REG32)SRC*IMM注:

1、SRC与REG长度要一致

2、SRC可以是除立即数以外的任一种寻址方式3、IMM(立即数),可以是8位、16位、32位立即数三种IMUL的区别1、乘积字长不同

单操作数时乘积字长是源和目的操作数字长的二倍双操作数和三操作数时乘积字长与源和目的操作数字长相同2、溢出位OF的意义不同单操作数时OF为1,乘积结果也是正确的双操作数和三操作数时乘积结果不正确

除法指令

无符号数除法指令:DIVSRC

执行操作:

字节操作(AL)

(AX)/(SRC)的商

(AH)

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

(DX,AX)/(SRC)的商

(DX)

(DX,AX)/(SRC)的余数双字操作(EAX)

(EDX,EAX)/(SRC)的商

(EDX)

(EDX,EAX)/(SRC)的余数

带符号数除法指令:IDIVSRC注意:

*AX、(DX,AX)、(EDX,EAX)为隐含的被除数寄存器。

*

AL、(AX)、(EAX)为隐含的商寄存器。

*

AH、(DX)、(EDX)为隐含的余数寄存器。

*

SRC不能为立即数。

*

对所有条件标志位均无定义。例:x,y,z,v均为16位带符号数,计算

(v-(x*y+z–540))/xMOVAX,XIMULY;x*yMOVCX,AXMOVBX,DXMOVAX,ZCWDADDCX,AXADCBX,DX;x*y+zSUBCX,540SBBBX,0;x*y+z-540MOVAX,VCWDSUBAX,CXSBBDX,BX;v-(x*y+z-540)IDIVX;(v-(x*y+z-540))/x

十进制调整指令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 00111001

十进制调整指令

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 00111001例:写出(3590)10的压缩BCD码和非压缩BCD码,并分别把它们存入数据区PAKED和UNPAK。压缩BCD: (3590)10=(0011010110010000)BCD非压缩BCD:

(3590)10=(00000011000001010000100100000000)BCDPAKED90H35HUNPAK00H09H05H03H压缩的BCD码调整指令加法的十进制调整指令:DAA执行操作:(AL)

(AL)压缩BCD减法的十进制调整指令:DAS执行操作:(AL)

(AL)压缩BCD19压缩BCD:00011001+08+000010002700100001+110

(00100111)BCD

AF=1问题的提出:

注意:

*

隐含的操作寄存器为AL*

紧接在加减指令之后使用*影响条件标志位(对OF无定义)调整方法:AF=1或(AL)0~3=A~F,则(AL)

(AL)

06H,AF=1CF=1或(AL)4~7=A~F,则(AL)

(AL)

60H,CF=1(DAA做‘+’,DAS做‘-’)例: DATASEGMENT

BCD1 DB 34H,18H;(1834)BCD BCD2 DB 89H,27H;(2789)BCD BCD3 DB 2DUP(?) DATAENDS(1)BCD3

BCD1+BCD2 ;(4623)BCD

(2)BCD3

BCD1-BCD2;(9045)BCD

=-955(1) MOV AL,BCD1;(AL)=34H

ADD AL,BCD2

;(AL)=34+89=BDH

DAA

;(AL)=BD+60+06=23HAF=CF=1

MOV BCD3,AL;(BCD3)=23H MOV AL,BCD1+1;(AL)=18H

ADC AL,BCD2+1;(AL)=18+27+1=40H

AF=1CF=0 DAA

;(AL)=40+06=46H

MOV BCD3+1,AL;(BCD3+1)=46H(2) MOV AL,BCD1 ;(AL)=34H

SUB AL,BCD2 ;(AL)=34-89=ABH

DAS ;(AL)=AB-60-06=45HAF=CF=1

MOV BCD3,AL;(BCD3)=45H MOV AL,BCD1+1;(AL)=18H

SBB AL,BCD2+1;(AL)=18-27-1=F0H

DAS ;(AL)=F0-60=90H

MOV BCD3+1,AL;(BCD3+1)=90H非压缩的BCD调整指令加法调整指令:AAA(AL)

(AL)非压缩BCD减法调整指令:AAS(AL)

(AL)非压缩BCD注意:*

隐含的操作寄存器为AL*

紧接在加减指令之后使用*除AF、CF外,对其它条件标志位无定义调整方法:若(AL)0~3=0~9,且AF=0,则(AL)4~7=0,AF

CF=0若(AL)0~3=A~F,或AF=1,则(AL)

(AL)±6,(AL)4~7=0(AH)

(AH)±1,AF

CF=1(AAA做‘+’,AAS做‘-’)乘法调整指令:AAM(AL)

(AX)非压缩BCD

注意:*

隐含的操作寄存器为AL*

紧接在MUL指令之后使用*对OF、CF、AF无定义调整方法:

(AL)除以0AH,商

(AH),余数(AL)除法调整指令:AAD

被除数(AX)=(0000xxxx0000xxxx)非压缩BCD

除数=(0000xxxx)非压缩BCD

在DIV指令之前:

(AL)2

0AH×(AH)+(AL) (AH)2

0例:(AX)=0504H(BL)=03H

(1)(AL)*(BL)

MULBL;(AX)=000CHAAM;(AH)=01H(AL)=02H(2)(AX)/(BL)

AAD;(AH)=00H(AL)=36H DIVBL;(AH)=00H(AL)=12H AAM;(AH)=01H(AL)=08H

逻辑运算指令位测试并修改指令位扫描指令移位指令3.3.3逻辑指令逻辑非指令:NOTOPR*OPR不能为立即数

执行操作:(OPR)

(OPR)*不影响标志位

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

(DST)

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

(DST)

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

(DST)

(SRC)测试指令:TESTOPR1,OPR2

执行操作:(OPR1)

(OPR2)CFOFSFZFPFAF00***无定义

根据运算结果设置逻辑运算指令例:屏蔽AL的0、1两位

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

ORAL,20H

例:使AL的0、1位变反

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

TESTAL,1JZEVEN

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

********OR00100000**1*****

********XOR00000011

********位测试并修改指令(适用于386+)位测试指令BT DST,SRC执行的操作:把DST中由SRC中指定位的值送往CF位测试并置1指令BTS DST,SRC执行的操作:把DST中由SRC中指定位的值送往CF,并将DST中该位的值置1位测试并置0指令BTR DST,SRC执行的操作:把DST中由SRC中指定位的值送往CF,并将DST中该位的值置0位测试并取反指令BTC DST,SRC执行的操作:把DST中由SRC中指定位的值送往CF,并将DST中该位的值取反例BT AX,4指令执行前(AX)=1234H指令执行后(CF)=1,(AX)=1234HBTC AX,4指令执行前(AX)=1224H指令执行后(CF)=0,(AX)=1234H位扫描指令(适用于386+)正向位扫描指令BSF REG,SRC执行的操作:从位0开始自右向左扫描SRC,目的是检索第一个为1的位,如遇到第一个为1的位则将ZF位置0,并把该位的位位置装入目的寄存器;如SRC为0,则将ZF位置1,目的寄存器无定义。反向位扫描指令BSR REG,SRC执行的操作:从最高位开始自左向右扫描SRC,目的是检索第

温馨提示

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

评论

0/150

提交评论