汇编程序(汇编器)概述_第1页
汇编程序(汇编器)概述_第2页
汇编程序(汇编器)概述_第3页
汇编程序(汇编器)概述_第4页
汇编程序(汇编器)概述_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、汇编程序汇编程序(汇编器汇编器)概述概述 汇编程序的任务是把汇编语言源程序模汇编程序的任务是把汇编语言源程序模块转换为二进制的目标模块。块转换为二进制的目标模块。 伪指令作用伪指令作用 源程序仅包含机器指令语句是不能被汇源程序仅包含机器指令语句是不能被汇编程序翻译成目标程序的。因为汇编程序无编程序翻译成目标程序的。因为汇编程序无法分辨出源程序中分段的情况,无法知道数法分辨出源程序中分段的情况,无法知道数据变量的类型,也不知道源程序的开始和结据变量的类型,也不知道源程序的开始和结束点等等。这就需要在源程序中使用一些固束点等等。这就需要在源程序中使用一些固定格式的约定符号,主要用来告诉汇编程序定格

2、式的约定符号,主要用来告诉汇编程序该如何工作,这就是汇编控制命令(伪指该如何工作,这就是汇编控制命令(伪指令)。令)。 这些汇编控制命令在源程序中只为汇编程这些汇编控制命令在源程序中只为汇编程序所识别,它除了可以申请一部分存储空序所识别,它除了可以申请一部分存储空间和堆栈空间外,不产生任何目标代码,间和堆栈空间外,不产生任何目标代码,即没有对应的机器指令,在将源程序翻译即没有对应的机器指令,在将源程序翻译成目标程序后,这些汇编控制命令就不存成目标程序后,这些汇编控制命令就不存在了。因为这些汇编控制命令的功能都是在了。因为这些汇编控制命令的功能都是靠程序实现的,每条汇编控制命令在汇编靠程序实现的

3、,每条汇编控制命令在汇编程序中都有一段对应的处理程序。程序中都有一段对应的处理程序。 汇编程序在将源程序翻译成目标程序时,汇编程序在将源程序翻译成目标程序时,每当遇到汇编控制语句就转入相应的处理每当遇到汇编控制语句就转入相应的处理程序执行,执行完该处理程序,也就实现程序执行,执行完该处理程序,也就实现了这条汇编控制命令的功能。这也是汇编了这条汇编控制命令的功能。这也是汇编控制指令和机器指令一样都有固定的语句控制指令和机器指令一样都有固定的语句格式。格式。 汇编程序工作过程汇编程序工作过程 汇编程序把源文件转换为目标文件的汇编程序把源文件转换为目标文件的过程需要对源文件进行两遍扫视。汇编程过程需

4、要对源文件进行两遍扫视。汇编程序的输入是源文件(序的输入是源文件(ASM),而主要输出),而主要输出是是OBJ文件和文件和LST文件。文件。 第一遍扫视要确定源程序每一行的偏第一遍扫视要确定源程序每一行的偏移地址,扫视后应提供一张符号表(或称移地址,扫视后应提供一张符号表(或称标识符表),它把源程序所定义符号的偏标识符表),它把源程序所定义符号的偏移地址记录下来。第二遍扫视则产生所要移地址记录下来。第二遍扫视则产生所要求的求的OBJ、LST和和CREF文件。下面将简单文件。下面将简单介绍汇编程序的两遍扫视过程。介绍汇编程序的两遍扫视过程。汇编程序的主要工具汇编程序的主要工具 汇编程序在两遍扫视

5、的过程中用到的主汇编程序在两遍扫视的过程中用到的主要工具有:地址计数器(要工具有:地址计数器(Location counter)。汇编的第一遍扫视过程中,地)。汇编的第一遍扫视过程中,地址计数器的值可以用来确定每条指令的第址计数器的值可以用来确定每条指令的第一个字节的偏移地址及数据段中变量名的一个字节的偏移地址及数据段中变量名的值,这样就可以建立一张符号表。值,这样就可以建立一张符号表。 当开始汇编或在每一段开始时,把地当开始汇编或在每一段开始时,把地址计数器初始化为零,以后在汇编程序扫址计数器初始化为零,以后在汇编程序扫视源文件的过程中,每处理一条指令,地视源文件的过程中,每处理一条指令,地

6、址计数器就增加一个值,此值为该指令所址计数器就增加一个值,此值为该指令所需要的字节数。所以,在汇编过程中,对需要的字节数。所以,在汇编过程中,对于被汇编的每一段来说,地址计数器可以于被汇编的每一段来说,地址计数器可以看作是动态地指向被汇编指令的相对位置看作是动态地指向被汇编指令的相对位置的一个指针。也就是说,在汇编过程中,的一个指针。也就是说,在汇编过程中,地址计数器的内容就是当前正被汇编指令地址计数器的内容就是当前正被汇编指令的偏移地址。的偏移地址。例例 下图中左部为源程序的一段,右部为汇下图中左部为源程序的一段,右部为汇编每个语句时地址计数器的值以及以字节编每个语句时地址计数器的值以及以字

7、节为单位的语句长度。这其中的为单位的语句长度。这其中的ORG伪操作伪操作使地址计数器置成其后表达式所规定的值。使地址计数器置成其后表达式所规定的值。 (location length;* counter) (bytes)data_seg segment 0 0 org 10 0 10num db -29 0ah(10) 1array db 100 dup(?) 0bh(11) 100count dw 5 6fh(111) 2masks db 82h,04h,2ah 71h(113) 3data_seg end 74h(116) ;* code_seg segment 0 0main proc

8、far 0 0 assume cs:code_seg,ds:data_seg 0 0start: mov ax,data_seg 0 3 mov ds,ax 03h(3) 2 mov cx,count 05h(5) 4repeat: dec cx 09h(9) 1 mov ax,4c00h 0ah(10) 3 int 21h 0dh(13) 2 main endp 0fh(15) 0 ;* end start 0fh(15) 0符号表符号表 汇编程序对源程序第一遍扫视的过程中汇编程序对源程序第一遍扫视的过程中建立了符号表,它把用户所定义的符号赋建立了符号表,它把用户所定义的符号赋予当前地址计数

9、器的值。在予当前地址计数器的值。在LST清单的后清单的后部,我们可以看到源文件汇编后的符号表部,我们可以看到源文件汇编后的符号表 Segments and Groups:N a m e Size Align Combine Class CODE_SEG. . . . . . . . . . 000FPARA NONE DATA_SEG 0074 PARA NONE Symbols: N a m e Type Value Attr ARRAY . . . . . . . . . . . L BYTE 000B DATA_SEG Length = 0064COUNT . . . . . . . .

10、 . . . L WORD 006F DATA_SEG MAIN . . . . . . . . . . . F PROC 0000 CODE_SEG Length = 000FMASKS . . . . . . . . . . . L BYTE 0071 DATA_SEG NUM . . . . . . . . . . . . L BYTE 000A DATA_SEG REPEAT . . . . . . . . . . . L NEAR 0009 CODE_SEG START . . . . . . . . . . . L NEAR 0000 CODE_SEG 汇编程序在第一遍扫视后建立了

11、符号汇编程序在第一遍扫视后建立了符号表,在第二遍扫视的过程中,根据符号表、表,在第二遍扫视的过程中,根据符号表、机器指令表和伪操作表把汇编语言指令翻机器指令表和伪操作表把汇编语言指令翻译成机器语言指令,完成汇编任务译成机器语言指令,完成汇编任务 .连接程序的主要功能连接程序的主要功能 经过汇编程序处理而产生的目标模块经过汇编程序处理而产生的目标模块OBJ文件已经是二进制文件了,但它还不文件已经是二进制文件了,但它还不能直接上机运行能直接上机运行.连接程序的主要工作是:连接程序的主要工作是:1) 找到要连接的所有目标模块;找到要连接的所有目标模块; 2) 为所有要连接的目标模块中的所有为所有要连

12、接的目标模块中的所有段分配存储单元,即确定所有段地址值;段分配存储单元,即确定所有段地址值;3) 确定所有汇编程序所不能确定的偏确定所有汇编程序所不能确定的偏移地址值(包括浮动地址及外部符号所对移地址值(包括浮动地址及外部符号所对应的地址);应的地址);4) 构成装入模块,并把它装入存储器。构成装入模块,并把它装入存储器。在多个模块相连接时,各模块的连接在多个模块相连接时,各模块的连接次序是由用户在调用连接程序时指定的。次序是由用户在调用连接程序时指定的。(举例p343.asm,编译、连接、用debug反汇编,看一下符号表中对应的值)例:请把40个字母a的字符串从源缓冲区传送到目的缓冲区。 ;

13、* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * data segment ;define data segmentsource_buffer db 40 dup(a) data ends;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * extra segment ;define extra segmentdest_buffer db 40 dup(?)extra ends;* * * * * * * * * * * * * *

14、* * * * * * * * * * * * * * * * * * * code segment ;define code segment;-main proc far ;main part of programassume cs:code,ds:data,es:extrastart: ;starting executionaddress;set up stack for returnpush ds ;save old data segmentsub ax,ax ;put zero in AX push ax ;save it on stack;set DS register to cur

15、rent data segmentmov ax,data ;data segment addrmov ds,ax ; into DS register;set ES register to current extra segment mov ax,extra ;extra segment addr mov es,ax ;into ES register;MAIN PART OF PROGRAM GOES HERE lea si,source_buffer ;put offset addr of source; buffer in SI lea di,dest_buffer ;put offse

16、t addr of dest ; buffer in DI cld ;set DF flag to forward mov cx,40 ;put count in CX rep movsb ;move entire string ret ;return to DOSmain endp ;end of main part of program;-code ends ;end of code segment;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * end start ;end assembly 交叉引用表列

17、出了程序定义的所有符号及其所在的行号及引用时的交叉引用表列出了程序定义的所有符号及其所在的行号及引用时的行号,用户一般在调试大程序时需要交叉引用表。行号,用户一般在调试大程序时需要交叉引用表。下面是下面是MYFILE.REF文件:文件: Microsoft Cross-Reference Version 5.00 Wed Mar 04 00:34:07 1998Symbol Cross-Reference (# definition, + modification) Cref-1CODE . . . . . . . . . . . . . .17# 21 50 DATA . . . . . . . . . . . . . . 3# 8 21 31 DEST_BUFFER. . . . . . . . . .11# 41 EXTRA. . . . . . . . . . . . . .10# 15 21 35 MAIN . . . . . . . . . . . . . .19# 48SOURC

温馨提示

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

评论

0/150

提交评论