




已阅读5页,还剩73页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章汇编与执行一个程序 4 1汇编与执行一个程序4 2COM文件4 3汇编语言程序的编辑 汇编 链接与调试 4 1汇编与执行一个程序 当你编写好一个汇编语言源程序后 需要进行以下的处理过程 计算机才能执行 首先用编辑程序DOSEDIT或其他的编辑程序 将其输入到计算机中 然后 存入磁盘生成汇编语言源程序文件 ASM文件 源程序不能被计算机直接执行 所以要经过汇编程序加以翻译 这个翻译过程称为编译过程或汇编过程 就是把源程序文件翻译成二进制代码所表示的目标文件 OBJ文件 在汇编过程中 汇编程序将会对源程序进行扫描 若源程序中有语法错误 则汇编结束后 汇编程序将指出源文件中的语法错误 你可以重新使用编辑程序来修正源程序中的语法错误 直至得到无误的ASM文件和OBJ文件 OBJ文件虽然已是二进制机器指令码的形式 但计算机仍不能直接执行 还必须用链接程序 LINK EXE 把目标文件与库文件或其它目标文件进行链接和在内存中重新定位 生成可直接执行文件 EXE文件 这时的EXE文件才可以由DOS装入内存储器并运行 汇编过程如图4 1所示 图4 1汇编语言的汇编过程 4 1 1键入与编辑一个源程序例4 1两个十六进制数0123 0025相加 将结果存入BX寄存器中 源程序清单如下 filename L41 ASMSTACKSGSEGMENTPARASTACK STACK DB12DUP STACKSEG STACKSGENDS CODESGSEGMENTPARA CODE BEGINPROCFARASSUMESS STACKSG CS CODESG DS NOTHINGPUSHDSSUBAX AXPUSHAXMOVAX 0123HADDAX 0025HMOVBX AXRETBEGINENDPCODESGENDSENDBEGIN 1 程序中有一个代码段和一个堆栈段 因为不需要数据段和附加段 所以未设定 2 用全屏幕编辑程序EDIT COM建立源程序 文件名取L41 ASM 在DOS状态键入EDIT即可 如 C EDITL41 ASM 并按下Enter键 3 回车后 屏幕上出现EDIT的全屏幕窗口 此时就可以输入或编辑源程序了 当输入 编辑完源程序后 用EDIT的下拉菜单项 FILE 中的 SAVE 项将源文件L41 ASM存入磁盘 这时你的磁盘上就建立了一个名为L41 ASM的汇编语言源程序文件 有关EDIT COM的使用和操作 请读者参考本章4 3节 4 1 2汇编一个程序当你把源程序键入并以名称L41 ASM存入磁盘后 在执行它之前还有两个重要步骤 汇编和链接 1 汇编L41 ASM源程序文件建立后 用汇编程序将该文件翻译为二进制机器指令码 并产生一个OBJ目标文件 L41 OBJ 这个翻译过程称为汇编 常用的汇编程序是宏汇编MASM EXE或小汇编ASM EXE 它的主要功能是 1 检测源程序中的语法错误 并在屏幕上显示出错信息 2 展开宏指令 将在第14章中介绍 3 产生目标文件 并同时产生列表文件LST和交叉参考表文件CRF 注意 在DOS状态下键入MASML41 即可实现对L41 ASM的汇编 操作和汇编过程如图4 2所示 1 C MASML41 2 Microsoft R MacroAssemblerVersion5 00Copyright C MicrosoftCorp1981 1985 1987 Allrightsreserved 3 Objectfilename L41 OBJ Sourcelisting NUL LST L41Cross reference NUL CRF L41 图4 2L41 ASM的汇编过程 图中 1 是汇编命令输入 2 是版本说明以及出版时间 3 提示你默认使用相同的文件名 但你可以改变它 按Enter键即可 再提示你默认不要汇编后程序的列表文件 若不需要只需按Enter键 若要此列表文件 可以键入 L41 按下Enter键 最后提示你默认不要汇编后程序的交叉参考表文件 若不需要只需按Enter键 若要此参考表文件 可以键入 L41 按下Enter键 L41 LST是列表文件 这个文件可同时列出源程序和机器语言程序清单并给出符号表 帮助你调试程序 这时在你的磁盘上就建立了L41 LST文件 可以在DOS状态下 用TYPE命令显示或打印它的内容 如 C TYPEL41 LST结果显示在屏幕上 如图4 3所示 若想打印此显示 按Ctrl P键将打印机连接即可 1 filenamel41 asm20000STACKSGSEGMENTPARASTACK STACK 30000000C DB12DUP STACKSEG 4535441434B55345476 780060STACKSGENDS90000CODESGSEGMENTPARA CODE 100000BEGINPROCFAR 11ASSUMESS STACKSG CS CODESG DS NOTHING1200001EPUSHDS1300012BC0SUBAX AX14000350PUSHAX150004B80123MOVAX 0123H160007050025ADDAX 0025H17000A8BD8MOVBX AX18000CCBRET 19000DBEGINENDP20000DCODESGENDS21ENDBEGINSegmentsandGroups NameLengthAlignCombineClassCODESG 000DPARANONE CODE STACKSG 0060PARASTACK STACK Symbols NameTypeValueAttrBEGIN FPROC0000CODESGLength 000D 图4 3L41 LST列表文件 上述汇编过程 汇编程序将源程序翻译成机器码 并把错误显示在屏幕上 典型的错误一般有 违反命名原则的名称 拼错助记符 运算符 例如将MOV拼成MOVE 以及操作数含有一个未定义的名称等 在汇编程序手册中 你可以找到这些错误码的解释 大约共有100条错误信息 注意 你必须再重新键入编辑程序 在编辑状态下更正源程序 然后再重新汇编 直至产生OBJ文件 才能进行下一步 图4 3是已汇编过的列表文件 汇编程序以L41 LST名称将它存入磁盘 列表的顶端是堆栈段 SEGMENT PROC ASSUME以及END伪指令均不产生机器指令码 此列表不仅显示了源程序的符号指令码 同时把汇编后的机器码以十六进制格式显示在左边 最左边是序号 紧接着是堆栈段或数据段定义的数据或资料以及指令段指令的十六进制偏移地址 堆栈段起始于0000处 当装入内存时 它依据SS寄存器的内容作为堆栈的起始地址 并从此位置计算起 其差距为0个字节处的位置 SEGMENT伪指令中的PARA使得堆栈段定位在可以被16整除的地址 SEGMENT伪指令还通知汇编程序这是一个堆栈 不产生机器指令码 DB伪指令也是对齐在地址0000处 含有12份 STACKSEG 字符串 其机器码是十六进制OC 十进制12 和ASCII码的十六进制表示法 稍后你可以利用DEBUG来观察存储器中的结果 堆栈段于地址Hex0060处结束 即十进制96 12 8 指令段也起始于地址0000处 当装入内存时 它是依据CS寄存器的内容作为地址 并从此地址算起 其差距为0处 由于ASSUME是伪指令 所以第一个产生实际机器码的指令是PUSHDS 它是一条1字节长度的指令 1E 位于差距为0的位置 即偏移地址为0000 次一条指令是SUBAX AX 它是一条2个字节长度的指令 2BC0 放在指令段起始差距为0001的地址 即偏移地址为0001 在例4 1中机器指令的长度有1个字节 2个字节和3个字节 最后一条指令是END 它含有操作数BEGIN 与指令段地址0000的PROC名称有关 此地址就是装入程序后 开始执行程序的地址 2 符号表紧接在程序列表之后的是符号表 第一部分是一个段表 含有在程序中所有定义的段与段组 Groups 以及它们所占的字节长度 定位方法和组合形式 第二部分是一个符号表 含有数据段内各数据栏的名称即变量名 例4 1中不存在此项 符号表中还含有指令段内提供给指令使用的符号名和变量名 例4 1中只有一个BEGIN过程名 3 两次扫描汇编程序对源程序汇编时需要经过两次扫描 其原因之一是向前参考 就是指令可能参考到汇编程序尚未汇编到的标号 在第一次扫描时 汇编程序扫描整个源程序 并将程序所用到的名称与标号建立一个符号表 亦即数据段的变量名与指令段的标号名和过程名 以及它们在程序中的相对地址 第一次扫描决定了将要产生的机器码长度 但并不产生目的码 在第二次扫描时 汇编程序使用第一次扫描所建立的符号表 目前它已知道每个数据栏的长度和指令的长度以及相对地址 所以 它能确定每一条指令所对应的目的码 之后 汇编程序可以依据命令需求而产生OBJ LST与CRF文件 4 1 3链接一个程序OBJ文件几乎是可以执行的目标文件形式 但还不能直接执行 DOS的链接程序LINK EXE就可生成可执行文件EXE 链接文件做下列工作 1 对汇编程序在OBJ文件中留下的空白进行定址 你可以在稍后的LST文件所列出的目的码中看到如 R之类的内容 L41 LST文件所列出的目的码中没有此项 2 若有两个以上的汇编过的OBJ文件 要链接起来而成为一个可执行的文件 EXE 时 就需做结合的工作 例如 两个以上的汇编语言程序或一个汇编语言程序与一个用高级语言编写的程序 C或BASIC 进行结合 3 利用适当的指令初始化EXE文件 以便以后能正确装入内存并执行之 键入LINKL41并按下Enter键即可执行对L41的链接 接着系统会给出一连串的提示内容并等着你回答 如图4 4所示 C LinkL41RunFile L41 EXE ListFile NUL MAP CONLibraries LIB 图4 4LINKL41执行过程 第一个提示要求你输入可执行文件名 使用与源文件相同的文件名即可 第二个提示告诉你 LINK将默认为NUL MAP 即不要MAP文件 MAP文件含有各段的大小与名称表 以及LINK所发现的错误 一个典型的错误是堆栈段没有定义成功 CON回答告诉LINK在屏幕上显示此文件 而不存入磁盘 这样可以节省磁盘空间 并允许你立即查看MAP文件 例4 1中 L41 MAP文件的内容如下所示 起始地址结束地址长度名称类型00000H0005FH00060HSTACKSGSTACK00060H0006CH0000DHCODESGCODE第三个提示的回答是按下Enter键 它告诉LINK其余的选项均采用默认值 DOS手册中包含了对这些选项的说明 在这个过程中 唯一最可能出现的错误是输入了错误的文件名 解决方法是重新启动LINK再作一遍 4 1 4执行一个程序当你把OBJ文件 一个或多个 进行链接 生成一个EXE文件后 就可以不限次数地执行这个EXE文件了 但当你需要改变EXE文件时 就必须修改其源程序 然后再重新汇编生成另外一个OBJ文件 最后再重新链接此OBJ文件 重新生成EXE文件 经过汇编 链接过程后 生成可执行文件EXE 现在你就可以执行这个程序了 键入以下命令以执行此程序 C L41 EXE或C L41 DOS会将扩展名为EXE 或COM 的文件装入内存并执行 然而 此程序未编写显示功能 无法在屏幕上看到结果 例4 1程序的执行结果被存入内存单元 可以利用DEBUG程序的追踪命令 T 逐条执行指令 观察每一步骤的结果 有关DEBUG的用法请参阅第2章2 4节 4 2COM文件 程序经过汇编 链接都会产生EXE格式的可执行文件 EXE文件在链接的过程中会自动地产生一个至少占有512个字节的文件头特殊记录格式 并被安置在磁盘文件 EXE 的开头位置 但你也可以产生一个可执行的COM文件 例如 COMMAND COM就是一个最常用的COM文件 EXE2BIN COM是一个DOS系统程序 它可以将EXE文件转换成COM文件 4 2 1EXE文件与COM文件的差异虽然COM文件是利用EXE2BIN程序将EXE文件转换而成的 但是它们彼此之间仍存在着很大的差异 主要表现在下列几点 1 程序大小 一个EXE文件可以为任意大小 然而一个COM文件被限制在一个段内 最大为64K字节 COM文件总是比原来的EXE文件小 其中一个原因是512个字节的文件头被放置在EXE文件的开始部分 但在COM磁盘文件中却没有 2 堆栈段 一个EXE文件需要自己定义堆栈段 然而系统会自动为COM文件产生堆栈段 因此 当你编写一个将被转换成COM文件的汇编文件时 可以省略定义堆栈段 3 数据段 一个EXE文件通常会定义一个数据段 在需要时 并且将DS寄存器指向数据段的起始地址 COM文件只能在代码段中定义它的资料或数据 4 初始化 EXE文件在刚开始时 要求堆栈段没有任何内容 是空的 并要求设定DS寄存器的初值 因为COM文件并没有堆栈段 也没有数据段 所以省略了这些步骤 当COM文件初始化时 所有的段寄存器都指向程序段的前缀PSP ProgramSegmentPrefix 的开始 PSP是一块占用256字节的内存区域 当COM与EXE被装入存储器时 DOS会自动地将PSP加在程序开始处的前面 由于程序真正的开始位置是相对于PSP起始位置的相对位移100H的地方 因此 在对代码段定义之后 COM文件应使用一条ORG100H伪指令 设定程序的起始地址 以便使程序跳过PSP 接着使用一条JMP指令 跳到程序的真正开始处 如例4 2所示 5 转换 对于EXE及COM两种格式的程序 汇编 链接程序是没有区别的 汇编产生一个OBJ文件 然后链接该OBJ文件 产生一个EXE文件 如果原先是以EXE文件格式 所编写的程序现在就可以执行 如果原先所编写的程序是COM格式 链接程序会产生一个提示信息 Warning NoSTACKSegment 对于这个信息 可以忽略 因为它是假定必须定义堆栈段 利用EXE2BIN程序 再将EXE文件转换成COM文件 假如你有一个源程序是EXE的格式 你可以使用编辑软件修改一些指令 而使其成为COM文件的格式 4 2 2COM文件范例例4 2COM文件程序范例 该程序是将两个字单元FLDA FLDB内容相加 结果存入FLDC单元中 这个程序有以下特点 1 没有堆栈段和数据段 2 ASSUME告诉汇编开始的相对地址 是从代码段的开始算起 CS寄存器包含PSP的开始地址 用ORG伪指令跳过PSP 将程序指针指向指令段地址第100H个字节处 3 JMP指令转移执行程序的控制权 以便跳过数据定义部分 源程序清单如下 filename L42 ASMCODESEGMENTASSUMECS CODE DS CODE SS CODE ES CODEORG100H 程序起始放在PSP之后BEGIN JMPMAIN 跳过数据区 FLDADW250OH 定义数据FLDBDW125OHFLDCDW MAINPROCNEARMOVAX FLDA AX 0250ADDAX FLDB Add0125toaxMOVFLDC AX StoresuminfldcRET Returntodos MAINENDPCODEENDSENDBEGIN 4 2 3COM文件的堆栈对于COM文件 DOS会自动地定义堆栈段 并且设定相同的段地址给四个段寄存器 CS DS ES SS 若64K的地址范围足够存放你的程序 即你的程序长度比64K小得多 DOS会将SP寄存器指向此段的结束位置 将其当作堆栈的顶点 其地址 即偏移地址 为FFFFH 假设64K的地址范围 不足以提供足够的空间给堆栈使用 DOS将堆栈设在存储器结束的地方 对于上述两种情况 DOS都会将空字符放入堆栈中 若你的程序很大或者受存储器的限制 在堆栈中压入字内容时 你必须很小心地处理 使用时应当利用DIR命令或其他方法 以便了解一个文件的大小 它将帮助你了解堆栈的可使用空间 4 3汇编语言程序的编辑 汇编 链接与调试 这一节是对本章内容的练习 通过对汇编语言源程序的编辑 汇编与链接过程的练习与上机操作 可帮助你加深了解可执行文件EXE的初始化需求 掌握使程序正确返回DOS的方法 另外 还要练习如何将EXE文件转换成为COM文件以及COM文件对程序格式的需求 练习中所使用的软件如下 MSDOS环境下 1 全屏幕编辑软件Edit 2 宏汇编MASM 3 TASM汇编 练习内容 1 显示HELLO字符十次 用RET返回DOS 2 显示HELLO字符五次 用INT21H返回DOS 3 将EXE文件转换为COM文件 4 3 1练习一 显示HELLO十次1 程序清单 filenameL43 ASM DATASEGMENT 定义数据段MESGDB HELLO 0DH 0AH 定义字节型字符串0DH回车符 0AH换行符DATAENDS 定义数据段结束 CODESEGMENT 定义指令段ASSUMECS CODE DS DATA 指明段寄存器所对应的段MAINPROCFAR 定义过程或子程序PUSHDS 保存返回地址MOVAX 0PUSHAXMOVAX DATA 设置数据段初值 MOVDS AXMOVCX 10 设置循环次数LAST MOVAH 09 DOS功能调用09 AHMOVDX OFFSETMESG 返回MESG的偏移地址INT21H DOS功能调用LOOPLAST CX 1 CX CX 0转LAST RET 返回DOSMAINENDP 定义过程结束CODEENDS 定义指令段结束ENDMAIN 源程序结束 说明 1 该源程序含有两个段 数据段DATA与指令段CODE 2 数据段定义了 HELLO 字符串 0DH回车符 0AH换行符 3 MOVAH 09是将DOS功能调用号09送AH 09号DOS功能调用的入口参数要求 09 AH DS DX指向字符串首地址 而且字符串必须以 结尾 4 ASSUME伪指令 指明各段对应的寄存器 DS对应数据段 CS对应指令段 5 MAINPROCFARSTART PUSHDSMOVAX 0PUSHAX RETMAINENDPDOS将MAIN视为一个子程序调用 并用RET返回 为数据段寄存器赋初值 6 MOVAX DATAMOVDS AX 7 MOVDX OFFSETMESG是09号DOS功能调用要求的 将MESG的地址返回给DX 8 ENDMAIN 源程序结束 定义代码段 9 CODESEGMENT CODEENDS 定义代码段 10 LOOP是一条循环指令 其操作首先执行CX 1 CX 然后判断CX是否等于0 若CX 0则转到LAST 若CX 0则执行LOOP的下一条指令 2 操作步骤第一步 用EDIT编辑汇编语言源程序文件 命名为L43 ASM 显示操作 进入EDIT软件全屏幕编辑状态 按程序清单逐条输入源程序 第二步 存盘 在编辑状态下 输入完源程序之后 按ALT F键下拉菜单出现 选择下拉菜单中的SAVE保存文件 注意 文件名的扩展名必须是 ASM 例如 L43 ASM 第三步 退出EDIT 存盘后按ALT F键 选择下拉菜单中的EXIT即退出EDIT 返回DOS状态 第四步 对源程序进行汇编 显示操作 汇编结束后会提示错误信息和出错的行号 请记录下出错的行号 从第一步开始 重新进入编辑状态 在编辑状态下改错 显示操作 调出源程序修改错误 直到全部正确 重新存盘 汇编 汇编正确无误后会产生目标文件L43 OBJ 若有错误 则不会产生目标文件L43 OBJ 第五步 链接目标文件 显示操作 链接成功后会产生可执行文件L43 EXE 链接过程中除了操作时输入的命令符有可能出错 一般无错误 第六步 执行可执行文件L43 EXE 显示操作 屏幕上显示十个HELLO字符串 练习一完成 4 3 2练习二 显示HELLO五次1 程序清单 filename L44 ASM DATASEGMENTMESGDB HELLO 0DH 0AH DATAENDS CODESEGMENTASSUMECS CODE DS DATA START MOVAX DATAMOVDS AXMOVCX 5LAST MOVAH 09MOVDX OFFSETMESGINT21HLOOPLAST MOVAH 4CHINT21HMAINENDPCODEENDSENDSTART 说明 1 练习一与练习二相同 均是用DOS功能调用INT21H 功能号09 显示一个字符串 2 不同的是练习二的程序没有以子程序的方式编写 返回DOS的方法 使用DOS功能调用INT21H 功能号为4CH 2 操作步骤第一步 编辑源程序文件 提示 练习二与练习一的程序仅返回DOS的方法不同 程序指令部分完全相同 若使用练习一的源程序文件进行修改会很方便 显示操作进入编辑状态 更改文件名L43 ASM为L44 ASM 操作如下 按ALT F键下拉菜单出现 选择SAVE AS将L43 ASM重新命名为L44 ASM 然后 按L44 ASM当前源程序修改并存盘 汇编 链接产生可执行文件L44 EXE 最后执行L44 EXE文件 方法参考练习一的第一步至第六步 进入编辑状态 更改文件名L43 ASM为L44 ASM 操作如下 按ALT F键下拉菜单出现 选择SAVE AS将L43 ASM重新命名为L44 ASM 然后 按L44 ASM当前源程序修改并存盘 汇编 链接产生可执行文件L44 EXE 最后执行L44 EXE文件 方法参考练习一的第一步至第六步 3 用DEBUG调试该程序可执行文件L44 EXE可以在DOS下直接执行 显示五个HELLO字符 也可以用DEBUG逐条追踪调试 方法如下 第一步 将L44 EXE装入内存 显示操作 第二步 反汇编L44 EXE 注意 观察源程序清单中的各条可执行指令在装入内存中是如何表示的 对照源程序清单逐条阅读理解 显示操作 显示 15A9 0000B8A815MOVAX 15A8 15A9 00038ED8MOVDS AX15A9 0005B90500MOVCX 000515A9 0008B409MOVAH 0915A9 000ABA0000MOVDX 000015A9 000DCD21INT21 说明 1 15A9 0000表示EXE文件存放在指令段偏移地址0000处 2 第1 2条指令确定数据段的段值 其位置在代码段的前面一小节位置处 例如 代码段地址为15A9 0000 而MOVAX 15A8指令中指出DS为15A8 它就是数据段的起始地址15A8 0000 3 MOVDX OFFSETMESG会变为MOVDX 0000 符号地址MESG会变为实际偏移地址0000 第三步 查看数据段内容 根据第一条指令MOVAX 15A8 可以确定数据段的起始地址是15A8 0000 注意 应按你所使用的系统显示来确定 显示操作 显示 15A8 000048454C4C4F0D0A24 0000000000000000HELLO 可以观察到数据段存储的字符串 HELLO 与 第四步 单步追踪程序 注意 软中断指令INT21H不能用T命令直接执行 当执行到INT21H时应按下述方法操作 跳过INT21H 显示操作 这时屏幕会显示HELLO字符 下面仍可继续使用T命令执行 练习二完成 4 3 3练习三 COM文件的生成COM文件不需要分数据段 指令段和堆栈段 数据 堆栈和指令全在一个段内 它们所占有的空间不允许超过64K 因此 在编制较小的程序时很方便 装入速度比EXE文件要快 所占存储空间比EXE文件小 使用COM文件时 程序架构不需要分段 整个程序的入口地址必须是010
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 乐山小学真题数学试卷
- 辽宁广东中考数学试卷
- 难度较易的数学试卷
- 青岛旅游职高数学试卷
- 梁河县中考题数学试卷
- 泸州市三诊数学试卷
- 南山双语四初一数学试卷
- 老师用红笔排数学试卷
- 乐山市中考真题数学试卷
- 黎明小学二模数学试卷
- DB32/T 3390-2018一体化智能泵站应用技术规范
- 2025“铸牢中华民族共同体意识”应知应会网络知识竞赛试题及答案(三套)
- 《患者满意度提升》课件
- 2024年广东省连州市事业单位公开招聘笔试题带答案
- 财务国企面试题目及答案
- 蒙特利尔认知评估量表及评分指导
- 建筑材料招标文件2篇
- 电子工厂品质意识培训
- 2025年初中语文教师招聘面试八年级上册逐字稿之苏州园林八上
- 《中国慢性便秘临床诊断与治疗规范(2024)》解读
- 水果联营合同协议
评论
0/150
提交评论