汇编语言第2-3周_第1页
汇编语言第2-3周_第2页
汇编语言第2-3周_第3页
汇编语言第2-3周_第4页
汇编语言第2-3周_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言程序设计主讲:江苏苏汇编语言程序设计1第二、三周大课第二、三周主要内容基本寻址方式指令的种类及格式、指令的运行时间传送类指令:MOV、进出栈,交换、地址传送、类型转换等运算类指令:加法、减法、比较、乘法、除法、十进制调整;逻辑运算:与、或、非、异或、测试、移位等控制转移指令:JMP、Jcc、LOOP等数据定义及存储器分配:DB、DW等简单键盘输入和屏幕显示用的DOS调用指令susujiang@汇编语言程序设计2susujiang@汇编语言程序设计3第3章80x86指令系统主要内容

80x86的寻址方式

程序空间和执行时间

80x86的指令系统susujiang@汇编语言程序设计480x86的寻址方式[标号:]

指令助记符[操作数1[,操作数2]][;注释]指令助记符——标记指令功能的字母符号,对应一条二进制编码的机器指令,又称为操作码操作数——不同的指令可有不同个数的操作数,用逗号分隔

标号——在需要时给指令加上标号(符号地址),以冒号与操作码分隔注释——若要写注释,必须以分号开头一、汇编语言的指令格式操作数通常有三种形式:立即操作数:指令的操作数是立即数,直接出现在指令 中。寄存器操作数:操作数是寄存器的值,指令中使用寄存器名。内存操作数:操作数是某个内存单元的值,指令中给出有效地址EA,段地址在某个段寄存器中。参考:指令助记符表susujiang@汇编语言程序设计7二、寻址方式

80x86的寻址方式

指令中指定操作数或操作数存放位置的方法称为寻址方式。有七种基本的寻址方式:立即寻址寄存器寻址直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址(80386以前只能使用最多16位寄存器)含比例因子的变址寻址方式:

80386以后增加的寻址方式(同时可以使用32位寄存器)比例变址寻址基址比例变址的寻址相对基址比例变址的寻址susujiang@汇编语言程序设计8立即寻址方式寄存器寻址方式直接寻址方式80x86的寻址方式例: MOVAH,80H

MOVECX,12345678H

MOVAX,4576H

; 以上指令中的第二操作数都是立即数注:立即数不能作为指令中的第一操作数例:MOVEAX,EBX

ADDAX,DX

ADDAX,1234H

例:MOVBX,[1234H]

;缺省使用段寄存器DSMOVES:[1000H],AX ;指定用段寄存器ESsusujiang@汇编语言程序设计9寄存器间接寻址方式寄存器相对寻址方式80x86的寻址方式例:MOVBX,[DI] ;EA=(DI), ;PA=(DS)*16+EA若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。指令中给出的8位/16位偏移量用补码表示。计算有效地址时,若偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。例:MOVBX,[SI+100H]

;EA=(SI)+100H ;PA=(DS)*16+EAsusujiang@汇编语言程序设计1080x86的寻址方式基址变址寻址方式相对基址变址寻址方式例: MOVBX,[BX+SI]

或写成:MOVBX,[BX][SI]例: MOVAX,[BX+SI+200H]或写成:MOVAX,200H[BX][SI]

;EA=(BX)+(SI)+200H;PA=(DS)*16+EA若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;若有效地址用BP来指定,则其缺省的段寄存器为SS。;EA=(BX)+(SI);PA=(DS)*16+EAsusujiang@汇编语言程序设计11说明:默认段寄存器取决于基址寄存器;而地址中寄存器的书写顺序决定了 该寄存器是基址还是变址寄存器;显式段寄存器优先。80x86的寻址方式(386以后)指令举例所用的段寄存器MOV

EDX,ES:[EAX*4+200H];显式段寄存器ESMOV

[ESP+EDX*2],AX

;默认段寄存器SSMOV

EBX,GS:[EAX+EDX*2+300H];显式段寄存器GSMOV

EAX,[EBX+EBP];默认段寄存器DSMOV

EBX,[EBP+EBX];默认段寄存器SS比例变址寻址方式基址比例变址的寻址方式相对基址比例变址的寻址方式

例:MOVEBX,[EAX+EDX*4]

例:MOVEBX,[EAX+EDX*2+300H]或MOVEBX,300H[EAX][EDX*2]

例:MOVEBX,[ECX*2]MOVEDX,[EAX*4+200H]susujiang@汇编语言程序设计12

说明:Variable是变量名或变量名±整数表达式。reg为BX、BP、SI、DI。disp可以是常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。base为BX或BP,index为SI或DI。有效地址为各项之和。如disp[base][index]形式,EA=base+index+disp。若使用了BP,则隐含段地址在SS,否则在DS。80x86的寻址方式三、内存操作数形式归纳16位汇编指令中的:

Variable或[Variable] [reg] disp[reg] [base][index] disp[base][index]susujiang@汇编语言程序设计1380x86的寻址方式32位汇编指令中的:

[base] disp[base] [base][index] disp[base][index] [index*n] disp[index*n] [base][index*n] disp[base][index*n]三、内存操作数形式归纳说明:base、index为任一32位通用寄存器(index不能取ESP)。n为比例因子,取1、2、4或8。若包含base且base为EBP或ESP,则隐含段地址在SS;否则,隐含段地址在DS。若在16位CPU上编程,则不能使用这些寻址方式。susujiang@汇编语言程序设计14第3章80x86指令系统主要内容

80x86的寻址方式

程序空间和执行时间

80x86的指令系统susujiang@汇编语言程序设计15程序占有的空间和执行时间汇编语言程序设计通常需要考虑程序占用的空间,因为不同的指令所对应的机器指令的长度不同,各条指令占用的字节数不同,程序量越大所需的存储空间也越大。汇编语言程序设计还需要考虑程序的执行时间,这是因为不同的指令或不同的寻址方式在取操作数或存放运算结果时所需要的时间长短不同。完成同样功能的不同的程序可能在存储空间和执行时间上有很大的差别。如果对程序所占有的存储空间或对程序执行的时间有很高的要求,则必须仔细斟酌程序的算法和指令的选用。susujiang@汇编语言程序设计16指令的语法举例周期数ADCreg,regadcdx,cx1ADCmem,regadcwordptrm16[2],dx3ADCreg,memadcdx,dwordptrm32[2]2ADDreg,regaddax,bx1ADDmem,regaddtotal,cx3ADDreg,memaddcx,incr2ADDreg,immedaddbx,61ADDmem,immedaddpointers[bx][si],63ADDaccum,immedaddax,101INCregincbx1INCmemincvpage3XADDreg,regxadddl,al3XADDmem,regxaddstring,bl4susujiang@汇编语言程序设计17指令的语法举例周期数ANDreg,reganddx,bx1ANDmem,regandbitmask,bx3ANDreg,memandbx,masker2ANDreg,immedanddx,0F7h1ANDmem,immedandmasker,100lb3ANDaccum,immedandax,0B6h1指令的语法举例周期数ROLreg,1rolax,11ROLmem,1rolbits,13ROLreg,CLrolax,cl4ROLmem,CLrolcolor,cl4ROLreg,immed8rolax,131ROLmem,immed8rolbyteptr[bx],103susujiang@汇编语言程序设计18第3章80x86指令系统主要内容

80x86的寻址方式

程序空间和执行时间

80x86的指令系统susujiang@汇编语言程序设计1980x86的指令系统数据传送指令算术指令逻辑指令控制转移指令串处理指令处理器指令学习要求: 了解指令的功能,有效、准确地运用指令。注意点: 指令所要求的操作数及其寻址方式 指令对标志位的影响、标志位对指令的影响 指令的执行时间指令的分类susujiang@汇编语言程序设计20数据传送指令通用数据传送指令累加器专用传送指令

地址传送指令标志寄存器传送指令类型转换指令包括:传送、传送-扩展指令 进栈、出栈指令 交换指令包括:输入、输出指令 换码指令包括:有效地址传送指令 指针送寄存器指令包括:标志寄存器存取到AH

标志寄存器存取堆栈包括:字节转换为字 字转换为双字 双字转换为4字 字节交换汇编语言程序设计21数据传送指令一、通用数据传送指令1.MOV(来自Move):传送指令一般形式:

MOV dst,src ;(dst)←(src),将源操作数src复制到目的操作 数dst,src不变。说明:两个操作数的数据类型要相同,要同为8位、16位或32位;两个操作数不能同时为段寄存器;代码段寄存器CS不能为目的操作数,但可作为源操作数;指令指针IP不能作为MOV指令的操作数;立即数不能作为目的操作数;立即数不能直接传给段寄存器;两个操作数不能同时为存储单元。对标志位无影响。susujiang@汇编语言程序设计228位通用寄存器8个:AL、AH、BL、BH、CL、CH、DL、DH。16位通用寄存器8个:AX、BX、CX、DX、SI、DI、BP、SP。32位通用寄存器8个:EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP。数据传送指令susujiang@汇编语言程序设计23指令的语法格式指令举例周期数MOVreg,regMOVBP,SP1MOVmem,regMOVARRAY[DI],BX1MOVreg,memMOVBX,pointer1MOVmem,immMOV[BX],151MOVreg,immMOVCX,2561MOVmem,accumMOVtotal,AX1MOVaccum,memMOVAL,string1MOVsegreg,reg16MOVDS,AX2,3MOVsegreg,mem16MOVES,psp2,3MOVreg16,segregMOVAX,DS1MOVmem16,segregMOVstack_save,SS1数据传送指令注:

Reg—Register(通用寄存器),

Mem—Memory(存储器),

Imm—Immediate(立即数), 它们可以是8位、16位或32位(特别指出其位数的除外)。segreg—Segmentregister(段寄存器),accum—Accumulator(累加器)。susujiang@汇编语言程序设计24数据传送指令(386新增)MOVSX(MovewithSign-extend)一般形式:

MOVSX dst,src ;src符号扩展为dst;386新增语法格式:

MOVSX reg16,reg8/mem8 MOVSX reg32,reg8/mem8/reg16/mem16功能描述:将8位数符号扩展为16位或32位数,或者将16位数符号扩展为 32位数。对标志位无影响。2.传送-扩展指令MOVZX(MovewithZero-extend)一般形式:

MOVZX dst,src ;src零扩展为dst;386新增语法格式:

MOVZX reg16,reg8/mem8 MOVZX reg32,reg8/mem8/reg16/mem16对标志位无影响。susujiang@汇编语言程序设计25数据传送指令3.进栈指令PUSH(Pushontothestack)一般形式: PUSHreg/mem/seg/imm功能描述:PUSH16位操作数时:

SP=SP-2 SS:[SP]指向16位操作数PUSH32位操作数时:

SP=SP-4 SS:[SP]指向32位操作数指令的语法举例周期数PUSHregPUSHDX1PUSHmemPUSH[DI]2PUSHsegregPUSHES1PUSHimmPUSH150001PUSHAPUSHA5PUSHADPUSHAD5

以上指令均对标志位无影响。susujiang@汇编语言程序设计26PUSHA(PushAllGeneralRegisters)指令格式:PUSHA

;80286+其功能是依次把寄存器AX、CX、DX、BX、SP、BP、SI和DI等压栈。PUSHAD(PushAll32-bitGeneralRegisters)指令格式:PUSHAD

;80386+其功能是把寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI等压栈。数据传送指令

susujiang@汇编语言程序设计27数据传送指令指令的语法举例周期数POPregPOPCX1POPmemPOPparam3POPsegregPOPES3POPAPOPA5POPADPOPAD54.出栈指令

POP(Popfromthestack)一般形式: POPreg/mem/seg功能描述:

POP16位操作数时:

16位操作数←SS:[SP],

SP=SP+2 POP32位操作数时:

32位操作数←SS:[SP],

SP=SP+4

以上指令均对标志位无影响。susujiang@汇编语言程序设计28POPA(PopAllGeneralRegisters)指令格式:POPA

;80286+

其功能是依次把寄存器DI、SI、BP、SP、BX、DX、CX和AX等弹出栈。程序员不用记住它们的具体顺序,只要与指令PUSHA对称使用即可。POPAD(PopAll32-bitGeneralRegisters)指令格式:POPAD

;80386+

其功能是依次把寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX等弹出栈,它应该与PUSHAD对称使用。数据传送指令susujiang@汇编语言程序设计29数据传送指令例1:设SP=100H,EBX=12345678H,给出下列指令依次执行后的结果。

PUSH BX ;SS:[00FFH]=56H

;SS:[00FEH]=78H,SP=0FEH POP AX ;AX=5678H,SP=100H PUSH EBX ;SS:[00FEH]=34H

;SS:[00FFH]=12H

;SS:[00FCH]=78H

;SS:[00FDH]=56H,SP=0FCH POP AX ;AX=5678H,SP=0FEH POP DX ;DX=1234H,SP=100H

例2:利用进栈和出栈指令交换AX与CX的值。

PUSH AX PUSH CX POP AX POP CXsusujiang@汇编语言程序设计30堆栈的特点80x86系统的堆栈具有如下特点:堆栈是在内存中专门指定的某一段为堆栈段,具有“先进后出”的特点。堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底指向同一内存单元。堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反。堆栈操作只能以字或双字为单位。堆栈指针SP/ESP(地址长度为32位时使用ESP作为堆栈指针)总是指向栈顶。susujiang@汇编语言程序设计31数据传送指令5.XCHG(Exchange)交换指令一般形式:

XCHG oprd1,oprd2

;交换oprd1与oprd2的内容功能说明:对标志位无影响。

oprd1与oprd2不能都是内存操作数。

oprd1与oprd2类型必须匹配。指令的语法举例周期数XCHGreg,regXCHGCX,DX3XCHGreg,memXCHGEBX,[EBP][EAX*4],3XCHGmem,regXCHG[BX],AX3XCHGaccum,regXCHGEAX,ECX2XCHGreg,accumXCHGCX,AX2例: 已知EBX=12345678H,EDX=11223344H

执行指令 XCHG EBX,EDX后 得EBX=11223344H,EDX=12345678H

已知单元2300H和2301H内容为30H和40H,DX=5678H

执行指令 XCHG [2300H],DX后 得2300H和2301H内容为78H和56H,DX=4030Hsusujiang@汇编语言程序设计32数据传送指令二、累加器专用传送指令

IN(Input)输入指令一般形式: IN

AL/AX/EAX,PortNo/DX功能说明: 该指令的作用是从端口中读入一个字节或字或双字,并保存在寄存器AL或AX或EAX中。如果某输入设备的端口地址在0~255范围之内,可在指令中直接给出PortNo,否则要把该端口地址先存入寄存器DX中。

OUT(Output)输出指令一般形式: OUT

PortNo/DX,AL/AX/EAX功能说明: 把寄存器AL或AX或EAX的内容输出到指定端口。例:

INAL,20H ;从端口20读入1个字节的内容,传送到累加器AL。

INAL,DX ;DX需预先赋值,从指定端口传送一个字节到AL。

OUT28H,AX ;从AX输出一个字的内容到端口28H和29H。以上指令均对标志位无影响。susujiang@汇编语言程序设计33数据传送指令XLAT(Translate)换码指令一般形式:

XLAT ;AL←(DS:[BX/EBX+AL])功能说明:将DS:BX所指内存区中、由AL指定位移处的一个字节赋给AL。对标志位无影响。当需要进行代码转换时,可预先建立相应的表格,把字节表格首地址存入BX或EBX,执行指令就将对应下标为AL的存储单元的内容传送给AL;注意表格长度不超过256字节。 例:把字母转换成其它代码产生加密码。 把数字0-9转换成七段数码管代码。 把ASCII字符转换成可以运算的数等。susujiang@汇编语言程序设计34例:把AL中的十六进制数字转换成七段数码管代码用于显示。已知:DS=1200H,BX=0300H根据AL的值,可以取到相应的显示代码。若指令执行前:AL=05H执行指令 XLAT12300H3FH12301H06H12302H5BH12303H4FH12304H66H12305H6DH12306H7DH12307H07H12308H7FH12309H6FH1230AH77H1230BH7CH1230CH39H1230DH5EH1230EH79H1230FH71H指令执行后:AL=6DHDS 12000BX 0300AL+05PA 12305数据传送指令—换码指令汇编语言程序设计35数据传送指令三、地址传送指令LEA(LoadEffectiveAddress)有效地址装入指令 一般形式:

LEA reg,mem ;reg←mem的有效地址 功能说明:把一个内存变量的有效地址送给指定的寄存器(此处reg不能使用段寄存器)。当reg长度大于地址长度时,将地址零扩展后存入reg; 当reg长度小于地址长度时,截取地址的低16位存入reg。该指令通常用来对指针或变址寄存器BX、DI或SI等置初值之用。对标志位无影响。例:设BX=5678H,EAX=00002345H,

EDX=00001111H。

LEA SI,2[BX] ;执行后,SI=567AH LEA SI,2[EAX][EDX] ;执行后,SI=3458Hsusujiang@汇编语言程序设计36段寄存器装入指令1: LDS(LoadDataSegmentRegister) LES(LoadExtraSegmentRegister)LFS(LoadExtraSegmentRegister)LGS(LoadExtraSegmentRegister)LSS(LoadStackSegmentRegister)

指令格式:

LDS Reg,Mem ;reg16←(mem),DS←(mem+2) LES Reg,Mem ;reg16←(mem),ES←(mem+2) LFS Reg,Mem ;reg16←(mem),FS←(mem+2);80386+ LGS Reg,Mem ;reg16←(mem),GS←(mem+2);80386+ LSS Reg,Mem ;reg16←(mem),SS←(mem+2);80386+功能说明1: 该组指令的功能是把存贮单元的一个“低字”传送给指令中指定的16位寄存器,把随后的一个“高字”传给相应的段寄存器;susujiang@汇编语言程序设计37功能说明2: 当指定的Reg是32位时,要从低地址为mem开始的4个字节中的内容给32位寄存器,再将低地址为mem+4开始的“字”内容送段寄存器; 该类指令 对标志位无影响。指令格式:

LDS Reg32,Mem ;reg32←(mem),DS←(mem+4) LES Reg32,Mem ;reg32←(mem),ES←(mem+4) LFS Reg32,Mem ;reg32←(mem),FS←(mem+4) LGS Reg32,Mem ;reg32←(mem),GS←(mem+4) LSSReg32,Mem ;reg32←(mem),SS←(mem+4)段寄存器装入指令2: susujiang@汇编语言程序设计38数据传送指令LAHF(LoadAHfromFlags)标志寄存器送累加器指令指令形式: LAHF ;AH←FLAGS的低8位 对标志位无影响。SAHF(StoreAHintoFlags)累加器送标志寄存器指令指令形式: SAHF ;FLAGS的低8位←AH

对标志位的影响:由新装入值确定。四、标志寄存器传送指令 共有四条与标志寄存器相关的指令。1514131211109876543210

OFDFIFTFSFZF

AF

PF

CFsusujiang@汇编语言程序设计39PUSHF(PushFlagsontoStack)标志寄存器进栈指令指令形式:

PUSHF ;SP=SP-2,FLAGS进栈

PUSHFD ;SP=SP-4,EFLAGS进栈;80386+对标志位的影响:PUSHFD清除VM和RF位。POPF(PopFlagsoffStack)标志寄存器出栈指令指令形式:

POPF ;栈顶字出栈到FLAGS,SP=SP+2 POPFD ;栈顶双字出栈到EFLAGS, SP=SP+4;80386+对标志位的影响:POPF/POPFD指令会以弹出值设置标志寄存器。数据传送指令susujiang@汇编语言程序设计40数据传送指令CBW、CWD、CWDE与CDQ 扩展指令 一般形式:

CBW ;AL符号扩展为AX CWD ;AX符号扩展为32位数DX:AX CWDE ;AX符号扩展为EAX;386新增

CDQ ;EAX符号扩展为64位数EDX:EAX;386新增例:设AL=0FEH,给出依次执行下列指令后的结果。

CBW ;AX=0FFFEH CWD ;DX=0FFFFH,AX不变,即DX:AX=-2 CWDE ;EAX=0FFFFFFFEH(-2)

CDQ ;EDX=0FFFFFFFFH,EAX不变, 即EDX:EAX=-2五、类型转换指令susujiang@汇编语言程序设计41BSWAP(Byteswap) 字节交换指令一般形式:

BSWAPreg32 ;只用于486及后续机型,将32位寄存器的字节次序变反。例: 指令执行前EAX=12345678H

指令 BSWAPEAX

执行后EAX=78563412H注:CBW和CWDE的功能可由MOVSX指令实现。

MOVSX AX,AL ;等价于CBW MOVSX EAX,AX ;等价于CWDE MOVSX EAX,AL ;等价于顺序执行CBW与CWDE数据传送指令susujiang@汇编语言程序设计42算术指令

包括二进制运算和十进制运算指令,有双操作数指令也有单操作数指令。加法指令减法指令乘法指令除法指令十进制调整指令指令的分类数据传送指令算术指令逻辑及位操作指令控制转移指令串处理指令处理器指令

susujiang@汇编语言程序设计43算术指令一、加法指令1ADD(AddBinaryNumbers)加法指令指令格式:

ADD

Reg/Mem,Reg/Mem/Imm ;(dst)←(dst)+(src)指令功能:把源操作数的值加到目的操作数中。受影响标志位:CF、PF、AF、ZF、SF和OF。ADC(AddWithCarry)带进位加指令指令格式:

ADC

Reg/Mem,Reg/Mem/Imm ;(dst)←(dst)+(src)+CF指令功能:把源操作数和进位标志位CF的值(0/1)一起加到目的操作数中。受影响标志位:CF、PF、AF、ZF、SF和OF。susujiang@汇编语言程序设计44INC(Incrementby1)加1指令指令格式:

INC

Reg/Mem ;(dst)←(dst)+1指令功能:把操作数的值加1。受影响标志位:PF、AF、ZF、SF和OF,不影响CF。XADD(ExchangeandAdd)交换加指令指令格式:

XADD

Reg/Mem,Reg

;80486+指令功能:先交换两个操作数的值,再进行算术加法操作。受影响标志位:CF、PF、AF、ZF、SF和OF。一、加法指令2算术指令susujiang@汇编语言程序设计45算术指令方法1:用16位寄存器编写程序MOVAX,wordptrd1;由于d1是双字类型,必须使用强制类型说明符MOVDX,wordptrd1+2;(DX,AX)构成一个32位数据ADDAX,wordptrd2;低字相加ADCDX,wordptrd2+2;高字相加。在低字相加时,有可能会产生“进位”MOVwordptrd1,AX;低字送给d1的低字MOVwordptrd1+2,DX;高字送给d1的高字方法2:用32位寄存器编写程序MOVEAX,d1ADDEAX,d2MOVd1,EAX例: 已知有二个32位数d1和d2(预先定义过),编写程序片段把d2的 值加到d1中。

d1DD12345678H d2DD22221111H……

……

……susujiang@汇编语言程序设计46算术指令二、减法类指令1SUB(SubtractBinaryValues)减法指令指令格式:

SUB

Reg/Mem,Reg/Mem/Imm;(dst)←(dst)-(src)指令功能:从目的操作数中减去源操作数。受影响标志位:CF、PF、AF、ZF、SF和OF。

SBB(SubtractwithBorrow)带借位减指令指令格式:

SBB

Reg/Mem,Reg/Mem/Imm;(dst)←(dst)-(src)-CF

指令功能:把源操作数和标志位CF的值从目的操作数中一起 减去。受影响标志位:CF、PF、AF、ZF、SF和OF。susujiang@汇编语言程序设计47DEC(Decrementby1)减1指令指令格式:

DEC

Reg/Mem

指令功能:把操作数的值减去1。受影响标志位:PF、AF、ZF、SF和OF,不影响CF。

NEG(Negate)求补指令指令格式:

NEG

Reg/Mem

指令功能:操作数=0-操作数,即改变操作数的正负号。受影响标志位:CF、PF、AF、ZF、SF和OF。二、减法类指令2算术指令susujiang@汇编语言程序设计4862A0 01100010101000009D60 + 1001110101100000 0000000000000000

CF←

1算术指令例1:已知AX=62A0H,BX=9D60H,

ADDAX,BX ;AX=0000H

ZF=1,SF=0,OF=0 例2:已知CX=4AE0,DX=0EA04H SUBDX,CX ;DX=9F24H

ZF=0,SF=1,OF=0注意减法设置CF的规则:

有借位CF为1,无借位CF为0。二进制补码运算时,加出结果的进位要取反: 有进位CF=0,无进位CF=1。 EA04 11101010000001004AE0-0100101011100000

↓ 1001111100100100

CF←0 EA04 1110101000000100+[-4AE0]补+1011010100100000 1001111100100100

CF←0←1

借位←进位取反susujiang@汇编语言程序设计49算术指令CMP(Compare)比较指令指令格式:CMP

Reg/Mem,Reg/Mem/Imm指令功能:用第一个操作数减第二个操作数,并根据所得的差设置有关 标志位。与SUB的区别在于不将减法结果存入dst。受影响标志位:CF、PF、AF、ZF、SF和OF。

CMPXCHG(CompareAndExchange)8/16/32位比较交换指令指令格式:CMPXCHG

Reg/Mem,AL/AX/EAX

;80486+

指令功能:计算acc–dst,ifZF=0则acc←dst。受影响标志位:CF、PF、AF、ZF、SF和OF。

CMPXCHG8B(CompareAndExchange)64位比较交换指令指令格式:CMPXCHG8B

Reg/Mem

;Pentium+

指令功能:该指令只有一个操作数,第二个操作数EDX:EAX是隐含的。 计算EDX:EAX-dst

受影响的标志位:ZF。二、减法类指令3--数值比较指令:susujiang@汇编语言程序设计50算术指令三、乘法指令1MUL(UnsignedMultiply)无符号数乘法指令指令格式: MUL

Reg/Mem ;accE←acc×src

指令功能:把显式操作数和隐含操作数(都作为无符号数)相 乘,所得的乘积如表中对应关系存放。受影响标志位:若结果的高一半为0,则CF=OF=0,否则 CF=OF=1;其余标志无定义。(虽然OF=1,因为没有超 出accE的位数,故运算结果是正确的。)

乘数位数隐含的被乘数acc指令举例乘积的存放位置accE8位ALMUL

BLIMULBLAX←AL*BL16位AXMUL

BXIMULBXDX-AX

←AX*BX32位EAXMUL

ECXIMULECXEDX-EAX

←EAX*ECXsusujiang@汇编语言程序设计51例:设AL=0FFH,BL=1,分别执行MUL与IMUL指令,会得到不同结果。

MUL BL ;AX=0FFH(255),无符号数运算

IMUL BL ;执行前AL为-1,执行后AX=0FFFFHIMUL(SignedIntegerMultiply)有符号数乘法指令指令格式: IMUL

Reg/Mem ;accE←acc×src指令功能:把显式操作数和隐含操作数(都作为有符号数)相 乘,乘积如前表所示存放。受影响标志位:若结果的高一半为低一半的符号扩展,则CF=

OF=0,否则,CF=OF=1;其余标志无定义。算术指令三、乘法指令2susujiang@汇编语言程序设计52算术指令IMUL(SignedIntegerMultiply)扩展的有符号数乘法指令IMULReg,Imm;80286+,Reg←Reg×ImmIMULReg1,Reg2/Mem;80386+,Reg1←Reg1×Reg2

Reg1←Reg1×Mem

IMULReg1,Reg2/Mem,Imm;80286+,Reg1←Reg2×Imm

Reg1←Mem×Imm指令格式:说明:各操作数的位数要一致。如果乘积超过目标寄存器所能存储的范围,则系统将置溢出标志OF为1,其余无定义。例: IMULBX,0FFFEH ;若执行前BX=-1,则执行后BX=2 IMULEAX,EBX ;EAX=EAX*EBX IMULDX,tab01 ;DX=DX*(tab01) IMULEBX,array[ESI*4],7 ;EBX=([DS*16+array+ESI*4])*7三、乘法指令3susujiang@汇编语言程序设计53算术指令四、除法指令DIV(UnsignedDivide)无符号数除法指令指令格式: DIV

Reg/Mem 指令功能:用显式操作数去除隐含操作数(都作为无符号数),所得商和余数如表所示存放。指令对标志位的影响无定义。IDIV(SignedIntegerDivide)有符号数除法指令指令格式: IDIV

Reg/Mem指令功能:用显式操作数去除隐含操作数(都作为有符号数),所得商和余数的对应关系见下表。对标志位的影响无定义。除数位数隐含的被除数商余数指令举例8位AXALAHDIV

BHIDIVnum116位DX-AXAXDXDIV

BXIDIV[bx]32位EDX-EAXEAXEDXDIV

ECXIDIVebxsusujiang@汇编语言程序设计54算术指令例:计算四则运算(C-120+A*B)/CADW

?;数据定义段BDW

?;全部为有符号数CDW

?XDW

?;存放结果商YDW

?;存放结果余数…MOVAX,CSUBAX,120D;也可以用指令“ADDAX,-120D”CWD;扩展成32位,为了与乘积相加MOVCX,DX;(CX,BX)←(DX,AX),MOVBX,AX;调度寄存器,为作乘法准备必要的寄存器MOVAX,AIMULB;(DX,AX)←A*BADDAX,BX;计算32位二进制之和,为作除法作准备ADCDX,CXIDIVC;AX是商,DX是余数MOVX,AX;分别保存商和余数到指定的字变量单元里MOVY,DXsusujiang@汇编语言程序设计55算术指令五、十进制调整指令DAA(DecimalAdjustAfterAddition)十进制数加法调整指令指令格式:

DAA ;AL调整后,得到的结果还是压缩型BCD码。

受影响标志位:AF、CF、PF、SF和ZF(OF无定义)调整规则:如果AL的低四位大于9,或标志位AF=1,那么,AL=AL+6,并置AF=1如果AL的高四位大于9,或CF=1,那么,AL=AL+60H,并置CF=1;如果以上两点都不成立,则,清除标志位AF和CF。1.压缩BCD码调整指令—加法调整susujiang@汇编语言程序设计56DAS(DecimalAdjustAfterSubtraction)十进制数减法调整指令指令格式:

DAS ;AL调整后,得到的结果还是压缩型BCD码。受影响标志位:AF、CF、PF、SF和ZF(OF无定义)调整规则:如果AL的低四位大于9,或标志位AF=1,那么,AL=AL-6,并置AF=1;如果AL的高四位大于9,或CF=1,那么,

AL=AL-60H,并置CF=1;如果以上两点都不成立,则,清除标志位AF和CF。五、十进制调整指令1.压缩BCD码调整指令—减法调整算术指令susujiang@汇编语言程序设计57算术指令例1:压缩BCD加法后的调整MOV

AL,43H ;假定要做十进制运算 MOV

BL,29H ;ADD

AL,BL

;AL=6CH,不是压缩型的BCD码,因为“C”DAA

;调整后,AL=72H,这是压缩型的BCD码, 因为:43+29=72例2:压缩BCD减法后的调整MOV

AL,43H

MOV

BL,29H

SUB

AL,BL

;AL=1AH,不是压缩型的BCD码,因为“A”

DAS

;调整后,AL=14H,这是压缩型的BCD码, 因为:43-29=14说明:标志位OF不确定;CF反映压缩BCD码相加/相减的进位/借位状态;按一般规则影响SF和ZF。若使用DAA/DAS指令,则参加加法/减法运算的操作数应该是压缩BCD码。如果将任意2个二进制数相加/减,然后调整,将得不到正确结果。susujiang@汇编语言程序设计58算术指令AAA(ASCIIAdjustAfterAddition)ASCII码加法调整指令指令格式:AAA ;调整AL的低四位,清除高四位,进位加至AH。受影响的标志位:AF和CF(OF、PF、SF和ZF等无定义)。调整规则:AAS(ASCIIAdjustAfterSubtraction)ASCII码减法调整指令指令格式:AAS ;调整AL的低四位、清除高四位,从AH减去借位。

受影响的标志位:AF和CF(OF、PF、SF和ZF等无定义)。调整规则:2.非压缩BCD码调整指令*susujiang@汇编语言程序设计59算术指令例3*:编写一段程序,完成二个15位十进制数X和Y之和,并把计算结果存入X之中。假设数据X和Y都是以字符串形式表示的。…Xdb

"456407983123186";任意假设二个15位的大数Ydb

"326676709587211"…CLCMOVSI,14;用变址寄存器SI来从字符串的后面向前访问MOVCX,15;因为它们是二个15位十进制数loop1:MOVAL,X[SI]ADCAL,Y[SI];把被加数加上AAAMOVX[SI],ALDECSILOOPloop1;15位十进制数相加完毕LEABX,X;下面5条指令是把X中的数据变成对应的字符MOVCX,15loop2:ADDbyteptr[BX],'0'INCBXLOOPloop2…susujiang@汇编语言程序设计60算术指令AAM(ASCIIAdjustAfterMultiplication)乘法调整指令指令格式: AAM

受影响标志位:PF、SF和ZF(AF、CF和OF等都是无定义)功能描述:该指令是用于调整寄存器AL之值,该值是由二个 单BCD码字节用无符号乘指令MUL所得的积。调整规则:AH←AXdiv10(商),AL←AXmod10(余数)例4:乘法调整MOV

AL,9

MOV

BL,8

MUL

BL

;AL=72D

AAM

;AH=7,AL=2susujiang@汇编语言程序设计61AAD(ASCIIAdjustbeforeDivision)ASCII码除法调整指令指令格式: AAD

受影响标志位:PF、SF和ZF(AF、CF和OF等都是无定义)功能描述:该指令是在作除法前用于调整寄存器AH和AL之值,它是把二个寄存器中单BCD码组成一个十进制数值,为下面的除法作准备的。调整规则:AL←AH*10+AL,AH←0例5:除法前调整

MOV

AX,0502H

MOV

BL,10D

AAD

;AH=0,AL=52D

DIV

BL

;AH=2(余数),AL=5(商)算术指令susujiang@汇编语言程序设计6280x86的指令系统数据传送指令算术指令逻辑及位操作指令控制转移指令串处理指令处理器指令

指令的分类一、逻辑运算指令二、位测试指令三、位扫描指令四、移位指令五、标志位处理指令susujiang@汇编语言程序设计63逻辑及位操作指令一般形式:

AND dst,src ;dst←dst∧src OR dst,src ;dst←dst∨src XOR dst,src ;dst←dst⊕src NOT dst ;dst←¬

dst TEST dst,src ;dst∧src,执行AND操作但不存储结果到dst。语法格式:

AND reg/mem,reg/mem/imm OR reg/mem,reg/mem/imm XOR reg/mem,reg/mem/imm NOT reg/mem TEST reg/mem,reg/mem/imm 说明: 以上指令均对操作数按位进行二进制逻辑运算,其中NOT指令不影响标志位;其它指令根据结果设置标志位PF、SF和ZF,AF无定义,CF和OF为0。通常在这些指令后使用条件转移指令来控制程序的执行顺序。一、逻辑运算指令

逻辑运算的作用可以屏蔽某些位,使某些位内容清0;可以置某些位为1;可以使某些位变反;XOR还可以判断两个操作数是否相等;可以测试某些位是否为0;susujiang@汇编语言程序设计64逻辑及位操作指令例1:已知(BH)=67H,要求把其的第0、1和5位置为0。

ANDBH,0DCH ;SF=0,PF=1,ZF=0例2:已知(BL)=46H,要求把其的第1、3、4和6位置为1。

ORBL,5AH ;SF=0,PF=0,ZF=0例3:已知(AL)=46H,执行指令“NOT

AL”后,

AL的值是什么?

NOT

AL ;AL=0B9H例4:已知(AH)=46H,要求把其的第0、2、5和7位的 二进制值变反。

XOR

AH,0A5H ;SF=1,PF=0,ZF=0例5: TEST

AX,1

;测试AX的第0位

TEST

CL,10101B

;测试CL的第0、2、4位01000100susujiang@汇编语言程序设计65逻辑及位操作指令BT(BitTest)位测试BTS(BitTestandSet)位测试并置位BTR(BitTestandReset)位测试并复位BTC(BitTestandComplement)位测试并取反一般形式:

BT dst,index ;CF←

dst的第index位,dst不变

BTS dst,index ;CF←dst的第index位,dst的第index位=1 BTR dst,index ;CF←

dst的第index位,dst的第index位=0 BTC dst,index ;CF←dst的第index位,dst的第index位取反说明:这些指令均为386新增指令。 其中dst可以是Reg/Mem,index只能是Reg/Imm。二、位测试指令例1:假设(AX)=1234H,分别执行下面指令。BT

AX,2

;指令执行后,CF=1,(AX)=1234h

BTS

AX,14

;指令执行后,CF=0,(AX)=5234h

BTR

AX,9

;指令执行后,CF=1,(AX)=1034hBTC

AX,6

;指令执行后,CF=0,(AX)=1274h例2: BTSEAX,16 ;测试EAX的第16位,并置为1。

BTCtab01,7 ;测试内存单元的第7位,并取反。0001001000110100

↑14↑9↑6↑2CFsusujiang@汇编语言程序设计66逻辑及位操作指令三、位扫描指令BSF(BitScanforward)正向位扫描指令BSR(BitScanreverse)反向位扫描指令指令格式:

BSF

Reg,Reg/Mem

;从右向左扫描,即:从低位向高位扫描

BSR

Reg,Reg/Mem

;从左向右扫描,即:从高位向低位扫描受影响的标志位:ZF说明:

是80386以后的指令。位扫描指令是在第二个操作数中找第一个“1”的位置。如果找到,则该“1”的位置保存在第一操作数中,并置标志位ZF为0,否则,置标志位ZF为1。例1:MOV

AX,1234H

BSF

CX,AX

;指令执行后,(CX)=2,ZF=0

BSR

CX,AX

;指令执行后,(CX)=12,ZF=0例2:MOVEAX,60000000H BSFECX,EAX ;执行后,ECX=29D,ZF=0 BSREDX,EAX ;执行后,EDX=30D,ZF=0susujiang@汇编语言程序设计67逻辑及位操作指令

1.移位指令

SHL(ShiftLogicalLeft)逻辑左移

SAL(ShiftArithmeticLeft)算术左移

SHR(ShiftLogicalRight)逻辑右移

SAR(ShiftArithmeticRight)算术右移一般形式:

SHL dst,count ;dst左移。count为移位次数(下同)

SAL dst,count ;同SHL,最高位移出到CF,最低位移入0 SHR dst,count ;dst逻辑右移,最低位移入CF,最高位移入0 SAR dst,count ;dst算术右移,最低位移入CF,最高位不变。语法格式:

SHL reg/mem,CL/imm8 ;imm8表示8位立即数范围0~31。

SAL、SHR与SAR格式同SHL说明:指令SHL与SAL完全相同,只是同一指令的不同助记符而已。

可用CL来指出要移位的次数;8086中只能用CL或立即数1。对标志位的影响:若移位后符号位发生了变化,则OF=1,否则OF=0;CF为最后移入位; 按一般规则影响ZF与SF;AF无定义。四、移位指令susujiang@汇编语言程序设计68逻辑及位操作指令操作数的初值执行的指令执行后操作数的内容(AH)=12HSAL

AH,1(AH)=24H(BL)=0A9HSAL

BL,1(BL)=52H(AH)=12HSAR

AH,1(AH)=09H(BL)=0A9HSAR

BL,1(BL)=0D4H例:设AX的值为一个2字节非压缩BCD码,将其转换为1字节压缩BCD码存入AL。

MOV CL,4 SHL AH,CL ;AH低4位移到高4位

AND AL,0FH ;AL高4位清0 OR AL,AH 例:(AH)=12HSHR

AH,1(AH)=09H(BL)=0A9HSHR

BL,1(BL)=54Hsusujiang@汇编语言程序设计69逻辑及位操作指令2.循环移位指令

ROL(RotateLeft)循环左移

ROR(RotateRight)循环右移

RCL(RotateLeftthroughCarry)带进位循环左移

RCR(RotateRightthroughCarry)带进位循环右移一般形式:

ROL dst,count ;dst循环左移,最高位移出到CF,并同时移入最低位。

ROR dst,count ;dst循环右移,最低位移出到CF,并同时移入最高位。

RCL dst,count ;dst带CF循环左移,最高位移出到CF,原CF移入最低位。

RCR dst,count ;dst带CF循环右移,最低位移出到CF,原CF移入最高位。语法格式:

ROL reg/mem,CL/imm8 ;ROR、RCL、RCR格式同ROL对标志位的影响: 若移位后符号位发生了变化,则OF=1,否则OF=0;若移位次数>1, 则OF无定义。CF为最后移入位;不影响ZF与SF;AF无定义。susujiang@汇编语言程序设计70逻辑及位操作指令循环移位指令指令操作数的初值指令执行后的结果ROL

AX,1(AX)=6789H(AX)=0CF12HROL

AX,3(AX)=6789H(AX)=3C4BHROR

AX,2(AX)=6789H(AX)=59E2HROR

AX,4(AX)=6789H(AX)=9678H例1:将DX:AX中的32位数左移1位。

SHL AX,1 RCL DX,1例2:例3:带进位循环移位指令指令操作数的初值指令执行后的结果RCL

AX,1CF=0,(AX)=0ABCDH(AX)=579AHRCL

AX,1CF=1,(AX)=0ABCDH(AX)=579BHRCR

AX,2CF=0,(AX)=0ABCDH(AX)=AAF3HRCR

AX,2CF=1,(AX)=0ABCDH(AX)=EAF3Hsusujiang@汇编语言程序设计71逻辑及位操作指令3.双精度移位指令SHLD(ShiftLeftDouble)双精度左移SHRD(ShiftRightDouble)双精度右移指令格式:

SHLD

Reg/Mem,Reg,CL/Imm

;80386+ SHRD

Reg/Mem,Reg,CL/Imm

;80386+说明:第一操作数是一个16位/32位的寄存器或存储单元;第二操作数(与前者具 有相同位数)一定是寄存器,提供补充位,本身不变化;第三操作数是移 动的位数,它可由CL或一个立即数来确定。双精度移位指令指令操作数的初值指令执行后的结果SHLD

AX,BX,1(AX)=1234H,(BX)=8765H(AX)=2469HSHLD

AX,BX,3(AX)=1234H,(BX)=8765H(AX)=91A4HSHRD

AX,BX,2(AX)=1234H,(BX)=8765H(AX)=448DHSHRD

AX,BX,4(AX)=1234H,(BX)=8765H(AX)=5123H受影响的标志位:CF、PF、SF和ZF;移位1次时若符号位有变化则OF=1, 否则OF=0,当移位次数>1时OF无定义;AF无定义。susujiang@汇编语言程序设计72标志位处理指令CLC(ClearCarryFlag)进位标志清除指令STC(SetCarryFlag)进位标志置1指令CMC(ComplementCarryFlag)进位标志取反指令CLD(ClearDirectionFlag)方向标志清除指令STD(SetDirectionFlag)方向标志置1指令CLI(ClearInterruptFlag)关中断指令STI(SetInterruptFlag)开中断指令指令格式:

CLC ;CF=0 STC ;CF=1 CMC ;CF=¬CF CLD ;DF=0 STD ;DF=1 CLI ;IF=0 STI ;IF=1对标志位的影响:只影响指定标志。注意:在程序中应慎重使用CLI指令,错误的使用会导致系统无法正常工作。susujiang@汇编语言程序设计7380x86的指令系统数据传送指令算术指令逻辑及位操作指令控制转移指令

串处理指令处理器指令susujiang@汇编语言程序设计74控制转移指令用于控制程序的执行顺序和执行流程的指令:无条件转移指令条件转移指令条件设置指令循环指令子程序调用指令中断指令

在高级语言中,时常有“尽量不要使用转移语句”的劝告,但如果在汇编语言的程序中也尽量不用转移语句,那么该程序要么无法编写,要么没有多少功能,所以,在汇编语言中,不但要使用转移指令,而且还要灵活运用,因为指令系统中有大量的转移指令。susujiang@汇编语言程序设计75控制转移指令一、无条件转移指令一般形式:

JMP Label/Reg/Mem ;转移到操作数指定的目标地址处对标志位的影响:无。功能说明:

根据转移的距离,JMP指令可分为下列两类:段内转移:在同一代码段内进行,包括短(Short,移量在[-128~

127]范围内)和近(Near,偏移量在[-32K~32K]范围内)转 移,只要修改IP的值即可实现。段间转移:可在不同代码段之间进行,又称远(Far)转移,需要同

温馨提示

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

评论

0/150

提交评论