版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章汇编语言程序格式【课前思考】(1) 建立并运行一个汇编语言程序有几个操作步骤?(2) 指令和伪指令的区别是什么?(3) 在汇编语言程序中,段定义伪指令和数据定义伪指令起什么作用?(4) 变量和标号的类型属性分别有哪几种? (5) 什么是表达式?表达式的优先级顺序是如何排列的?(6) 汇编语言的上机过程是什么?(7) 汇编语言源程序一般由几个段组成?(8) 汇编程序和连接程序的输入、输出文件有哪些?它们的作用是什么?【学习目标】了解编辑程序、汇编程序、连接程序的功能及其输入、输出文件的类型;了解汇编语言源程序的格式;熟练掌握并运用段定义伪指令和数据定义及存储器分配伪指令;熟悉数值表达式的书
2、写规范;上机编程时学会使用debug调试程序。【学习指南】本章介绍了汇编语言程序的完整段和简化段格式。在学习本章及后续各章的内容时,可利用汇编语言程序的框架,通过上机来验证和理解各种指令和伪指令的格式、功能及作用。【难重点】段定义伪指令、数据定义及存储器分配伪指令及其它伪指令;数据类型属性和代码属性及其在编程中的应用;数值表达式的表示及其应用。【知识点】4.1 汇编程序功能4.2 伪指令4.2.1 段定义伪指令 完整的段定义伪指令 存储模型与简化段定义伪指令 段组定义伪指令4.2.3 程序开始和结束伪指令4.2.4 数据定义及存储器分配伪指令4.2.5
3、 表达式赋值伪指令4.2.6 地址计数器与对准伪指令4.2.7 基数控制伪指令 4.3 汇编语言程序格式 4.3.1汇编语言源程序语句的格式 4.3.2 表达式4.3.3 汇编语言源程序格式举例4.4 汇编语言程序的上机过程4.4.1 建立汇编语言的工作环境4.4.2 汇编语言程序上机运行过程4.4.3 com文件第一节汇编程序功能建立, 运行汇编语言程序汇编程序的主要功能:1. 检查源程序,给出出错信息。2. 产生目标文件(.obj)和列表文件(.lst)。3. 展开宏指令。第二节伪指令汇编语言程序中的语句可以由指令、伪指令和宏指令组成。上一章我们介绍了8086指令系统中的6类指令,每一条指
4、令都对应一种cpu操作。伪指令又称为伪操作,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。宏指令是由用户按照宏定义格式编写的一段程序,其中语句可以是指令、伪指令,甚至是已定义的宏指令。宏指令将在第七章中介绍。伪指令和指令的区别在于,每一条指令必须生成机器代码,然后在程序运行期间由cpu来执行其操作;而伪指令是在汇编期间由汇编程序执行的操作命令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。和各种指令一样,伪指令也是程序设计不可缺少的工具。下面介绍一些常用的伪指令。4.2.1 处理器选择伪操
5、作.8086 选择 8086 指令系统.286 选择 80286 指令系统.286p 选择保护模式下的 80286 指令系统.386 选择 80386 指令系统.386p 选择保护模式下的 80386 指令系统.486 选择 80486 指令系统.486p 选择保护模式下的 80486 指令系统.586 选择 pentium 指令系统.586p 选择保护模式下的 pentium 指令系统4.2.2 段定义伪指令段定义伪指令是表示一个段开始和结束的命令,80x86有两种段定义的方式:完整段定义和简化段定义,分别使用不同的段定义伪指令来表示各种段。1完整段定义伪指令的格式如下: 由于assume伪
6、指令只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中:mov ax,data_seg1 ; 数据段地址mov ds,ax ; 存入ds寄存器mov ax,data_seg2 ; 附加段地址mov es,ax ; 存入es寄存器如果程序中还定义了堆栈段stack_seg,也需要把段地址装入ss中:mov ax,stack_seg ; 堆栈段地址mov ss,ax ; 存入es寄存器注意,在程序中不需要用指令装入代码段的段地址,因为在程序初始化时,装入程序已将代码段的段地址装入cs寄存器了。而ds和es是指向一个称为“psp”(
7、程序段前缀)的一块区域的首地址。为了对段定义作进一步地控制,segment伪指令还可以增加类型及属性的说明,其格式如下:段名 segment 定位类型组合类型类别 段名 ends 中的内容是可选的,一般情况下,这些说明可以不用。但是,如果需要用连接程序把本程序与其他程序模块相连接时,就需要提供类型和属性的说明。定位类型:说明段的起始边界值(物理地址)。定位类型说 明byte段可以从任何地址边界开始word段从字边界开始,即段的起始边界值为偶数dword段从双字的边界开始,即段的起始边界值为4的倍数para段从小段边界开始,即段的起始边界值为16 (或10h) 的倍数page段从页边界开始,即段
8、的起始边界值为256 (或100h) 的倍数 注意:定位类型的缺省项是para,即在未指定定位类型的情况下,则连接程序默认为para。byte和word用于把其它段(通常是数据段)连入一个段时使用;dword一般用于运行在80386及后继机型上的程序。组合类型:说明程序连接时的段组合方法。 组合类型说 明private该段为私有段,连接时将不与其它模块中的同名段合并public该段连接时将与其它同名段连接在一起,连接次序由连接命令指定common该段在连接时与其它同名段有相同的起始地址,所以会产生覆盖at 表达式段地址表达式的值,其值必为16位但at不能用来指定代码段memory与public
9、同义stack将多个同名堆栈段连接在一起,sp设置在第一个堆栈段的开始注意:组合类型的缺省项是private。例: 在连接之前已定义两个目标模块如下:模块1 sseg segment para stackdseg1segment para public datadseg2segment paracseg segment para code模块2 dseg1segment para public datadseg2segment paracseg segment para code以上两个模块分别汇编后产生 .obj 文件,经连接程序连接后产生的 .exe模块如下:模块1 cseg segmen
10、t para code模块2 cseg segment para code模块1+2 dseg1segment para public data模块1 dseg2segment para模块2 dseg2segment para模块1 sseg segment para stack2 存储模型与简化段定义伪指令较新版本的汇编程序(masm5.0与masm6.0)除支持完整段定义伪指令外,还提供了一种新的简单易用的存储模型和简化的段定义伪指令。 存储模型伪指令存储模型的作用是什么呢?存储模型决定一个程序的规模,也确定进行子程序调用、指令转移和数据访问的缺省属性(near或far)。当使用简化段定
11、义的源程序格式时,在段定义语句之前必须有存储模型 .model语句,说明在存储器中应如何安放各个段。model伪指令的常用格式如下:. model 存储模型表masm 5.0和masm 6.0支持的存储模型:存储模型功 能适用操作系统tiny (微型)所有数据和代码都放在一个段内,其访问都为near型,整个程序64k,并会产生.com文件。ms-dossmall (小型)所有代码在一个64kb的段内,所有数据在另一个64kb的段内(包括数据段,堆栈段和附加段)。ms-doswindowsmedium (中型)所有代码64k时可放在多个代码段中,转移或调用可为far型。所有数据限在一个段内,ds
12、可保持不变。ms-doswindowscompact(紧凑型)所有代码限在一个段内,转移或调用可为near型。数据64k时,可放在多个段中。ms-doswindowslarge (大型)允许代码段和数据段都可超过64k,被放置在有多个段内,所以数据和代码都是远访问。ms-doswindowshuge (巨型)单个数据项可以超过64k,其它同large模型ms-doswindowsflat (平展型)所有代码和数据放置在一个段中,但段地址是32位的,所以整个程序可为4gb。masm 6.0支持该模型。os/2windowsnt 注意:small 模型是一般应用程序最常用的一种模型,因为只有一个代
13、码段和一个数据段,所以数据和代码都是近访问的。这种模型的数据段是指数据段、堆栈段和附加段的总和。在dos下用汇编语言编程时,可根据程序的不同特点选择前6种模型,一般可以选用small模型。另外,tiny模型将产生com程序,其他模型产生exe程序。flat模型只能运行在32位x86 cpu上,dos下不允许使用这种模型。当与高级语言混合编程时,两者的存储模型应当一致。 简化的段伪指令简化的段定义语句书写简短,语句.code、.data和.stack分别表示代码数据段和堆栈段的开始,一个段的开始自动结束前面一个段。采用简化段指令之前必须有存储模型语句.model。表简化段伪指令的格式如下表:简化
14、段伪指令功 能注释.code 段名创建一个代码段段名为可选项,如不给出段名,则采用默认段名。对于多个代码段的模型,则应为每个代码段指定段名。.data创建一个数据段段名是:_data.data?创建无初值变量的数据段段名是:_bss.fardata 段名建立有初值的远调用数据段可指定段名,如不指定,则将以far_data命名。.fardata? 段名建立无初值的远调用数据段可指定段名,如不指定,则将以far_bss命名。.const建立只读的常量数据段段名是:const.stack 大小创建一个堆栈段并指定堆栈段大小段名是:stack。如不指定堆栈段大小,则缺省值为1kb与简化段定义有关的预定
15、义符号 汇编程序给出了与简化段定义有关的一组预定义符号,它们可在程序中出现,并由汇编程序识别使用。有关的预定义符号如下:(1)code 由.code 伪指令定义的段名或段组名。(2)data 由.data 伪指令定义的段名,或由 .data 、.data?、.const和 .stack所定义的段组名。(3)stack 堆栈段的段名或段组名。下面的举例说明预定义符号的使用方法。在完整的段定义情况下,在程序的一开始,需要用段名装入数据段寄存器,如例4.1中的mov ax,data_seg1mov ds,ax若用简化段定义,则数据段只用.data来定义,而并未给出段名,此时可用mov ax,data
16、 mov ds,ax这里预定义符号data就给出了数据段的段名。简化段定义举例例:.model small.stack 100h ; 定义堆栈段及其大小.data ; 定义数据段.code ; 定义代码段start: ; 起始执行地址标号mov ax, data; 数据段地址mov ds, ax ; 存入数据段寄存器 .mov ax, 4c00hint 21hend start ; 程序结束从例4.3可以看出,简化段定义比完整的段定义简单得多。但由于完整的段定义可以全面地说明段的各种类型与属性,因此在很多情况下仍需使用它。3 段组定义伪指令段组定义伪指令能把多个同类段合并为一个64kb的物理段
17、,并用一个段组名统一存取它。段组定义伪指令group的格式如下:段组名group段名 , 段名 我们已经知道在各种存储模型中,汇编程序自动地把各数据段组成一个段组dgroup,以便程序在访问各数据段时使用一个数据段寄存器ds,而group伪指令允许用户自行指定段组。利用group伪指令定义段组后,段组内统一为一个段地址,各段定义的变量和标号都可以用同一个段寄存器进行访问。4.2.3 程序开始和结束伪指令在程序的开始可以用name或title作为模块的名字,其格式为:name 模块名title 文件名表示源程序结束的伪指令的格式为:end 标号注意:name及title伪指令并不是必需的,如果程
18、序中既无name又无title伪指令,则将用源文件名作为模块名。程序中经常使用title,这样可以在列表文件中打印出标题来。end伪指令中的标号指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程序的end要加上标号,其他子程序模块则只用end而不必指定标号。例4.14.3的最后使用了end start伪指令。汇编程序将在遇end时结束汇编,并且程序在运行时从start开始执行。masm 6.0 版的汇编程序还增加了定义程序的入口点和出口点的伪操作。. startup用来定义程序的初始入口点,并且产生设置ds,ss和sp的代码。若程序中使用了.startup,则结束程序的end伪操作
19、中不必再指定程序的入口点标号。. exit return_value 4.2.4 数据定义及存储器分配伪指令例:例:例:db(define byte)db伪指令用来定义字节,对其后的每个数据都存储在一个字节中。db能定义十进制数、二进制数、十六进制数和ascii字符,二进制数和十六进制数要分别用b和h表示,ascii字符用单引号( )括起来。db还是唯一能定义字符串的伪操作,串中的每个字符占用一个字节。 dw(define word)dw伪指令用来定义字,对其后的每个数据分配2个字节(1个字),数据的低8位存储在低字节地址中,高8位存储在高字节地址中,如下例中的变量data8的数据存储在007
20、0字地址中,其中0070字节存储0bah,0071字节存储03h。dw还可存储变量或标号的偏移地址。见上面dw伪指令的例子。dd(define doubleword)dd伪指令用来定义双字,对其后的每个数据分配4个字节(2个字)。该伪指令同样将数据转换为十六进制,并根据低地址存储低字节,高地址存储高字节的规则来存放数据。如下例data15的存储情况是:00a8:0f2h,00a9h:57h,00aah:2ah,00abh:5ch。用dd存入地址时,第一个字为偏移地址,第二个字为段地址。dq(define quadword)dq伪指令用来定义4字,即64位字长的数据,dq之后的每个数据占用8个字
21、节(4个字)。dt(define ten bytes)dt伪指令用来为压缩的bcd数据分配存储单元,它虽然可以分配10个字节(5个字),但最多只能输入18个数字,要注意的是,数据后面不需要加h。dup(duplicate)dup伪指令可以按照给定的次数来复制某个(某些)操作数,它可以避免多次键入同样一个数据。例如,把6个ffh存入相继字节中,可以用下面两种方法,显然用dup的方法更简便些。存入6字节的ffhdata20 db 0ffh 0ffh 0ffh 0ffh 0ffh 0ffh;data21 db 6 dup(0ffh)ptr属性操作符ptr指定操作数的类型属性,它优先于隐含的类型属性。
22、其格式为:类型 ptr 变量 常数表达式其中类型可以是byte、word、dword、fword、qword或tbyte,这样变量的类型就可以指定了。如下例:(p131 例4.14) label伪指令label可以使同一个变量具有不同的类型属性。其格式为:其中变量的数据类型可以是byte,word,dword。4.2.5 表达式赋值伪操作equequ是一个赋值伪操作(伪指令),它给一个数据标号赋于一个常数值,但这个常数不占用存储单元。当这个数据标号出现在程序中时,汇编程序即用它的常数值代替数据标号。equ可以在数据段之外使用,甚至可用在代码段中间。 使用equ操作的优点可从下面的例子中看出:c
23、ount equ 25counter db countmov al, count= 伪操作 赋值伪操作=的作用与equ类似。它们之间的区别是,equ伪操作中的标号名是不允许重复定义的,而=伪操作是允许重复定义的。注意:在equ语句的表达式中,如果有变量或标号的表达式,则在该语句前应该先给出它们的定义。如上例,alpha必须在beta之前定义,否则汇编程序将指示出错。例如, tmp equ 5 tmp equ tmp+1 则是错误语句,因为tmp已赋值为5,就不能再把它定义为其它数值。而 tmp = 5 tmp = tmp+1 则是允许使用的,因为=伪操作允许重复定义。第一个语句tmp的值为5,
24、第二个语句tmp的值就为6了。4.2.6 地址计数器与对准伪指令1.org 伪操作:生成com程序:2even伪指令even伪指令使下一个变量或指令开始于偶数字节地址。3 align伪指令align伪指令使它后面的数据或指令从2的整数倍地址开始。其格式为:align 2n (n为任意整数)4.2.7 基数控制伪指令 .radix伪指令.radix可以把默认的基数改变为216范围内的任何基数。其格式如下:.radix 基数值其中基数值用十进制数来表示。应当注意,在用 .radix 16把基数定为十六进制后,十进制数后面都应跟字母d。在这种情况下,如果某个十六进制数的末字符为d,则应在其后跟字母h
25、,以免与十进制数发生混淆。4.3 汇编语言程序格式4.3.1汇编语言源程序语句的格式(1) 名字项源程序中用下列字符来表示名字:字母az数字09专用字符 ?、 、-、除数字外,所有字符都可以放在源语句的第一个位置。名字中如果用到则必须是第一个字符。可以用很多字符来说明名字,但只有前面的31个字符能被汇编程序所识别。一般说来,名字项可以是标号或变量。它们都用来表示本语句的符号地址,都是可有可无的,只有当需要用符号地址来访问该语句时它才需要出现。 标号:标号在代码段中定义,后面跟着冒号:,它也可以用label或equ伪操作来定义。此外,它还可以作为过程名定义,这将在以后的章节中加以说明。 变量:变
26、量在数据段或附加数据段中定义,后面不跟冒号。它也可以用label或equ伪操作来定义。变量经常在操作数字段出现。(2)操作项操作项可以是指令、伪指令或宏指令的助记符。对于指令,汇编程序将其翻译为机器语言指令。对于伪指令,汇编程序将根据其所要求的功能进行处理。对于宏指令,则将根据其定义展开。宏指令在第七章中将会专门论述。(3) 操作数项 操作数项由一个或多个表达式组成,多个操作数项之间一般用逗号分开。对于指令,操作数项一般给出操作数地址,它们可能有一个,或二个,或三个,或一个也没有。对于伪操作或宏指令,则给出它们所要求的参数。操作数项可以是常数、寄存器、标号、变量或由表达式组成。(4) 注释项注
27、释项用来说明一段程序、一条或几条指令的功能。对于汇编语言程序来说,注释项的作用是很明显的,它可以使程序容易被读懂,因此汇编语言程序必须写好注释。注释应该写出本条(或本段)指令在程序中的功能和作用,而不应该只写指令的动作。4.3.2 表达式(1) 算术操作符算术操作符有+、-、*、/ 和mod。mod是指除法运算后得到的余数,如19/7的商是2,而19 mod 7则为5(余数)。(2) 逻辑操作符 and、or、xor、not、shl、shr(3) 关系操作符关系操作符有:eq(相等)、ne(不等)、lt(小于)、gt(大于)、le(小于或等于)、ge(大于或等于)。(4) 数值回送操作符typ
28、e、length、size、offset、seg例:(5) 属性操作符属性操作符主要有:ptr、段操作符、short、this、high、low等。 操作符的优先级(p143)操作符的优先级别从高到低排列如下:1. 在圆括号中的项,方括号中的项,结构变量(变量,字段。),然后是length、size、width和mask。2. 名:(段取代)。3. ptr,offset,seg,type,this及段操作符。4. high和low。5. 乘法和除法:*,/,mod。6. 加法和减法:+,-。7. 关系操作:eq,ne,lt,le,gt,ge。8. 逻辑:not。9. 逻辑:and。10. 逻辑
29、:or,xor。11. short。4.3.3 汇编语言源程序格式举例(p144)例1完整段定义格式; title 文件名- 程序主要功能描述;equ 语句;* * * * * * * * * * * * * * * * * * * * * * * * * *datarea segment ;定义数据段;数据定义语句datarea ends;* * * * * * * * * * * * * * * * * * * * * * * * * * prognam segment ;定义代码段;-main proc far ;主程序assume cs:prognam,ds :datareastart
30、: ;程序起始执行地址 ;为程序返回dos设置堆栈值push ds ;入栈保存原ds段址sub ax,ax ;设置偏移地址为0push ax ;入栈保存偏移地址;置ds寄存器为当前数据段mov ax,datarea ;datarea段地址mov ds,ax ; 存入ds寄存器;主程序部分ret ;返回 dosmain endp ;主程序结束;-sub1 proc near;定义子程序;子程序部分sub1 endp ;子程序结束;-prognam ends ;代码段结束;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
31、 * * *end start ;汇编结束例2简化段定义格式 .model small ;定义存储器模型 .stack 100h ;定义堆栈段 .data ;定义数据段; 数据定义语句 .code ;定义代码段main proc farstart: mov ax,data ;数据段地址 mov ds,ax ; 存入ds寄存器;主程序部分 mov ax,4c00h int 21h ;返回dosmain endp ;主程序结束 end start ;汇编结束4.4 汇编语言程序的上机过程4.4.1 建立汇编语言的工作环境 为运行汇编语言程序至少要在磁盘上建立以下文件:1. 编辑程序,如edit.e
32、xe2. 汇编程序,如masm.exe3. 连接程序,如link.exe4. 调试程序,如debug.com必要时,还可建立如cref.exe,exe2bin.exe等文件。4.4.2 汇编语言程序上机运行过程cedit myfile.asmcmasm myfile.asm microsoft (r) macro assembler version 5.00 copyright (c) microsoft corp 1981-1985,1987.all rights reserved.object filename myfile.obj: source listing nul.lst: myfile.lstcross-reference nul.crf: 51646 + 44778 bytes symbol space free 0 warning errors 0 severe errorsclink myfile.objmicrosoft (r) overlay linker version 3.60cop
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东云浮市消防救援支队招聘政府专职消防员21人参考题库附答案
- 2025年澄江市天颐建筑工程有限公司招聘项目用工人员招聘(3人)(公共基础知识)测试题附答案
- 2025广东惠州市市直医疗单位招聘高层次和急需紧缺人才直接业务考核备考题库附答案
- 2025年度湖南天创精工科技有限公司春季招聘模拟试卷附答案
- 2025广东中山市东凤镇人民政府所属事业单位招聘事业单位人员12人(公共基础知识)综合能力测试题附答案
- 2026四川泸州市泸县生态环境局招聘项目调度编外人员1人笔试模拟试题及答案解析
- 2026中国稀土集团有限公司及所属企业招聘41人笔试备考试题及答案解析
- 2026春福建泉州市南安市北山实验小学合同制教师招聘1人笔试模拟试题及答案解析
- 2026黑龙江哈尔滨市通河县第一批公益性岗位招聘62人笔试模拟试题及答案解析
- 2025广东佛山市南方医科大学珠江医院三水医院招聘高层次人才4人笔试参考题库及答案解析
- 多联机安装施工方案
- 神经内科品管圈成果汇报-提高脑卒中偏瘫患者早期自我肢体功能锻炼规范执行率
- 缺血性脑卒中静脉溶栓护理
- 电子电路基础-电子科技大学中国大学mooc课后章节答案期末考试题库2023年
- 四年级科学上册期末试卷及答案-苏教版
- DB51T 2875-2022彩灯(自贡)工艺灯规范
- 小学数学人教版六年级上册全册电子教案
- 主要负责人重大危险源安全检查表
- 《工程经济学》模拟试题答案 东北财经大学2023年春
- 2023-2024学年广西壮族自治区来宾市小学数学五年级下册期末自测试卷
- 2023年福海县政务中心综合窗口人员招聘笔试模拟试题及答案解析
评论
0/150
提交评论