




已阅读5页,还剩65页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 第第4 4章章 汇编语言程序设计汇编语言程序设计 mov ax,12h call display Jmp 1234h 2 主要内容:主要内容: 汇编语言源程序的结构汇编语言源程序的结构 汇编语言语句格式汇编语言语句格式 伪指令伪指令 功能调用功能调用 汇编语言程序设计汇编语言程序设计 3 4.14.1 汇编语言源程序汇编语言源程序 (1)(1)机器语言机器语言二进制数形式的指令和数二进制数形式的指令和数 据。据。 B0 64B0 64 是什么意思?这就是是什么意思?这就是机器语言机器语言。既不直。既不直 观观, ,又不易理解和记忆又不易理解和记忆. . MOV ALMOV AL,64H64H ;很容易记忆理解,这就是很容易记忆理解,这就是助记助记 符符。 (2)(2)助记符助记符用便于记忆的英语单词表示用便于记忆的英语单词表示 的指令操作码。它的指令操作码。它反映了指令的功能和主要特征反映了指令的功能和主要特征, , 便于人们理解和记忆。便于人们理解和记忆。 4 操作数可能放在存储器中操作数可能放在存储器中, ,这就涉及这就涉及操作数的地址操作数的地址。程。程 序中遇到转移指令或调用指令序中遇到转移指令或调用指令, ,也需要知道转移地址也需要知道转移地址, ,若采若采 用具体地址就很不方便用具体地址就很不方便, ,一旦有错,改动也很麻烦。于是一旦有错,改动也很麻烦。于是 人们人们采用采用标号或符号标号或符号来代替来代替地址地址, ,例:例: LP1LP1: : MOV AX, MOV AX,VARVAR LOOP LOOP LP1LP1 (3)(3)汇编语言汇编语言指令助记符指令助记符, ,符号地址,标号,符号地址,标号, 伪指令等语言元素的集合以及这些元素使用的规则。伪指令等语言元素的集合以及这些元素使用的规则。 用汇编语言编写的程序叫用汇编语言编写的程序叫汇编语言源程序汇编语言源程序。 指令除了操作码以外指令除了操作码以外, ,还有一个还有一个操作数问题操作数问题。 5 汇编程序汇编程序( (翻译程序翻译程序) ) 源程序的编译程序 汇编程序 汇编语言 源程序 机器语言 目标程序 汇编源程序需翻译成机器语言汇编源程序需翻译成机器语言, ,变成可执行变成可执行 文件文件, ,机器才能执行机器才能执行, ,这个翻译过程叫这个翻译过程叫汇编汇编。 高级语言中称该过程为高级语言中称该过程为“ “解释解释” ”或或“ “编译编译” ”。执。执 行翻译的程序称为行翻译的程序称为“ “汇编程序汇编程序” ”。 6 汇编语言程序设计与执行过程汇编语言程序设计与执行过程 输入汇编语言源程序输入汇编语言源程序 EDITEDIT/ /NOTEPAD等 源文件源文件 . .ASMASM 汇编汇编( (编译编译) ) MASM /ASMMASM /ASM等 目标文件目标文件 . .OBJOBJ 链接链接 LINKLINK等 可执行文件可执行文件 . .EXEEXE 调试调试 DEBUG/TDDEBUG/TD等 最终正确的程序最终正确的程序. .EXEEXE 目前都把上述的软件集成在统一的环境 下,以方便用户使用。 建立、编辑建立、编辑 汇编汇编 连接连接 运行运行 调试调试 7 4.1.1 4.1.1 汇编语言源程序的结构汇编语言源程序的结构 汇编语言源程序通常由一个或几个程序汇编语言源程序通常由一个或几个程序 模块组成模块组成, ,每个模块一般由每个模块一般由3 3个个( (或或4 4个个) )逻辑逻辑 段组成:段组成: 数据段数据段存放数据、变量存放数据、变量 ( (附加数据段附加数据段存放数据、变量存放数据、变量) ) 堆栈段堆栈段堆栈区域堆栈区域 代码段代码段存放程序指令存放程序指令 8 一个基本的汇编语言程序框架如下:一个基本的汇编语言程序框架如下: stackstack SEGMENT PARA SEGMENT PARA stackstack DB 100 DUP( DB 100 DUP( stackstack ) ) stackstack ENDS ENDS datadata SEGMENT SEGMENT data data ENDS ENDS codecode SEGMENT SEGMENT ASSUME CSASSUME CS: :codecode, DS, DS: :datadata, ES, ES: :data, data, SS:SS:stackstack start:start: MOV AX, MOV AX, datadata MOV DS, AX MOV DS, AX MOV ES, AX MOV ES, AX MOV AL, 4CH MOV AL, 4CH INT 21HINT 21H codecode ENDS ENDS END END start start 堆栈段 数据段 代码段 真指令 9 0000:03FF 环境与代码运行 FFFF:0 堆栈段 数据段 代码段 CS:IP DS SS:SP 系统起始运行程序 中断向量区 (系统专用) 栈底 最多4 个活 动段 分段结构 ES 10 4.1.4.1.2 2 汇编语言的语句类型与格式汇编语言的语句类型与格式 汇编语言的语句有两种:汇编语言的语句有两种: 指令性语句指令性语句由由80868086指令助记符指令助记符( (真指令真指令) )构成的语句构成的语句 指示性语句指示性语句由由伪指令伪指令构成的语句构成的语句 指令性语句指令性语句的格式为:的格式为: 标号标号 : : 指令助记符指令助记符 目的操作数目的操作数, 源操作数源操作数 ; ; 注释注释 指示性语句指示性语句的格式为:的格式为: 名字名字 伪指令伪指令 操作数操作数1, 1, 操作数操作数2, 2, ;注释注释 注:注:各部分之间至少要用一个各部分之间至少要用一个空格空格( (或逗号、分号或逗号、分号) )作为分隔符。作为分隔符。 11 指示性语句指示性语句( (伪指令伪指令) )由汇编程序由汇编程序执行执行。它。它 指出汇编程序应如何对源程序进行汇编,如指出汇编程序应如何对源程序进行汇编,如 何定义变量、分配存储单元以及指示程序开何定义变量、分配存储单元以及指示程序开 始和结束等。始和结束等。指示性语句指示性语句无无机器码指令与其机器码指令与其 相对应。相对应。 指令性语句指令性语句( (真指令真指令) )由由CPUCPU执行执行,每一条每一条 指令性语句都指令性语句都有有一条机器码指令与其对应;一条机器码指令与其对应; 注意注意: : 指令性语句指令性语句汇编时汇编时生成生成机器码;机器码; 指示性语句指示性语句汇编时汇编时不生成不生成机器码。机器码。 12 语句的构成元素:语句的构成元素: 1. 1.标号标号指令的符号地址,用来代表指令在指令的符号地址,用来代表指令在存储器中的地址存储器中的地址。只只 能出现能出现在指令性语句在指令性语句中,标号后应中,标号后应加加上冒号。上冒号。 2. 2.名字名字段、过程、变量或宏的名字,用来代表它们在段、过程、变量或宏的名字,用来代表它们在存储器中存储器中 的地址的地址。只能出现只能出现在指示性语句在指示性语句中,名字后中,名字后不加不加冒号。冒号。 n n 标号与名字标号与名字统称为统称为标识符标识符一般最多由一般最多由3131个字母、数字及规个字母、数字及规 定的特殊符号(如定的特殊符号(如 _ _、$ $、? ?、)组成,不能以数字开头)组成,不能以数字开头 。默认情况下,汇编程序不区别标识符中的字母大小写。默认情况下,汇编程序不区别标识符中的字母大小写 n n 一个程序中,每个标识符的定义是唯一的,还不能是汇编语言采一个程序中,每个标识符的定义是唯一的,还不能是汇编语言采 用的保留字用的保留字 n n 保留字保留字是汇编程序已经利用的标识符,主要有:是汇编程序已经利用的标识符,主要有: o o 真指令助记符真指令助记符例如:例如:MOVMOV、ADDADD o o 伪指令助记符伪指令助记符例如:例如:DBDB、EQUEQU o o 操作符操作符例如:例如:OFFSETOFFSET、PTRPTR o o 寄存器名寄存器名例如:例如:AXAX、CSCS 13 3. 3.指令助记符指令助记符80868086真指令、伪指令助记符真指令、伪指令助记符 4. 4.操作数操作数即即指令的操作对象指令的操作对象 对对指令性语句指令性语句( (真指令真指令) )0 0,1 1,2 2个个 对对指示性语句指示性语句( (伪指令伪指令) )根据需要而定根据需要而定 操作数之间以逗号分隔操作数之间以逗号分隔 操作数可以是:寄存器、存储单元、常数或操作数可以是:寄存器、存储单元、常数或表达式表达式 例如:例如:AXAX,DI+BX+10DI+BX+10,200200,16*8+TABLE16*8+TABLE,等等,等等 14 例如:例如:以下为同一条指令写的注释以下为同一条指令写的注释 1 1)MOV CX,100 ;MOV CX,100 ;传送传送100100到到CXCX 2 2)MOV CX,100 ;MOV CX,100 ;循环计数器置初值循环计数器置初值 显然,第二种写法要比第一种写法要好。显然,第二种写法要比第一种写法要好。 5. 5.注释注释以分号开头,可放在指令后,也可单独一行。以分号开头,可放在指令后,也可单独一行。 注意注解的写法。注意注解的写法。要写指令(段)在程序中的要写指令(段)在程序中的作用作用, 而不要写指令的操作。而不要写指令的操作。 注释不能加程序的汇编,不生成目标程序,只为阅读方 便。 15 汇编语言的一个实例: hello.asm datadata SEGMENT SEGMENT Hello DB Hello, world!,0DH,0AH data data ENDSENDS progprog SEGMENT SEGMENT ASSUME CS:prog,DS:data start: MOV AX,data MOV DS,AX LEA DX,hello;取字符串首地址 MOV AH,9 INT 21H;显示字符串 MOV AH,4CH INT 21H;退回DOS progprog ENDS ENDS END END startstart 名字 标号 16 4.1.4.1.3 3 数据项与表达式数据项与表达式 1 1常量常量 二进制数二进制数, ,以以B B或或b b结尾结尾。如。如0100110101001101B B。 十进制数十进制数, ,以字母以字母D D或或d d结尾结尾, ,缺省情况下,后缀缺省情况下,后缀D D或或d d 可以省略如可以省略如8585。 十六进制数十六进制数, ,以以H H结尾结尾。以字母。以字母A AF F开头的十六进制开头的十六进制 数,前面要用数,前面要用0 0表达,以避免与其他符号混淆,如表达,以避免与其他符号混淆,如 0 0F160F160H H。 字符串字符串:用:用引号括起来引号括起来的的1 1个或多个字符。个或多个字符。 如如 ERROR!ERROR! , , a a , ,汇编时被翻译成对应的汇编时被翻译成对应的ASCIIASCII码码 4 45H,52H,52H,4FH,52H,21H, 61H5H,52H,52H,4FH,52H,21H, 61H。 数据项数据项(操作数的形式操作数的形式) )包括包括常量常量、标号标号/ /名字名字、 变量变量及及表达式表达式。 17 有三个有三个属性:属性: 段地址段地址:即标号所在段的段地址;:即标号所在段的段地址; 偏移量偏移量:标号所代表存储单元的段内偏移地址;:标号所代表存储单元的段内偏移地址; 类类 型型:NEARNEAR或或FARFAR NEARNEAR表示标号所在语句与转移指令表示标号所在语句与转移指令/ /调用指令在同一调用指令在同一 码段内码段内, ,跳转时只需改变跳转时只需改变IPIP即可。即可。 FAR FAR 标号所在语句与转移指令标号所在语句与转移指令/ /调用指令不在同一代调用指令不在同一代 码段内。跳转时需改变码段内。跳转时需改变CSCS和和IPIP即可。即可。 若没有对类型进行说明若没有对类型进行说明, ,默认为默认为NEARNEAR。 标号标号通常作为通常作为转移指令转移指令或或CALLCALL指令指令的转移地址。的转移地址。 2.2.标号标号/ /名字名字指令或数据所在内存单元的符号地址指令或数据所在内存单元的符号地址 如 Start : MOV AX, data JMP/CALL Start Hello DB 06H,45H,44H PTR 18 变量也有三个变量也有三个属性属性: : 段地址段地址变量所在段的段地址变量所在段的段地址 偏移量偏移量变量单元地址与段首地址之间的位移量。变量单元地址与段首地址之间的位移量。 类类 型型有有BYTEBYTE、WORD WORD 、DWORDDWORD三种之一。三种之一。 变量变量在程序中作为在程序中作为存储器操作数存储器操作数被引用。被引用。 3.3.变量变量 如 Start : MOV AX, data PTR 变量变量即内存中的存储单元或数据区。即内存中的存储单元或数据区。 变量名变量名是存储单元是存储单元( (数据区数据区) )的的符号符号地址地址 或或 名字名字。 19 例如:例如: 正确的正确的 :LP1, AGAIN, NEXT, _GO, OK_1LP1, AGAIN, NEXT, _GO, OK_1 错误的错误的 :4M, LOOP, AAA, #HELP, +ONE4M, LOOP, AAA, #HELP, +ONE 标号和变量名标号和变量名的使用规则的使用规则: : 组成组成:A-Z(A-Z(不分大小写不分大小写), 0-9, ), 0-9, ? . . _ $ _ $ 不能不能以数字开头,以免与十六进制数相混。以数字开头,以免与十六进制数相混。 长度长度小于小于3131个字符个字符 不能与保留字不能与保留字( (指令助记符、伪指令、预定义符号等指令助记符、伪指令、预定义符号等) ) 重名重名 对定义的符号不区分大小写。对定义的符号不区分大小写。 20 注: 变量要事先定义才能使用 变量类型应与指令要求的操作数类型相符。例: MOV BL,V1; 要求V1应该是字节属性的变量。 变量定义后,变量名只对应这个数据区的首地址,若有 这个数据区有若干个数据项时,其地址要改变。 指令中的操作数的段基地址不直接表示出来,是默认的 。在使用变量时,其段属性应与其所指的段寄存器相符, 若不相符,要加上段超越。 21 4 4. .表达式表达式 表达式表达式是常数、寄存器、标号、变量与运算符的是常数、寄存器、标号、变量与运算符的 组合。组合。 有有数字数字表达式表达式和和地址地址表达式表达式两种。两种。 汇编时按汇编时按优先规则优先规则对表达式进行计算,计算出具对表达式进行计算,计算出具 体的体的数值数值或或地址地址。运行时不能改变。运行时不能改变。 表达式中的表达式中的运算符有运算符有6 6类:类:算术、逻辑、关系、算术、逻辑、关系、 取地址、属性、杂类取地址、属性、杂类。 如 Start : MOV AX, 16*8+TABLE16*8+TABLE 22 用于用于地址地址表达式表达式, , 例例: :LEA SI,LEA SI,TAB+3TAB+3 若若TABTAB的偏移地址为的偏移地址为1000H1000H,则汇编后的形式为:,则汇编后的形式为: LEA SI,LEA SI,1003H1003H (1)(1)算术算术运算符运算符 + +、- -、* *、/ /,MODMOD 用于用于数字数字表达式表达式, , 例:例:MOV AX,MOV AX,4*10244*1024 汇编后的形式为汇编后的形式为: : MOV AX,MOV AX,40964096 23 注意注意: : 不要把不要把逻辑运算符逻辑运算符与与逻辑运算指令逻辑运算指令混淆:混淆: 例:例:AND AX, AND AX, 3FC0H AND 0FF00H3FC0H AND 0FF00H 汇编后源操作数被翻译为:汇编后源操作数被翻译为:3F00H3F00H,所以上述指令,所以上述指令 与与 AND AX, AND AX, 3F00H3F00H等价。等价。 (2)(2)逻辑逻辑运算符运算符 ANDAND、OROR、XORXOR、NOTNOT 逻辑运算符逻辑运算符只能用于只能用于数字数字表达式表达式中。中。 例:例: MOV CL,MOV CL,36H AND 0FH36H AND 0FH 经汇编后:经汇编后:MOV CL,MOV CL,06H06H 24 例:例: MOV BX, MOV BX, PORT GT 300HPORT GT 300H 若若PORTPORT的值大于的值大于300H300H为真为真, ,则汇编后为:则汇编后为: MOV BX, MOV BX, 0FFFFH0FFFFH 若若为假为假, ,则汇编后为:则汇编后为: MOV BX, MOV BX, 0 0 (3)(3)关系关系运算符运算符EQEQ、NENE、LTLT、GTGT、LELE、GEGE 关系运算的结果关系运算的结果是一个逻辑值:是一个逻辑值:真真或或假假 关系为真关系为真, ,结果为全结果为全1 1 关系为假关系为假, ,结果为全结果为全0 0 25 (4)(4)取地址取地址运算符运算符SEGSEG、OFFSETOFFSET SEGSEG: 取变量取变量/ /标号的段地址标号的段地址 OFFSETOFFSET:取变量:取变量/ /标号的偏移地址标号的偏移地址 例:例:VAR DB 12HVAR DB 12H MOV BX MOV BX,OFFSET OFFSET VAR VAR ;取变量;取变量VARVAR的偏移地址的偏移地址 MOV AX MOV AX,SEGSEG VAR VAR ;取变量;取变量VARVAR的段地址的段地址 注意:SEG、OFFSET只能对符号地址操作 MOV AX , SEG BX MOV BX , OFFSET SI 26 例:VAR DW 1,2,3,4,5 则则 TYPE TYPE VAR = 2VAR = 2 LENGTH LENGTH VAR = 1VAR = 1 SIZE SIZE VAR = 2VAR = 2 (5)(5)取值取值运算符运算符TYPETYPE、LENGTHLENGTH、SIZESIZE TYPE 取变量的类型(变量的类型(1 1,2 2,4 4) LENGTH 取所定义变量变量的长度 ( (无无DUPDUP时为时为1 1,有时为,有时为DUPDUP前面的值)前面的值) SIZE 取所定义存储区的字节数 (=TYPE * LENGTH) 27 LENGTH和SIZE运算符的具体运算规则是:如果变量是 用重复操作符DUP定义的,那么运算符LENGTH的运算 结果是外层DUP的给定值 (即外层重复次数),如果没 有用DUP定义的变量,运算结果总是1。 而运算符SIZE是LENGTH和TYPE两个运算结果的乘积。 【例】取出变量占存储单元个数。 DATASEGMENT A DBABCDEF BDW10DUP(1,2DUP(2) DATAENDS MOV AX,LENGTH A;1AX MOV BX,LENGTHB;10BX 28 SIZE A = LENGTH A*TYPE A = 1 SIZE B = LENGTH B*TYPE B = 20 若BUFFER存储区是用如下伪指令定义: BUFFER DW 200 DUP(0) 则: TYPE BUFFER 等于2 LENGTH BUFFER等于200 SIZE BUFFER等于400 29 (6)(6)属性属性运算符运算符PTRPTR 用来指定地址操作数的类型。用来指定地址操作数的类型。 格式:格式: PTR 类型类型 BYTE, WORD, DWORDBYTE, WORD, DWORD和和 NEAR, FAR ,NEAR, FAR ,SHORTSHORT BYTEBYTE、WORDWORD、DWORDDWORD 用于描述数据存储单元用于描述数据存储单元( (变量变量) )地址地址 NEARNEAR、FAR FAR (SHORT ?)(SHORT ?) 用于描述转移、调用的目的地址用于描述转移、调用的目的地址 30 例:例:MOVMOVBYTE PTRBYTE PTRDI,0 ;DI,0 ;字节类型字节类型 MOV MOVWORDWORD PTRPTRDI,0 ;DI,0 ;字类型字类型 MOVMOVDI,0B5H ;DI,0B5H ;类型不定类型不定 PTRPTR也可用来进行也可用来进行强制类型转换强制类型转换 例:例:STR1STR1 DW DW ? ;STR1 ;STR1定义为字类型定义为字类型 MOV MOVAX,STR1 ;AX,STR1 ;合法合法 MOV MOVAL,STR1 ;AL,STR1 ;非法非法 MOV AL, MOV AL,BYTE PTRBYTE PTR STR1STR1 ; ;合法合法 31 7)其它运算符 方括号“ ” 指令中用方括号表示存储器操作数,方括 号的内容表示操作数的偏移地址 例:MOV AX,1000H 段重设运算符“:”它跟在段寄存器名之后,表示段重 设,用来指定一个存储器操作数的段属性而不管其原来 的隐含的段是什么。 例:MOV AX,ES:DI 32 在计算具有多个运算符的表达式值时,按以下规则操作:在计算具有多个运算符的表达式值时,按以下规则操作: 优先级高的先运算,优先级低的后运算。优先级高的先运算,优先级低的后运算。 当优先级相同时,按表达式中从左到右的顺序进行运算当优先级相同时,按表达式中从左到右的顺序进行运算 使用括号可以提高表达式运算的优先级。使用括号可以提高表达式运算的优先级。 表达式中的运算符的优先级表达式中的运算符的优先级 高高 优优 先先 级级 低低 1 1 括号中的项,即(括号中的项,即()和)和 2 2 LENGTHLENGTH,SIZESIZE 3 3 PTRPTR,OFFSETOFFSET,SEGSEG,TYPETYPE 4 4 ,/ /,MODMOD 5 5 + +,- - 6 6 EQEQ,NENE,L L,LELE,GTGT,GEGE 7 7 NOTNOT 8 8 ANDAND 9 9 OROR,XORXOR 33 4.2 4.2 伪指令伪指令 数据定义数据定义 伪指令伪指令 符号定义符号定义 伪指令伪指令 段定义和段寄存器指定段定义和段寄存器指定 伪指令伪指令 过程定义过程定义 伪指令伪指令 结束结束 伪指令伪指令 由汇编程序执行的指令,它本身不被汇编由汇编程序执行的指令,它本身不被汇编 成机器指令。成机器指令。常用的伪指令常用的伪指令有:有: 34 4.2.1 4.2.1 数据定义数据定义伪指令伪指令( (变量定义变量定义) ) 功能功能: :用于定义变量的类型,给变量赋初值用于定义变量的类型,给变量赋初值 或给变量分配存储空间。数据定义伪指令的格或给变量分配存储空间。数据定义伪指令的格 式为:式为: 变量名变量名 数据定义伪指令数据定义伪指令 操作数,操作数,操作数,操作数, 常用的数据定义伪指令有如下几种:常用的数据定义伪指令有如下几种: DBDB 定义定义字节字节 DWDW 定义定义字字 DDDD 定义定义双字双字 DQ DQ 定义定义四字四字 DT DT 定义定义十字节十字节 35 n变量名为用户自定义标识符,表示操作数首元素的逻辑 地址;用这个符号表示地址,常称为符号地址 n变量名可以没有。这种情况,汇编程序将直接为初值表 分配空间,无符号地址 n设置变量名是为了方便存取它指示的存储单元 变量名 36 操作数操作数 n n 操作数是用逗号分隔的参数操作数是用逗号分隔的参数 n n 主要由数值常数、字符串、表达式或?、主要由数值常数、字符串、表达式或?、DUPDUP组成组成 ?表示初值不确定,即未赋初值;表示初值不确定,即未赋初值; DUPDUP表示重复初值表示重复初值 DUPDUP的格式为:的格式为: 重复次数重复次数 DUP(DUP(重复参数重复参数) ) 37 1)1)定义字节单元伪指令定义字节单元伪指令DBDB DBDB伪指令用于分配一个或多个伪指令用于分配一个或多个字节字节单元,并可以将它们初始化为指单元,并可以将它们初始化为指 定值定值 初值表中每个数据一定是字节量(初值表中每个数据一定是字节量(ByteByte),存放一个),存放一个8 8位数据:位数据: n n 可以是可以是02550255的无符号数的无符号数 n n 或是或是128128127127带符号数带符号数 n n 也可以是也可以是字符串常数字符串常数 datadatasegmentsegment;数据段;数据段 X X db a,-5db a,-5 db 2 dup(100),?db 2 dup(100),? Y Y db ABCdb ABC datadataendsends 字节单元定义实例字节单元定义实例 38 2)2)定义字单元伪指令定义字单元伪指令DWDW DWDW伪指令用于分配一个或多个伪指令用于分配一个或多个字单元字单元,并可以将它们初始化为指,并可以将它们初始化为指 定值定值 初值表中每个数据一定是字量(初值表中每个数据一定是字量(WordWord),一个字单元可用于存放),一个字单元可用于存放 任何任何1616位数据:位数据: n n 一个段地址一个段地址 n n一个偏移地址一个偏移地址 n n 两个字符两个字符 n n 0 06553565535之间的无符号数之间的无符号数 n n 32768327683276732767之间的带符号数之间的带符号数 datadatasegmentsegment;数据段;数据段 countcountdw 8000h,?,ABdw 8000h,?,AB maxintmaxintequ 64hequ 64h numbernumberdw maxintdw maxint arrayarraydw maxint dup(0)dw maxint dup(0) datadataendsends 字单元定义实例字单元定义实例 39 3)3)定义双字单元伪指令定义双字单元伪指令DDDD DDDD伪指令伪指令用于分配一个或多个双字单元,并可以用于分配一个或多个双字单元,并可以 将它们初始化为指定值将它们初始化为指定值 初值表中每个数据是一个初值表中每个数据是一个3232位的双字量(位的双字量(Double Double WordWord):): n n 可以是有符号或无符号的可以是有符号或无符号的3232位整数位整数 n n 也可以用来表达也可以用来表达1616位段地址(高位字)和位段地址(高位字)和1616 位的偏移地址(低位字)的远指针位的偏移地址(低位字)的远指针 varddvarddDD 0,?,12345678hDD 0,?,12345678h farpointfarpointDD 00400078hDD 00400078h 40 例例1 1: DATA_B DATA_B DBDB 10,5,10H 10,5,10H DATA_W DATA_W DWDW 100H,-4 100H,-4 DATA_D DATA_D DDDD 0FFFBH 0FFFBH 汇编后的内存分配情况汇编后的内存分配情况 如右图所示。如右图所示。 05H 10H 00H 01H FCH FFH FBH FFH 00H 00H 0AH Q DATA_BDATA_B DATA_WDATA_W DATA_DDATA_D 1010 5 5 10H10H 100H100H - -4 4 0FFFBH0FFFBH 41 例例2 2:操作数可以是字符串,例如操作数可以是字符串,例如 STRSTR DB DB HELLOHELLO 汇编后的情况如图:汇编后的情况如图: STRH E L L O 注意:下面两个定义的不同之处: DBAB ;41H在低字节,42H在高字节(先A后B) DW AB ;42H在低字节,41H在高字节(先B后A) 48H 45H 4CH 4CH 4FH 注意:3个及其以上的 字符,只能用DB定义 42 操作数操作数? ?用来保留存储空间用来保留存储空间, ,但不存入数据但不存入数据 . . 例例3 3:ABC DB 0,1,2,3,4,ABC DB 0,1,2,3,4, OKOK , , $ $ RSV DW RSV DW ?,?,?,?,?,?,?,?,?,?,?,?,?,?,? 复制操作符复制操作符DUPDUP: : 重复的数据可以使用复制操作符重复的数据可以使用复制操作符DUPDUP, ,如如 上面上面RSVRSV亦可写成亦可写成: : RSV RSV DWDW 8 8 DUPDUP( (? ?) ) 43 4.2.2 4.2.2 符号定义符号定义伪指令伪指令 把一个表达式用一个符号表示,以后凡出现把一个表达式用一个符号表示,以后凡出现 该表达式的地方都可用这个符号表示。该表达式的地方都可用这个符号表示。 符号定义伪指令有符号定义伪指令有两种两种:EQUEQU,= = 用用EQUEQU定义的符号未清除前定义的符号未清除前, ,不能重新定义不能重新定义 。 用用” ”= =” ”定义的符号可在任何时候进行重定义定义的符号可在任何时候进行重定义 。 二者二者均不占用存储空间均不占用存储空间, ,仅是给符号赋值仅是给符号赋值 44 1 1、EQUEQU CR CR EQUEQU 0DH 0DH ;常数;常数 A A EQU EQU ASC - TABLEASC - TABLE ;变量(事先已定义);变量(事先已定义) STR STR EQU EQU 64 102464 1024 ;数值表达式;数值表达式 ADR ADR EQU EQU ESES:BP + DI + 5 BP + DI + 5 ;地址表达式;地址表达式 n n EQUEQU不允许对一个符号重复定义。不允许对一个符号重复定义。 2 2、等号语句等号语句 = = 同同 EQU EQU ,但可重新定义一个符号。,但可重新定义一个符号。 COUNT COUNT = = 100 100 同同 COUNT EQU 100COUNT EQU 100 CONNT CONNT = = 57 COUNT57 COUNT重新定义重新定义 45 例:例:FIVEFIVE EQUEQU 5 5 COUNTCOUNT = = 10 10 DIST DIST = = BYTE PTRSI+BP BYTE PTRSI+BP GOTO GOTO = = JMP JMP MOV AX, MOV AX, TENTEN MOV CX, MOV CX, COUNTCOUNT ADD ADD DISTDIST, , FIVEFIVE DISTDIST = = WORD PTRSI+BP+1 WORD PTRSI+BP+1 ADD ADD DISTDIST, AX, AX GOTOGOTO LABEL LABEL 定义 引用 46 4.2.3 4.2.3 段定义段定义伪指令伪指令 汇编语言程序是按段来组织程序和数据的。汇编语言程序是按段来组织程序和数据的。 和存储器的物理段相对应,汇编语言程序中的段和存储器的物理段相对应,汇编语言程序中的段 称为逻辑段。汇编连接后被映射到物理段中。称为逻辑段。汇编连接后被映射到物理段中。 3/43/4类段:代码类段:代码( (程序程序) )、数据、数据/ /附加数据、堆栈附加数据、堆栈 段定义伪指令:段定义伪指令:SEGMENTSEGMENT、ENDSENDS 定义一个定义一个段的基本格式:段的基本格式: 段名段名 SEGMENTSEGMENT 定位类型定位类型组合方式组合方式类别类别 段名段名 ENDSENDS 47 这两个伪指令总是成对出现,二者前面的段名这两个伪指令总是成对出现,二者前面的段名 应一致应一致, ,但不能与保留字重名但不能与保留字重名. .SEGMENTSEGMENT说明了说明了 一个段的开始,一个段的开始,ENDSENDS说明了一个段的结束。说明了一个段的结束。 对数据段和堆栈段,段中的语句一般是对数据段和堆栈段,段中的语句一般是变量变量 定义定义。 对代码段则是对代码段则是指令语句指令语句。 如:如: data data SEGMENTSEGMENT data data ENDSENDS SEGMENTSEGMENT和ENDSENDS伪指令伪指令 48 SEGMENT SEGMENT语句后可以语句后可以带有可选参数带有可选参数,用以用以规定逻规定逻 辑段的其他一些辑段的其他一些属性属性。它的格式为:。它的格式为: 1 1. . 定位类型定位类型 说明说明如何确定逻辑段的边界如何确定逻辑段的边界。有。有4 4种:种: PARAPARA(Paragraph):(Paragraph): 逻辑段从一个节 (16个字节) 的边 界开始。即段的起始地址应能被16整除, 或这说段起始 物理地址应为0H。默认类型 BYTE :BYTE : 逻辑段从字节边界开始,即段可以从任何地址 开始。 WORD :WORD : 逻辑段从字边界开始。即段的起始地址必须是 偶数。 PAGE :PAGE : 逻辑段从页边界开始。256字节称为一页,故 段的起始物理地址应为00H。 也即:PAGE(页边界) - 能被256除;PARA(段边界) -能 被16除; WORD(字边界) - (能被2除);BYTE (字节边界) 段名 SEGMENT 定位类型 组合类型 类别 49 2.2.组合类型 组合类型 功能:用在具有多个模块的程序中,用于说明不同模块中 同名段的组合方式,共6种: NONE : 本段与其它逻辑段不组合 。 PUBLIC: 所有此类型的同名段组合成一个逻辑段,公 用一个段地址,运行时装入同一个物理段中,构成一个 大的逻辑段。 STACK : 专用于说明堆栈段,组合方式同PUBLIC COMMON : 所有此类型的同名段具有相同的起始地址( 覆盖),各个逻辑段重叠在一起,共享相同的存储区域 。 MEMORY :本逻辑段置于地址最高处,多个时取第一个 ,其余作为COMMON AT :使段地址是表达式所计算出来的16 位值,CS除外。 50 【例】有两个模块,各模块段定义如下 模块1: DATA1SEGMENT PARA PUBLIC DATA1 M1DB 45H DUP(0) DATA1ENDS DATA2SEGMENT PARA COMMON DATA2 N1 DB 102H DUP(0) DATA2ENDS END 模块2: DATA1SEGMENT PARA PUBLIC DATA1 M2DB 104H DUP(11H) DATA1ENDS DATA2SEGMENT PARA COMMON DATA2 N2DB 105H DUP(0) DATA2ENDS DATA3SEGMENT T1DB 50 DUP(20H) DATA3ENDS END 51 该段的定位组合方式示意图如图所示 。 52 3. 3.类别类别 用用单引号单引号 括起来的字符串括起来的字符串。如代码段。如代码段 CODECODE” ”所有所有同类别的段同类别的段被安排在被安排在连续连续的存储区域的存储区域 中中。类别名相同的逻辑段按出现的先后顺序排列。类别名相同的逻辑段按出现的先后顺序排列. . 如:在模块如:在模块1 1中有段定义:中有段定义: seg1 seg1 SEGMENT PARA STACK SEGMENT PARA STACK stackstack seg1 ENDS seg1 ENDS 在模块在模块2 2中有段定义:中有段定义: seg2 seg2 SEGMENT PARA STACK SEGMENT PARA STACK stackstack seg2 ENDS seg2 ENDS 则连接时这两个段被安排在一起。则连接时这两个段被安排在一起。 53 4.2.44.2.4设定段寄存器设定段寄存器伪指令伪指令 ASSUME ASSUME伪指令用于伪指令用于指明指明已定义的已定义的段与段寄存器之间关段与段寄存器之间关 系系。 格式为格式为: :ASSUME ASSUME 段寄存器:段名段寄存器:段名 ,段寄存器:段,段寄存器:段 名名 其中段寄存器名必须是其中段寄存器名必须是CS ,DS,ES CS ,DS,ES 和和SSSS中的一个。段名中的一个。段名 必须是由必须是由SEGMENTSEGMENT定义的段中的段名。定义的段中的段名。 也就是说也就是说ASSUMEASSUME指令是告诉汇编程序用指令是告诉汇编程序用SEGMENTSEGMENT指令定指令定 义过的义过的段段的的段段地址将放在哪个地址将放在哪个段段寄存器中寄存器中. . 例: DATA1SEGMENT ADB 1,2,3 DATA1ENDS CODE SEGMENT ASSUME DS ASSUME DS:DATA1DATA1,CSCS:CODECODE CODE ENDS 54 注意注意: : ASSUMEASSUME伪指令伪指令只是告知只是告知汇编程序有关汇编程序有关段段 寄存器与段的关系寄存器与段的关系, ,并并没有没有给段寄存器给段寄存器赋予实际的赋予实际的 初值初值。故下面的语句。故下面的语句 MOVMOVAX,dataAX,data MOV MOVDSDS,AX,AX MOV MOVESES,AX,AX MOV MOVAX,stackAX,stack MOV MOVSSSS,AX,AX 将段基址装入段寄存器将段基址装入段寄存器。如果程序中用到堆栈。如果程序中用到堆栈 段,则段,则SSSS也需装入实际的初值。也需装入实际的初值。 代码段基地址代码段基地址不需要程序员装入不需要程序员装入CSCS寄存器,而寄存器,而 由由操作系统操作系统( (OS)OS)负责装入。负责装入。 55 段定义伪操作:完整的段定义格式举例 data segment ; 定义数据段 data ends ;- extra segment ; 定义附加段 extra ends ;- code segment ; 定义代码段 assume cs:code, ds:data, es:extra start: mov ax, data mov ds, ax ; 段地址 段寄存器 code ends end start 注:汇编时,系统自动将代 码段的段地址装入CS,不 用在程序中初始化,其它 的段则要用指令把其初 始化. 56 结论: 1. ASSUME语句只起指示作用, 没有赋值作用 2. 程序中用到内存操作数时, 应按操作数的寻址方式, 给相应的段寄存器赋值。 57 4.2.4.2.5 5 过程定义过程定义伪指令伪指令PROCPROC、ENDPENDP 过程就是子程序过程就是子程序。一个过程可以被其它程序所。一个过程可以被其它程序所 调用调用( (用用CALLCALL指令指令) ),过程的最后一条指令一般是返,过程的最后一条指令一般是返 回指令回指令(RET)(RET)。 过程定义伪指令的格式为过程定义伪指令的格式为 PROC PROC NEAR/FAR NEAR/FAR 类型类型 RET RET ENDPENDP 注意: 注意:PROCPROC和和ENDPENDP必须成对出现且同一过程的必须成对出现且同一过程的 名字必须相同。名字必须相同。 若为近调用,则 类型可省 58 过程的类型过程的类型有两种:有两种: NEARNEAR表示段内调
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广西南宁市武鸣区2025年英语八下期中预测试题含答案
- 外汇试题及答案
- 8.6.2 直线与平面垂直的判定1课时-2025年高一数学新教材同步课堂精讲练导学案(人教A版2019必修第二册)含答案
- 2025年城市天然气供应协议
- 2025年协作承包协议模板
- 2025年吉林长春商业地产租赁协议书策划范本
- 2025年企业电脑租赁策划合作框架协议
- 粮食生产与储备的智能化综合调度系统
- 物联网在粮食储备管理中的应用探索
- 推动非遗保护传承未来展望及发展趋势
- DB37-T 4825.5-2025 药品、医疗器械、化妆品企业日常监督检查管理规范 第5部分:数据管理
- 2025年江苏省常州市新北区外国语学校八下英语期末学业水平测试模拟试题含答案
- 2025年下半年广东汕尾市委组织部招聘政府聘员拟聘用人员易考易错模拟试题(共500题)试卷后附参考答案
- 关于Photoshop图像处理的试题及答案分享
- 2025-2030年中国运动轮椅行业市场现状供需分析及投资评估规划分析研究报告
- 2025年社会调查与统计分析考试题及答案
- 陪跑企业协议书
- 心肺复苏操作2025版
- 国家开放大学《Web开发基础》形考任务实验1-5参考答案
- 2024年山东省高考物理试卷(真题+答案)
- 汉语词汇与文化智慧树知到期末考试答案章节答案2024年浙江师范大学
评论
0/150
提交评论