衔接篇程序框架幻灯片.ppt
衔接篇程序框架第1页,共34页,编辑于2022年,星期二硬指令和伪指令硬指令硬指令使使CPU产生动作、并在程序执行时才处理的语句。伪指令伪指令(Directive)不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等。伪指令与具体的处理器类型无关,但与汇编程序的版本伪指令与具体的处理器类型无关,但与汇编程序的版本有关。有关。我们采用微软宏汇编程序我们采用微软宏汇编程序 MASM 6.15第2页,共34页,编辑于2022年,星期二一、汇编语言程序的开发本节从汇编语言程序的语句格式出发,给出第一个示范性的汇编语言源程序,并说明汇编语言程序的过程:编辑 汇编 连接 调试即汇编语言程序的开发方法第3页,共34页,编辑于2022年,星期二1 汇编语言程序的语句格式 执行性语句由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中:标号:硬指令助记符 操作数,操作数;注释 说明性语句由伪指令构成的语句,它通常指示汇编程序如何汇编源程序:名字 伪指令助记符 参数,参数,;注释第4页,共34页,编辑于2022年,星期二MOV CX,0MOV CX,0;传送指令,具有传送指令,具有2 2个操作数个操作数DELAY:DELAY:NOPNOP;空操作指令,没有操作数,带有标号空操作指令,没有操作数,带有标号LOOP DELAYLOOP DELAY;循环指令,标号循环指令,标号DELAYDELAY说明转移位置说明转移位置BUFFERBUFFERDB 1,2,3,4,5,6,7DB 1,2,3,4,5,6,7;数据定义伪指令,在主存中开辟数据定义伪指令,在主存中开辟7 7个连续的字节单元,个连续的字节单元,初值依次为初值依次为1 17 7,BUFFERBUFFER表示首地址表示首地址汇编语言语句实例汇编语言语句实例第5页,共34页,编辑于2022年,星期二标号、名字与标识符标号标号是反映硬指令位置(逻辑地址)的标识符,后跟一个冒是反映硬指令位置(逻辑地址)的标识符,后跟一个冒号分隔号分隔名字名字是反映伪指令位置(逻辑地址)和属性的标识符,后是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有一个冒号跟空格或制表符分隔,没有一个冒号标识符标识符(IdentifierIdentifier)一般最多由)一般最多由3131个字母、数字及规定的特殊个字母、数字及规定的特殊符号(如符号(如 _ _、$、?、)组成,不能以数字开头。默认情况)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写下,汇编程序不区别标识符中的字母大小写一个程序中,每个标识符的定义是唯一的,还不能是汇编语言一个程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的保留字采用的保留字第6页,共34页,编辑于2022年,星期二保留字保留字(保留字(Reserved WordReserved Word)是汇编程序已经利用的标识)是汇编程序已经利用的标识符,主要有:符,主要有:o硬指令助记符例如:MOVMOV、ADDo伪指令助记符例如:DB、EQUEQUo操作符例如:例如:OFFSETOFFSET、PTRPTRoo寄存器名寄存器名例如:AXAX、CSo预定义符号例如:例如:datadata 汇编语言大小写不敏感第7页,共34页,编辑于2022年,星期二注释语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性必要时,一个语句行也可以由分号开始作为阶段性注释汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理第8页,共34页,编辑于2022年,星期二2 汇编语言的程序格式完整的汇编语言源程序由段组成完整的汇编语言源程序由段组成一个汇编语言源程序可以包含若干个代码段、数据段、附加段或一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列堆栈段,段与段之间的顺序可随意排列需独立运行的程序必须包含一个代码段,并指示程序执行的需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点起始点,一个程序只有一个起始点所有的可执行性语句必须位于某一个代码段内,说明性语句可根据所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内需要位于任一段内通常,程序还需要一个堆栈段通常,程序还需要一个堆栈段第9页,共34页,编辑于2022年,星期二汇编语言源程序源程序分别用两种格式书写v第一种格式从MASM 5.0开始支持简化段定义格式v第二种格式MASM 5.0以前就具有完整段定义格式Hello,Everybody!程序功能程序功能第10页,共34页,编辑于2022年,星期二;01a.asm 01a.asm(文件名)(文件名)stackstacksegment stacksegment stack;定义堆栈段定义堆栈段dw 512 dup(?)dw 512 dup(?);堆栈段有堆栈段有512512字(字(10241024字节)空间字节)空间stackstackendsends;堆栈段结束堆栈段结束datadatasegmentsegment;定义数据段定义数据段stringstringdb Hello,Everybody!,0dh,0ah,$db Hello,Everybody!,0dh,0ah,$datadataendsendscodecodesegment codesegment code;定义代码段定义代码段assume cs:code,ds:data,ss:stackassume cs:code,ds:data,ss:stackstart:start:mov ax,datamov ax,data;建立建立DSDS段地址段地址mov ds,axmov ds,ax例:完整段定义格式例:完整段定义格式第11页,共34页,编辑于2022年,星期二mov dx,offset stringmov dx,offset stringmov ah,9mov ah,9int 21hint 21hmov ax,4c00hmov ax,4c00hint 21hint 21h;利用功能调用返回利用功能调用返回DOSDOScodecodeendsends;代码段结束代码段结束end startend start;汇编结束,同时指明程序起始点汇编结束,同时指明程序起始点例:完整段定义格式例:完整段定义格式第12页,共34页,编辑于2022年,星期二;SampleA.ASM;SampleA.ASMstackstacksegment stacksegment stackdw 512 dup(?)dw 512 dup(?)stackstackendsendsdatadatasegmentsegment.;在数据段定义数据在数据段定义数据datadataendsendscodecodesegment codesegment codeassume cs:code,ds:data,ss:stackassume cs:code,ds:data,ss:stackstart:start:mov ax,datamov ax,datamov ds,axmov ds,ax.;在代码段填入指令序列在代码段填入指令序列mov ax,4c00hmov ax,4c00hint 21hint 21hcodecodeendsends .;子程序代码子程序代码end startend start完整段定义完整段定义格式格式 MASM 5.x支持第13页,共34页,编辑于2022年,星期二;01b.asm;01b.asm(文件名)(文件名).model small.model small;定义程序的存储模式定义程序的存储模式.stack.stack;定义堆栈段定义堆栈段.data.data;定义数据段定义数据段stringstringdb Hello,Everybody!,0dh,0ah,$db Hello,Everybody!,0dh,0ah,$;在数据段定义要显示的字符串在数据段定义要显示的字符串.code.code;定义代码段定义代码段.startup.startup;程序起始点,建立程序起始点,建立DSDS、SSSSmov dx,offset stringmov dx,offset string;指定字符串指定字符串mov ah,9mov ah,9int 21hint 21h;利用功能调用显示信息利用功能调用显示信息.exit 0.exit 0;程序结束点,返回程序结束点,返回DOSDOSendend;汇编结束汇编结束例:简化段定义格例:简化段定义格式式第14页,共34页,编辑于2022年,星期二;SampleB.ASMSampleB.ASM.model small.model small.stack.stack.data.data.;在数据段定义数据在数据段定义数据.code.code.startup.startup;(注(注1 1).;在代码段填入指令序列在代码段填入指令序列.exit 0.exit 0;(注(注2 2).;子程序代码子程序代码endend;(注(注3 3)简化段定义简化段定义格式格式 MASM 6.x支持第15页,共34页,编辑于2022年,星期二;SampleC.ASM;SampleC.ASM.model small.model small.stack.stack.data.data.;在数据段定义数据在数据段定义数据.code.codestartstart:mov ax,datamov ax,datamov ds,axmov ds,ax.;在代码段填入指令序列在代码段填入指令序列mov ax,4c00hmov ax,4c00hint 21hint 21h.;子程序代码子程序代码end startend start简化段定义简化段定义格式格式 MASM 5.x支持第16页,共34页,编辑于2022年,星期二TITLETITLEA04ASM1(EXE)Move and add operationsA04ASM1(EXE)Move and add operationsSTACKSTACKSEGMENT PARA STACK StackSEGMENT PARA STACK Stack.STACKSTACKENDSENDS;-;-DATASEGDATASEGSEGMENT PARA DataSEGMENT PARA DataDATASEGDATASEGENDSENDS;-;-CODESEGCODESEG SEGMENT PARA CodeSEGMENT PARA CodeMAINMAINPROC FARPROC FARASSUME SS:STACK,DS:DATASEG,CS:CODESEGASSUME SS:STACK,DS:DATASEG,CS:CODESEGMOV AX,DATASEGMOV AX,DATASEG;Set address of data;Set address of data MOV DS,AXMOV DS,AX;segment in DS;segment in DS.MOVMOV AX,4C00H AX,4C00H;End processing;End processingINTINT 21H 21HMAINMAINENDPENDP;End of procedure;End of procedureCODESEGCODESEGENDSENDS;End of segment;End of segmentENDEND MAIN MAIN;End of program;End of program程序的框架结构(1)第17页,共34页,编辑于2022年,星期二TITLEA04ASM2(EXE)Move and add operations;-.MODEL SMALL.STACK 64;Define stack.DATA ;Define data .;-.CODE;Define code segmentMAINPROC FARMOV AX,data;Set address of dataMOV DS,AX;segment in DS.MOV AX,4C00H;End processingINT 21HMAINENDP;End of procedureEND MAIN;End of program程序的框架结构(2)第18页,共34页,编辑于2022年,星期二3 汇编语言程序的开发过程编编辑辑文本编辑器,如文本编辑器,如 EDIT.COM源程序:文件名源程序:文件名.asm汇汇编编汇编程序,如汇编程序,如 MASM.EXE目标模块:文件名目标模块:文件名.obj连连接接连接程序,如连接程序,如 LINK.EXE可执行文件:文件名可执行文件:文件名.exe调调试试调试程序,如调试程序,如 DEBUG.EXE应用程序应用程序错误错误错误错误错误错误错误错误第19页,共34页,编辑于2022年,星期二源程序:.asm目标文件:.obj可执行文件:.exe编辑源程序.asm.asm汇编.obj连接.exe选项.LST.CRF第20页,共34页,编辑于2022年,星期二编写注意编写建议:对任一功能段,编写注释程序识别一般不区分大小写可读性强,通常所有汇编指令用大写,而注释全部用小写第21页,共34页,编辑于2022年,星期二二、DEBUG程序跟踪调试第22页,共34页,编辑于2022年,星期二基本命令的使用DEBUG是我们学习汇编语言的调试工具。所有的命令不区分大小写所有的输入数据都默认十六进制的,不用H结尾C:DEBUGC:DEBUG-C:DEBUG file.exe-第23页,共34页,编辑于2022年,星期二R检查寄存器C:DEBUGC:DEBUG-R-RAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0AC4 ES=0AC4 SS=0AC4 CS=0AC4 IP=0100 NV UP EI PL NZ NA PO NC0AC4:0100 F6C280 TEST DL,80第24页,共34页,编辑于2022年,星期二RF标记寄存器-RF-RF列举出标志寄存器的各个位状态列举出标志寄存器的各个位状态OF溢出(是/否)OV NV DF方向(减量/增量)DNUPIF中断(允许/关闭)EIDISF符号(负/正)NGPLZF零(是/否)ZRNZAF辅助进位(是/否)ACNAPF奇偶(偶/奇)PEPOCF进位(是/否CYNC第25页,共34页,编辑于2022年,星期二D检查内存内容使用的格式:-D starting address length开始的地址:segment:offset 采用默认DS的偏移地址offset例如:-D 0000-D DS:0000-D 0100 L5第26页,共34页,编辑于2022年,星期二E编辑机器指令程序C:DEBUGC:DEBUG-E CS:100 B8 23 01 05 25 00-E CS:100 B8 23 01 05 25 00-E CS:106 8B D8 03 D8 8B CB-E CS:106 8B D8 03 D8 8B CB-E CS:10C 2b c8 2b c0 eb ee-E CS:10C 2b c8 2b c0 eb ee-D CS:100-D CS:1000B00:0100 B8 23 01 05 25 00 8B D8-03 D8 8B CB 2B C8 2B C0.#.%.+.+.0B00:0110 EB EE C3 75 05 80 CF 80-EB D4 3C 0D 34 00 EF 0A.u.4.0B00:0120 01 3A 06 02 96 75 03 E9-17 01 B2 3A 38 14 75 1D.:.u.:8.u.第27页,共34页,编辑于2022年,星期二U反汇编采用U反汇编机器程序反汇编机器程序例如,反汇编刚才的机器指令-U 100-U 1000B05:0100 B82301 MOV AX,01230B05:0100 B82301 MOV AX,01230B05:0103 052500 ADD AX,00250B05:0103 052500 ADD AX,00250B05:0106 8BD8 MOV BX,AX0B05:0106 8BD8 MOV BX,AX0B05:0108 03D8 ADD BX,AX0B05:0108 03D8 ADD BX,AX0B05:010A 8BCB MOV CX,BX0B05:010A 8BCB MOV CX,BX0B05:010C 2BC8 SUB CX,AX0B05:010C 2BC8 SUB CX,AX0B05:010E 2BC0 SUB AX,AX0B05:010E 2BC0 SUB AX,AX0B05:0110 EBEE JMP 01000B05:0110 EBEE JMP 01000B05:0112 3E DS:0B05:0112 3E DS:0B05:0113 3299C606 XOR BL,BX+DI+06C60B05:0113 3299C606 XOR BL,BX+DI+06C60B05:0117 3499 XOR AL,990B05:0117 3499 XOR AL,99第28页,共34页,编辑于2022年,星期二T跟踪执行指令命令T执行CS:IP指向的一条指令-RAX=0000 BX=0290 CX=0148 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000DS=0B05 ES=0B05 SS=0B05 CS=0B05 IP=0100 NV UP EI PL ZR NA PE NC0B05:0100 B82301 MOV AX,0123-TAX=0123 BX=0290 CX=0148 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000DS=0B05 ES=0B05 SS=0B05 CS=0B05 IP=0103 NV UP EI PL ZR NA PE NC0B05:0103 052500 ADD AX,0025-TAX=0148 BX=0290 CX=0148 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000DS=0B05 ES=0B05 SS=0B05 CS=0B05 IP=0106 NV UP EI PL NZ NA PE NC0B05:0106 8BD8 MOV BX,AX-TAX=0148 BX=0148 CX=0148 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000DS=0B05 ES=0B05 SS=0B05 CS=0B05 IP=0108 NV UP EI PL NZ NA PE NC0B05:0108 03D8 ADD BX,AX第29页,共34页,编辑于2022年,星期二R改变寄存器的内容命令命令R R改变寄存器的内容,在提示符下敲入寄存器的值改变寄存器的内容,在提示符下敲入寄存器的值格式格式格式格式 R regnameR regname-RAX=0000 BX=0290 CX=0148 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000DS=0B05 ES=0B05 SS=0B05 CS=0B05 IP=0100 NV UP EI PL ZR NA PE NC0B05:0100 B82301 MOV AX,0123-R AXAX 0000:1234-RAX=1234 BX=0290 CX=0148 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000DS=0B05 ES=0B05 SS=0B05 CS=0B05 IP=0100 NV UP EI PL ZR NA PE NC0B05:0100 B82301 MOV AX,0123第30页,共34页,编辑于2022年,星期二装入可执行文件装入可执行文件进行调试命令n指定文件的名称命令l装入文件-N -N -L-L第31页,共34页,编辑于2022年,星期二G指定的断点调试命令命令GG执行正在调试的程序,一直到指定的断点执行正在调试的程序,一直到指定的断点格式:格式:G=G=开始地址开始地址 断点断点1 1 断点断点2 2 默认的段寄存器默认的段寄存器CSCS例如:例如:-G 11A-G 11A 从从IPIP的当前指令开始,直到的当前指令开始,直到11A11A第32页,共34页,编辑于2022年,星期二A汇编用户输入的程序-A-A 起始地址起始地址 默认的地址为默认的地址为 CS:100HCS:100H例如:例如:输入以下的一段程序,汇编跟踪执行输入以下的一段程序,汇编跟踪执行-A-A xxxx:0100 MOV CX,10Dxxxx:0100 MOV CX,10Dxxxx:0104 ADD CX,1Axxxx:0104 ADD CX,1Axxxx:0107 MOV 10D,CXxxxx:0107 MOV 10D,CXxxxx:010B JMP 100 xxxx:010B JMP 100 xxxx:010D 2500 xxxx:010D 2500 xxxx:xxxx:-u-u-r-r-t-t第33页,共34页,编辑于2022年,星期二如何保存A或E编辑完成的程序对于刚才的程序,利用下面的命令保存-n -n 给出文件名称给出文件名称-r bx -r bx 利用利用 BX:CX BX:CX 给出文件的大小给出文件的大小BX 0290BX 0290:0000:0000-r cx-r cxCX 0148CX 0148:00080008-w-wWriting 00012 bytesWriting 00012 bytes给文件的大小要注意,该值十六进制,并且最后一个指给文件的大小要注意,该值十六进制,并且最后一个指令可能大于一个字节令可能大于一个字节第34页,共34页,编辑于2022年,星期二