IBM8086汇编教程.ppt_第1页
IBM8086汇编教程.ppt_第2页
IBM8086汇编教程.ppt_第3页
IBM8086汇编教程.ppt_第4页
IBM8086汇编教程.ppt_第5页
已阅读5页,还剩250页未读 继续免费阅读

下载本文档

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

文档简介

IBM-PC汇编语言程序设计,AssemblyLanguageProgramming,什么是汇编语言?,机器特定的编程语言该语言的语句和机器内在语言是一一对应的关系该语言和机器的指令集、系统结构相匹配程序设计的级别机器语言汇编语言高级语言IBM-PC汇编语言针对8086,8088,80186,80286,80386,80486,andPentiumProcessors,什么是汇编器?,系统级别的程序负责将汇编语言编写的源代码翻译成机器语言一般由软件开发商提供,例如我们所使用的Microsoft的MASM6.11版本的编译器源文件目标文件可执行文件,为什么要学习汇编语言?,能够学习到处理器是如何工作的理解计算机的基本系统结构探究数据和指令的内部表述,能够创建小巧有效的程序允许程序员绕过高层语言的限制编程有些工作必须用汇编语言完成,机器语言,数字表示的机器执行的指令集合,被称为处理器指令集处理器能够执行的基本指令的集合每个指令被编码成为数字符号指令可能占用一个或者多个字节每个数字代表一个机器指令,IBM-PC机器指令举例,1011000000000101borB005h操作码=10110000b含义:拷贝一个字节数据到AL寄存器中字节数据由该指令的第二部分代表:00000101b,汇编语言vs机器语言编程,机器语言编程编写一系列的数字符号表示程序执行所需的指令和数据汇编语言编程采用符号指令表示,将翻译成机器语言程序和数据常量,第1部分软硬件基础知识,AssemblyLanguageProgramming,1数据表示,AssemblyLanguageProgramming,二进制数字,1101101b数位从左到右依次排列b6b5b4b3b2b1b0下标表示位值(placevalue)bi2i需要熟记各个位值转换到十进制数的多项式b6*26+b5*25+b4*24+b3*23+b2*22+b1*21+b0*20Inthiscase,1101101bis64+32+8+4+1=109d,十进制到二进制的转换,109d转换到二进制循环被2除余数作为数位值直到0为止将余数组合起来第一位余数作为二进制数的最低位109d=1101101b,109/2=54r154/2=27r027/2=13r113/2=6r16/2=3r03/2=1r11/2=0r1,十六进制数,09,A,B,C,D,E,F注意:数字以H结尾大家思考:为何引入十六进制数?,二进制和十六进制,BinaryHex4位一组划分(从最低位开始)最后一组不足4位补0每组对应的数据转换成对应的数字,HexBinary相反的方法每个数字展成4bits可以忽略前面的若干的0,01001110b=4Eh37h=00110111b,二进制数据存储,存储数据的大小定义,通常字节byteDB字wordDW双字doublewordDD四字quadwordDQ存储器中的每个字节都有唯一的地址,基本加法,Easy!例如:cccc10101+1111100100,HexExample:cc3CF02+435C9804CB,0+0=00+1=11+0=11+1=101+1+1=11,WatchCarries,基本减法,Hexexample:bbFCF02-435C9B9939,bbbbb1101000011-11010011011011010,Aborrowaddssixteen,字符数据ASCII,AmericanStandardCodeforInformationInterchange(ASCII)7-bit二进制码表示的128个字符通常占用1字节包括一些控制字符ASCII码的序列称为ASCII字符串注:数字字符19的ASCII码值:3039大家思考:如何将ASCII码值和对应的数字相转换?,有符号数和无符号数,无符号数:所有位均为数据位有符号数:最左边的位为符号位例如:11111101无符号数252,而有符号数为-7,理解TwosComplementCode,补码的定义:X补(M+X)modM其中:M2n正数的编码无符号正数表示负数的编码其值加上256后对应的正数编码,Codefor+107107d=1101011bcode:01101011(6Bh)Codefor-107-107+256=149149d=10010101bcode:10010101b(95h)大家计算6Bh+95h?,二进制补码转换,c和-c的二进制补码加和的值等于2的幂8-bitcode:c+(-c)=2816-bitcode:c+(-c)=216(-c)=2n-c=(2n-1)-c+1,求补码的方法1:(-c)=2n-c求补码的方法2:翻转所有的位加1,解码二进制补码举例,0001,0110,1011,1000b以0开头表示正数简单地转换成十进制数,1110,1001,0100,1000b以1开头表示负数应用转换规则转换成十进制数-0001,0110,1011,1000b,不要忘记负号!,补码的加减运算,加法运算1111,0000,1101+0111,0110,10010110,0111,0110结果为正数,减法运算F23CF23C-2CF0+D310?C54C结果为负数,请大家动手转换成十进制运算,检验结果Wait.,检验,BinaryDec1111,0000,1101-243+0111,0110,1001+18970110,0111,01101654负数解码1111,0000,1101-(0000,1111,0011)-243,HexDecimalF23C(-3524)-2CF0-11504C54C-15028对F23C解码:1111,0010,0011,1100-(0000,1101,1100,0100)-3524,算术进位,算术进位进位CF的设置,由符号位的运算进位0或1产生的。对于无符号数,产生了数据位的进位而无效。,+,111111000000010100000001,1,CF=1,OF=0,+,25251,无效,+,-451,有效,无符号数有符号数,算术溢出,溢出的两情形:,2IBM-PC硬件,AssemblyLanguageProgramming,处理器,8x86各种处理器的速度,寻址空间,寄存器以及总线数据宽度不同。808616bitsregisters,1MB内存空间,总线8位808816位数据总线8038632位寄存器,32位总线,寻址4GBPentium32位寄存器,64位数据总线,Intel8086处理器的结构,8086寄存器,寄存器处理器中临时存储数据的地方数据寄存器(16-bit)AX,BX,CX,DX地址寄存器(16-bit)段寄存器:CS,SS,DS,ES指针寄存器:SP,BP,IP变址寄存器:SI,DI状态寄存器flag(16-bit),通用数据寄存器,都是用来保存数据的,因此称为通用寄存器但各有用途AX:累加BX:基址CX:计数DX:数据,各个寄存器的对应高低字节可单独使用AH,AL,BH,etc.,AX,BX,CX,DX,高8位低8位,内存组织,8086寻址范围1MB(220bytes)每个字节的地址从00000h到FFFFFh编码,并且编址是唯一确定的,注意:由于各个寄存器为16位,而20位的地址的寻址通过16位的寄存器完成。这是如何进行的呢?,10011111,00100110,01001000,10000011,01011100,10100010,物理地址,10000H,10001H,10002H,10003H,10004H,10005H,数据寻址方式,段:偏移量寻址段segment:一个存储区域,起始地址为能够被16整除的地址,即后4位为0(通常不写)偏移量:段范围内的存储单元相对于段起始地址的数量,偏移量的范围从0000H到FFFFH,段:偏移量寻址,逻辑地址=段地址:偏移地址物理地址段地址16偏移量,逻辑地址,段地址:偏移地址,1000:0000H,1000:0001H,1000:0002H,1000:0003H,1000:0004H,1000:0005H,10011111,00100110,01001000,10000011,01011100,10100010,物理地址,10000H,10001H,10002H,10003H,10004H,10005H,逻辑地址vs.物理地址,16位段地址,16位偏移地址,0000,+,20位物理地址,段寄存器,代码段CS对应执行的指令,起始地址对应第一条可执行的指令数据段DS对应程序的数据、常量等堆栈段SS对应暂存任何数据,包括子程序所用的数据扩展段ES对应于特殊的数据和操作使用,存储器,8KB代码,2KB数据,256堆栈,02000H,04800H,04000H,0200H,0400H,0480H,CSDSSSES,CS寄存器和IP寄存器,CSregister表示程序代码段的起始地址IP寄存器包含要执行的下一指令的地址的偏移量,和CS寄存器相关联IP寄存器的内容是程序中不能修改的,大家思考:某条指令的地址为CS:394BHIP:514H实际的物理地址:?,SS寄存器和SP寄存器,SS寄存器保存了暂时的数据和地址段的起始地址SP堆栈指针保存了堆栈段的段内的偏移量,也就是堆栈的当前顶部地址上述两者结合起来,扩展数据段一般用于字符串操作的寻址一般和DI寄存器相关联,ES寄存器,BP和变址寄存器,BP为基址寄存器可指定为任何段的偏移量,但缺省指的是堆栈段,SI和DI称为变址寄存器作用1:保存相对于任何段的偏移量,但通常缺省保存相对于数据段的偏移量作用2:有时保存相对于数组地址的索引数据,标志寄存器,标志寄存器保存了当前程序的执行状态,1514131211109876543210,OFDFIFTFSFZF,AFPFCF,OF溢出标志DF方向标志SF符号标志IF中断标志ZF零标志TF陷阱标志CF进位标志PF奇偶标志AF辅助进位标志,8086的系统启动,重置系统状态,执行的第一条指令位于FFFF0HCS=FFFFhIP=0000h其余各个寄存器清零执行ROM中指令,进入BIOS程序的处理系统内存检查初始化中断向量表和相关数据从磁盘中载入操作系统位于磁盘的启动扇区DOS载入执行,80 x86寄存器,80 x86的程序可见寄存器组通用寄存器专用寄存器段寄存器,EAXEBXECXEDXESPEBPESIEDIEIPEFLAGS,FSGS,311615870,中断,中断:某些事件使得处理器挂起当前的操作并为引起中断的原因去作一些事情。有些原因是正常的,例如键盘输入请求;有些是非法的,例如除数为0的操作。中断服务程序,堆栈Stack,LIFO数据结构支持PUSH和POP操作作用发生中断处理和过程调用时,保护当前执行的现场;过程返回时,依据堆栈保存的地址继续执行,堆栈的构造,堆栈是通过堆栈段寄存器和偏移量访问的一段内存区域SS:指向了堆栈的开始地址SP:指向了堆栈的顶部,SP:000C,SS:0340,StackSize:000C,动作,PUSH:压栈操作,减少SPPOP:出栈操作,增加SP,PUSH,POP,PUSH,PUSHsourcesource指的是任何16/32位通用或者段寄存器,或者字/双字的地址PUSHF将标志寄存器的内容压栈动作:SP减去2/4在SS:SP地址存放source数据,PUSH举例,PUSHAX,3C,09,A4,40,2C,FF,A2,23,2A,09,46,SP:0006,01,06,4C,SS:0340,AX:0123,POP,POPdestinationdestination指的是任何16/32位通用或者段寄存器,或者字/双字的地址POPForPOPFD将标志寄存器的内容出栈,存入标志寄存器动作:将SS:SP地址的数据拷贝到destinationSP加2/4,POP举例,POPES,3C,09,A4,40,2C,FF,A2,23,2A,09,46,SP:0008,01,06,4C,SS:0340,3C,09,A4,40,2C,FF,A2,23,2A,09,46,SP:0006,01,06,4C,SS:0340,ES:0123,第2部分汇编语言基础知识,AssemblyLanguageProgramming,1汇编语言的编码要求,AssemblyLanguageProgramming,基本特征,程序注释保留字标识符语句伪操作汇编程序的基本框架数据类型简单的程序举例,注释,注释利用;开始可自成一行,也可在指令之后的同一行里例如ADDAX,BX;计算总量,保留字,在特殊情况下使用,具有固定用途而保留的某些名字,称为保留字。主要类型:指令如MOV,ADD等计算机可执行的操作伪操作如END,SEGMENT,为编译程序提供信息的语句操作符如FAR,SIZE,在表达式中使用预定义符号如data,model等,在编译期间向程序返回信息,标识符1,用户定义的符号名称,包括两类:数据项的名称:表示数据项的地址如COUNTERDB0标号:表示指令、过程或者段的地址MAINPROCFARB30:ADDBL,25,标识符2,定义规则第一个字符必须是字母或者不为的特殊字符长度限定在131之间不能和保留字相冲突不区分大小写例如合法:TATAL,QTY25,$P80非法:5P,.TY,字母:AZ和az数字:09特殊:?_.$,语句,语句包括两类:指令具有对应的机器码例如:ADD,MOV伪指令只在程序汇编过程起作用,产生机器不可执行的代码例如:定义数据项DB,DW,指令,指令机器指令操作operation是必有的,规定该指令的动作操作数operand是可选的,并且数量不定例如:标识符操作操作数伪指令:COUNTDB1指令:MOVAX,0,标示名称操作操作数1n;注释,伪操作,介绍几个常用的伪操作PAGE和TITLESEGMENTPROCEND和ENDPASSUME,标示名称伪操作操作数1n;注释,PAGE和TITLE,程序的开头,PAGE定义程序打印时一页的最大行数和每行最大字符数。默认50,80格式:PAGE60,132TITLE为程序产生标题,打印程序时位于第2行格式:TITLEAssemblyprogramsort,SEGMENT,格式:segment_nameSEGMENTaligncombineclasssegment_nameENDS解释定位align:指明段开始的边界。通常段为小边界,参数为PARA。组合combine:指明程序连接时,该段是否和其它的段组合在一起(以后解释),参数为STACK,COMMON,PUBLIC堆栈段通常定义segment_nameSEGMENTPARASTACK类别class:指明段的类别代码段code,数据段data,堆栈段stack,PROC,定义过程,格式:proc_namePROCFARproc_nameENDP过程名的操作数为FAR,意味着相应程序的入口点为此过程,在程序中只有一个操作数为FAR的过程。ENDP指明过程的结束,过程的结束在代码段内,即ENDS之前完成。代码段内可以包含任意数量的过程,其它的过程通常使用NEAR的操作数。,END,ENDS段结束ENDP过程结束END完整的程序结束格式:END过程操作数FAR的PROC,ASSUME,指明程序各个段的用途典型的格式ASSUMEDS:dataseg,CS:codeseg,SS:stackseg,上述的次序任意假如需要扩展段ES,也可以加上即可ES:dataseg,程序的框架结构,page60,132TITLEA04ASM1(EXE)MoveandaddoperationsSTACKSEGMENTPARASTACKStack.STACKENDS;-DATASEGSEGMENTPARADataDATASEGENDS;-CODESEGSEGMENTPARACodeMAINPROCFARASSUMESS:STACK,DS:DATASEG,CS:CODESEGMOVAX,DATASEG;SetaddressofdataMOVDS,AX;segmentinDS.MOVAX,4C00H;EndprocessingINT21HMAINENDP;EndofprocedureCODESEGENDS;EndofsegmentENDMAIN;Endofprogram,解释,段的定义顺序可任意入口过程MAIN的名称可以为其它,例如START等程序结束返回MOVAH,4CH;请求结束处理MOVAL,retcode;设置返回码INT21H;调用中断处理通常正常返回0,故可写作MOVAX,4C00HINT21H,编程技巧提示,由于汇编源程序的格式相对不变,故可以把上述的框架保留下来,添加功能代码即可,数据类型1,名称:对应标识符伪操作Dn:定义数据的类型长度字节DB(1字节)字DW(2字节)双字DD(4字节)表达式:定义数据的数值的常数或者表达式,名称Dn表达式,数据定义的格式,数据的定义1,表达式的形式对于尚未初始化的数据,使用?表示常数举例最简单的情形DATAXDB?DATAYDB25,数据的定义2,数据序列的定义数组数据因素依次用,隔开DATAZDB21,22,23,24对DATAZ的数据因素访问,根据数据所处的位置进行DATAZ+0表示21,DATAZ+1表示22,依次类推MOVAL,DATAZ+3,数据的定义3,重复数据序列的定义举例DW10DUP(?)DB5DUP(12)DB3DUP(5DUP(4)DB4DUP(3DUP(0,1),2DUP($),名称Dn重复个数DUP(表达式),请大家思考:上述的数据是什么?,数据的定义4,字符和字符串的定义字符或者字符串在单引号或者双引号“”内定义数据类型常用的是DB举例DBComputercity若串中含有“”,以下处理DBCrazysam”sCDDB“CrazysamsCD”,page60,132TITLEA04ASM1(EXE)MoveandaddoperationsSTACKSEGMENTPARASTACKStackDW32DUP(0)STACKENDS;-DATASEGSEGMENTPARADataFLDDDW215FLDEDW125FLDFDW?DATASEGENDS;-CODESEGSEGMENTPARACodeMAINPROCFARASSUMESS:STACK,DS:DATASEG,CS:CODESEGMOVAX,DATASEG;SetaddressofdataMOVDS,AX;segmentinDSMOVAX,FLDD;Move0215toAXADDAX,FLDE;Add0125toAXMOVFLDF,AX;StoresuminFLDFMOVAX,4C00H;EndprocessingINT21HMAINENDP;EndofprocedureCODESEGENDS;EndofsegmentENDMAIN;Endofprogram,完整的源程序举例,编写注意,编写建议:同一小功能段,编写注释程序识别一般不区分大小写可读性强,通常所有汇编指令用大写,而注释全部用小写,使用简化的编程框架,.MODEL自动产生ASSUME语句.MODEL本教程通常两种:Tiny:为.com生成代码Small:为.exe生成代码并且两者代码偏移量限定在64KB内,page60,132TITLEA04ASM2(EXE)Moveandaddoperations;-.MODELSMALL.STACK64;Definestack.DATA;DefinedataFLDDDW215FLDEDW125FLDFDW?;-.CODE;DefinecodesegmentMAINPROCFARMOVAX,data;SetaddressofdataMOVDS,AX;segmentinDSMOVAX,FLDD;Move0215toAXADDAX,FLDE;Add0125toAXMOVFLDF,AX;StoresuminFLDFMOVAX,4C00H;EndprocessingINT21HMAINENDP;EndofprocedureENDMAIN;Endofprogram,简化模型举例,2源程序的编译连接和执行,AssemblyLanguageProgramming,几个文件,源程序:.asm目标文件:.obj可执行文件:.exe(.com),编辑源程序.asm,.asm,汇编,.obj,连接,.exe,选项,.LST.CRF,汇编过程1,MLa04asm1.asmMicrosoft(R)SegmentedExecutableLinkerVersion5.31.009Jul131992Copyright(C)MicrosoftCorp1984-1992.Allrightsreserved.ObjectModules.obj:a04asm1.objRunFilea04asm1.exe:a04asm1.exeListFilenul.map:NULLibraries.lib:DefinitionsFilenul.def:,注意:该命令编译,生成obj,连接,生成exe同时完成,汇编过程2,E:srcCH04ML/ca04asm1.asmMicrosoft(R)MacroAssemblerVersion6.11Copyright(C)MicrosoftCorp1981-1993.Allrightsreserved.Assembling:a04asm1.asmE:srcCH04LINKa04asm1.objMicrosoft(R)SegmentedExecutableLinkerVersion5.31.009Jul131992Copyright(C)MicrosoftCorp1984-1992.Allrightsreserved.RunFilea04asm1.exe:a04asm1.exeListFilenul.map:Libraries.lib:DefinitionsFilenul.def:,注意:该命令编译,生成obj,连接,生成exe分别完成,执行,E:srcCH04a04asm1.exeE:srcCH04,ML其它注意的汇编选项,除了/c只汇编程序外,还要知道:/Fl:产生列表文件.lst/Fr:产生映象文件.map/Sn:禁止符号表的列表/Zd:包含调试信息的行号/Zi:包含符号的调试信息大家在实验中,将上述的各个选项应用上编译程序,知道各个选项的含义。,3编写.COM汇编程序,AssemblyLanguageProgramming,.COM程序,.com程序通常较为小巧,最大不超过64KB,适合作为常驻内存的程序代码段和数据段在一个段内.堆栈段由装入程序在段尾自动创建头100H为ProgramSegmentPrex,PSP堆栈段数据段代码段,ESSSDSCS,PSP代码段堆栈段,ESDSCSSS,编写格式,ASSUME将所有段寄存器初始化为代码段的地址ORG100H指明第一条指令的地址为100H偏移量,即IP=100H注意:定义数据的方法,通常程序一开始即定义,TITLEA05COM1COMprogramtomoveandadddataCODESEGSEGMENTPARACodeASSUMECS:CODESEG,DS:CODESEG,SS:CODESEG,ES:CODESEGORG100H;StartatendofPSPBEGIN:JMPMAIN;Jumppastdata;-DATAXDW215;DatadefinitionsDATAYDW125DATAZDW?;-MAINPROCNEARMOVAX,DATAX;Move0215toAXADDAX,DATAY;Add0125toAXMOVDATAZ,AX;StoresuminDATAZMOVAX,4C00H;EndprocessingINT21HMAINENDPCODESEGENDSENDBEGIN,通常格式,TITLEA05COM2COMprogramtomoveandadddata.MODELTINY.CODEORG100H;StartatendofPSPBEGIN:JMPMAIN;Jumppastdata;-DATAXDW215;DatadefinitionsDATAYDW125DATAZDW?;-MAINPROCNEARMOVAX,DATAX;Move0215toAXADDAX,DATAY;Add0125toAXMOVDATAZ,AX;StoresuminDATAZMOVAX,4C00H;EndprocessingINT21HMAINENDPENDBEGIN,简化格式,.com文件的汇编连接,AprogramsC:ml/AT/Fl/FmA05COM2.ASM,Microsoft(R)MacroAssemblerVersion6.11Copyright(C)MicrosoftCorp1981-1993.Allrightsreserved.Assembling:A05COM2.ASMMicrosoft(R)SegmentedExecutableLinkerVersion5.31.009Jul131992Copyright(C)MicrosoftCorp1984-1992.Allrightsreserved.ObjectModules.obj:A05COM2.obj/tRunFileA05COM:A05COMListFilenul.map:A05COM2.map/mLibraries.lib:DefinitionsFilenul.def:,参数:/AT:产生com格式的可执行文件/Fl:产生列表文件/Fm:产生映像文件,4DEBUG程序跟踪调试,AssemblyLanguageProgramming,基本命令的使用,DEBUG是我们学习汇编语言的调试工具。所有的命令不区分大小写所有的输入数据都默认十六进制的,不用H结尾C:DEBUG-,C:DEBUGfile.exe-,R检查寄存器,C:DEBUG-R,AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=0AC4ES=0AC4SS=0AC4CS=0AC4IP=0100NVUPEIPLNZNAPONC0AC4:0100F6C280TESTDL,80,RF标记寄存器,-RF列举出标志寄存器的各个位状态,OF溢出(是/否)OVNVDF方向(减量/增量)DNUPIF中断(允许/关闭)EIDISF符号(负/正)NGPLZF零(是/否)ZRNZAF辅助进位(是/否)ACNAPF奇偶(偶/奇)PEPOCF进位(是/否CYNC,D检查内存内容,使用的格式:-Dstartingaddresslength开始的地址:segment:offset采用默认DS的偏移地址offset例如:-D0000-DDS:0000-D0100L5,E编辑机器指令程序,C:DEBUG-ECS:100B82301052500-ECS:1068BD803D88BCB-ECS:10C2bc82bc0ebee-DCS:100,0B00:0100B823010525008BD8-03D88BCB2BC82BC0.#.%.+.+.0B00:0110EBEEC3750580CF80-EBD43C0D3400EF0A.u.debug,-nA05COM2.COM-l-RAX=0000BX=0000CX=0017DX=0000SP=FFFEBP=0000SI=0000DI=0000DS=0C2EES=0C2ESS=0C2ECS=0C2EIP=0100NVUPEIPLNZNAPONC0C2E:0100EB06JMP0108-u1000C2E:0100EB06JMP01080C2E:0102D7XLAT0C2E:0103007D00ADDDI+00,BH0C2E:01060000ADDBX+SI,AL0C2E:0108A10201MOVAX,01020C2E:010B03060401ADDAX,01040C2E:010FA30601MOV0106,AX0C2E:0112B8004CMOVAX,4C000C2E:0115CD21INT210C2E:0117E65FOUT5F,AL0C2E:01197D5FJGE017A0C2E:011BBB5FA1MOVBX,A15F0C2E:011E3437XORAL,37-r-t,第3部分常用指令和寻址方式,AssemblyLanguageProgramming,1常用基本操作,AssemblyLanguageProgramming,伪操作,格式:名称=表达式赋值操作将表达式的数值指派给名称表达式一定为数值名称的值可被多次指派例如:MAXINT=7FFFHCOUNT=1COUNT=COUNT*2,EQU伪操作,格式:名称EQU表达式利用名称替代表达式表达式可以为数值,也可为字符串使用代表字符串一旦赋值完成,不能再次改变举例:SampleEQU7FhaStringEQUmessageEQUMPYEQUMUL利用MPY替代MUL指令,注意,EQU伪操作中的表达式名是不允许重复定义的,而=伪操作则允许重复定义。上述两个伪操作和数据定义DB/DW/DD等不同之处,主要体现在:EQU和不分配内存空间,仅仅定义了数据,编译时用定义的数据替换标识符数据定义伪指令DB/DW/DD分配相应的内存空间,通用数据传输指令,传送指令MOV数据交换指令XCHG地址偏移量加载LEA,MOV指令,MOVtarget,sourcereg,regmem,regreg,memmem,immedreg,immed存储器操作数之间不能相互传值两个操作数的类型须一致段寄存器和立即数之间不能相互传值CS不能作为目标寄存器使用,合法指令举例,寄存器传送MOVEDX,ECXMOVES,AXMOVBYTEFLD,AHMOVDI,BX立即数传送MOVCX,40HMOVBYTEFLD,25HMOVWORDFLDBX,16H,直接存储器传送MOVCH,BYTEFLDMOVCX,WORDFLDBX段寄存器传送MOVAX,DSMOVWORDFLD,DS,非法MOV指令,MOVDL,WORD_VALMOVDX,BYTE_VAL注:PTR的使用MOVDL,WORDPTRWORD_VALMOVDX,BYTEPTPBYTE_VALMOVBYTE_VAL1,BYTE_VAL2存储器之间不能之间传送MOVES,23立即数到段寄存器不能直接传送MOVES,DS段寄存器间不能传送MOVCS,23,交换数据指令XCHG,XCHGtarget,sourcereg,regreg,memmem,regMOV和XCHG不能执行存储器之间的数据传送,交换数据操作的有效方法不需临时的空间排序经常需要此操作ItworksonlywiththegeneralregistersAX,BX,CX,DXBP,SI,DI,SP,SEG,格式:SEG变量名或者标号例如MOVAX,SEGK1MOVAX,SEGDATAX,OFFSET和LEA指令,OFFSET操作符取偏移量MOVBX,OFFSETDATA1LEA利用偏移量初始化寄存器BX,SI,DI等,为的是指向存储器的一个地址举例DATA1DB25DUP(?)DATA2DB?LEABX,DATA1装入偏移地址MOVDATA2,BX传送DATA1的第一个字节数据等效的指令LEABX,DATA1装入偏移地址MOVBX,DATA1,LDS和LES,LDSREG,SRC执行的操作:(REG)(SRC)(DS)(SRC+2)把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器.LESREG,SRC执行的操作:(REG)(SRC)(ES)(SRC+2)把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器.,地址偏移,BDB4Fh,20h,3ChWDW2048,-100,0MOVBX,W+2MOVB+1,AHMOVAH,B+5MOVDX,W-3,汇编器计算地址的偏移注意:汇编的时刻计算地址MOVAX,B-1不是从B的数值中减去1,TYPE运算符,例如V1DBABCDV2DW1234H,5678HV3DDV2MOVAL,TYPEV1;01HMOVBL,TYPEV2;02HMOVCL,TYPEV3;04H,LENGTH和SIZE,LENGTH返回数组变量元素的个数SIZE返回数组元素的字节大小Size=length*type,ORG和$,ORGn定位常数值为n的偏移地址$当前偏移地址例:ORG$+8可以表示跳过8个字节的存储区,例题,例如:BUFDW1,2,$+1,3如果BUF的偏址为10H,问内存情况如何?例如:BUFDB1,2,3,4ABCEQU$-OFFSETBUF问ABC等于什么?,PTR,强制修改操作数的类型例如:MOVBX,AX对MOVBX,4错改为:MOVWORDPTRBX,4MOVBYTEPTRBX,4,简单的算术运算,ADDdest,sourceSUBdest,sourceINCdestDECdest操作数的类型一定要一致对标志寄存器起作用,源操作数可以为常数,存储器地址,通用寄存器目标寄存器可以为通用寄存器或者存储器地址不能同时为操作数,2寻址方式,AssemblyLanguageProgramming,寻址方式,寻址方式定义了:操作数获取数据的方法将数据放置到目的的方法操作数的数据来源主要有:来自寄存器寄存器模式来自指令立即寻址模式来自存储器存储器模式直接寻址直接偏移量寻址寄存器间接寻址基址位移量寻址基址变址寻址带位移量的基址变址寻址,寄存器寻址,格式:寄存器的名称允许的寄存器:任何寄存器操作数:寄存器中的数据值举例:ADDAX,BXMOVAL,ACS不能用MOV指令改变MOVCS,AX错,立即数寻址,格式:各种常数值举例:ADDAX,124ADDAH,12H,存储器寻址,有效地址:地址是由操作数所决定的,不同的模式决定了不同的地址计算方法直接寻址直接偏移量寻址(相对直接寻址)寄存器间接寻址基址偏移量寻址基址变址寻址带偏移量的基址变址寻址,TITLEA06IMMED(EXE)Exampleofimmediateoperands.MODELSMALL.STACK64;Definestack.DATA;DefinedatasegmentDBImmediateValuesBYTEFLDDB150;ByteWORDFLDDW300;WordDWDFLDDD0;Doubleword.386.CODEMAINPROCFARMOVAX,data;SetaddressofdataMOVDS,AX;segmentinDSMOVCX,325;MoveimmediateADDCX,150;AddimmediateSUBBYTEFLD,50;SubtractimmediateMOVWORDFLD,40H;MoveimmediateMOVEDX,40H;MoveimmediateADDEDX,25H;AddimmediateMOVDWDFLD,EDXMOVAX,4C00H;EndprocessingINT21HMAINENDPENDMAIN,1直接(存储器)寻址,格式:在数据段中定义的数据变量的名称有效地址EA的计算:默认情形下数据段DS+变量地址,50,30,32000,AHAL,30,50,(AX)=3050H,举例VAR1DW3050HMOVAX,VAR1,假设:VAR1的偏移地址为2000H,(DS)=3000H,那么物理地址=32000H,说明,隐含的段为数据段DS可指定段跨越前缀MOVAX,ES:2000H操作数地址可由变量(符号地址)表示,但要注意变量的属性VALUEDB10MOVAH,VALUEMOVAX,VALUEMOVAX,WORDPTRVALUE,直接偏移量寻址,格式:nameoffset或者name+offset有效地址:变量的地址加上偏移量加上数据段的地址DS:(address+offset)举例:ARRAY1DW10DUP(?).ADDAX,ARRAY12ADDBX,ARRAY1+6,(寄存器)间接寻址,格式:register允许的寄存器:BX,DI,SI,BPEA:DS:BX,DS:DI,DS:SI,SS:BP举例:VAR1DW125VAR2DW23HLEABX,VAR1MOVBX,VAR2,基址偏移量寻址,格式:register+offset,offsetregister允许的寄存器:BX,DI,SI,BPEA:DS:(BX+offset),DS:(DI+offset),DS:(SI+offset),SS:(BP+offset)举例:VAR1DW125ARRAY1DW10DUP(?)LEABX,ARRAY1MOVBX+3,VAR1MOVBX+4,2BX,基址变址寻址,格式:base-reg+index-regbaseregisters:BX或BPindexregister:DI或SIEA:DS:(base-reg+index-reg)举例:MOVAX,BXDI或MOVAX,BX+DI或MOVAX,ES:BXSI,有效地址=,(BX)(SI)(BP)(DI),+,带偏移量的基址变址寻址,格式:base-reg+index-reg+offset或者offsetbase-reg+index-regbaseregisters:BX或者BPindexregister:DI,SIEA:DS:(base-reg+index-reg+offset)举例:MOVAX,MASKBXSI或MOVAX,MASKBX+SI或MOVAX,MASK+BX+SI,有效地址=,(BX)(SI)8位(BP)(DI)16位,+,+,位移量,段跨越前缀,数据段默认地址存放在CS寄存器中,不需指明若明确指明使用其它的数据段,称为段前缀。例如MOVAX,ES:BXMOVAX,ES:BX+3,3逻辑运算指令,AssemblyLanguageProgramming,布尔数据,只需1位表示:0或者10=FALSE1=TRUE布尔运算一元:NOT二元:AND,OR,XOR,NOTvs.NEG,NOTdestinationRegisterormemory01,10,用于无符号数不影响标志寄存器NEGdestination实现二进制补码,按位求反加1把正数转换为负数;或者反之。用于有符号数,AND,OR,XOR,AND|OR|XORdestination,sourcereg,reg|mem|immedmem,reg|immed操作对标志位SF,ZF,PF有影响,CF=OF=0 xANDy=1x=y=1xORy=0 x=y=0 xXORy=0 x=y,AND的应用,某一位清0ANDAH,01111111B将第7位清0,而其它的位保持不变部分清0ANDAX,000Fh将AX的低4位部分保留,其余清0,NumLock设置关闭,;clearbit5inkeyboardstatusbytemovax,40hmovds,ax;setDSmovbx,17h;byteptrandbyteptrbx,0DFh,键盘状态对应的字节地址:数据段0040:0017,bit3=AltPressedbit2=CtrlPressedbit1=LeftShiftbit0=RightShift,bit7=InsertModebit6=CapsLockbit5=NumLockbit4=ScrollLock,OR的应用,设置某一位ORBX,0400h将BX的第10位设置1,其余保留CheckingthevalueofcertainbitORAX,AX该指令不改变AX的值,只是设置标志寄存器第15位符号位(JS,JNS,JG,JGE,JL,JLE)ZF=1AX=0(JZ,JNZ),数据变换,;DL中为数字0-9ORDL,00110000b;DL中为字符0-9大小写字符的区别在于第5位(1=lowercase);AHcontainsletter(a-z,A-Z)ORAH,00100000b;AHisnowlowercase,ASCIIfordigitx(0-9)is3x设置数字x的对应的第4位和第5位,将其转换为字符,XOR的应用,位的翻转XORAH,10000000B只将AH的第7位改变字节或字清0XORAX,AX将AX清0加密或解密XORAL,Key;encrypts/decryptsbyteinAL,TEST,TESTdestination,source执行AND的操作,只是不改变数据的值标志位如同AND一样被设置Example1TESTCX,0FFHJZexit;是0吗TESTBL,00000001bJNZexit;是奇数吗Example2TESTCL,10000001bJZEvenAndNonNegative;一定为非负的偶数JSNegative;一定

温馨提示

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

评论

0/150

提交评论