收藏 分享(赏)

第4讲 汇编语言程序设计1(汇编语言源程序的结构、语句格式、伪指令).ppt

上传人:知足长乐 文档编号:1225570 上传时间:2018-06-19 格式:PPT 页数:55 大小:302.50KB
下载 相关 举报
第4讲 汇编语言程序设计1(汇编语言源程序的结构、语句格式、伪指令).ppt_第1页
第1页 / 共55页
第4讲 汇编语言程序设计1(汇编语言源程序的结构、语句格式、伪指令).ppt_第2页
第2页 / 共55页
第4讲 汇编语言程序设计1(汇编语言源程序的结构、语句格式、伪指令).ppt_第3页
第3页 / 共55页
第4讲 汇编语言程序设计1(汇编语言源程序的结构、语句格式、伪指令).ppt_第4页
第4页 / 共55页
第4讲 汇编语言程序设计1(汇编语言源程序的结构、语句格式、伪指令).ppt_第5页
第5页 / 共55页
点击查看更多>>
资源描述

1、1,第4章 汇编语言程序设计,2,主要内容:,汇编语言源程序的结构汇编语言语句格式伪指令功能调用汇编语言程序设计,3,4.1汇编语言源程序 (1)机器语言二进制数形式的指令和数据。 B0 64 是什么意思?这就是机器语言。既不直观,又不易理解和记忆. MOV AL,64H ;很容易记忆理解,这就是助记符。 (2)助记符用便于记忆的英语单词表示的指令操作码。它反映了指令的功能和主要特征,便于人们理解和记忆。,4,操作数可能放在存储器中,这就涉及操作数的地址。程序中遇到转移指令或调用指令,也需要知道转移地址,若采用具体地址就很不方便,一旦有错,改动也很麻烦。于是人们采用标号或符号来代替地址,例:

2、LP1: MOV AX,VAR LOOP LP1 (3)汇编语言指令助记符,符号地址,标号,伪指令等语言元素的集合以及这些元素使用的规则。 用汇编语言编写的程序叫汇编语言源程序。,指令除了操作码以外,还有一个操作数问题。,5,汇编程序(翻译程序),源程序的编译程序,汇编程序,汇编语言源程序,机器语言目标程序,汇编源程序需翻译成机器语言,变成可执行文件,机器才能执行,这个翻译过程叫汇编。高级语言中称该过程为“解释”或“编译”。执行翻译的程序称为“汇编程序”。,6,汇编语言程序设计与执行过程,输入汇编语言源程序 EDIT/NOTEPAD等 源文件 .ASM汇编(编译) MASM /ASM等 目标文

3、件 .OBJ链接 LINK等 可执行文件 .EXE调试 DEBUG/TD等 最终正确的程序.EXE,目前都把上述的软件集成在统一的环境下,以方便用户使用。,建立、编辑 汇编 连接 运行 调试,7,4.1.1 汇编语言源程序的结构,汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由3个(或4个)逻辑段组成: 数据段存放数据、变量 (附加数据段存放数据、变量) 堆栈段堆栈区域 代码段存放程序指令,8,一个基本的汇编语言程序框架如下: stack SEGMENT PARA stack DB 100 DUP(stack) stack ENDS data SEGMENT data ENDS co

4、de SEGMENT ASSUME CS:code, DS:data, ES:data, SS:stack start: MOV AX, data MOV DS, AX MOV ES, AX MOV AL, 4CH INT 21H code ENDS END start,堆栈段,数据段,代码段,真指令,9,0000:03FF,环境与代码运行,FFFF:0,堆栈段,数据段,代码段,CS:IP,DS,SS:SP,系统起始运行程序,中断向量区(系统专用),栈底,最多4个活动段,分段结构,ES,10,4.1.2 汇编语言的语句与格式,汇编语言的语句有两种:指令性语句由8086指令助记符(真指令)构成

5、的语句指示性语句由伪指令构成的语句指令性语句的格式为: 标号: 指令助记符 目的操作数,源操作数 ; 注释 指示性语句的格式为: 名字 伪指令 操作数1, 操作数2, ,操作数n ; 注释 注:各部分之间至少要用一个空格(或逗号、分号)作为分隔符。,11, 指令性语句(真指令)由CPU执行,每一条指令性语句都有一条机器码指令与其对应; 指示性语句(伪指令)由汇编程序执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。 注意: 指令性语句汇编时生成机器码; 指示性语句汇编时不生成机器码。,12,语句的构成元素:标号指令

6、的符号地址,用来代表指令在存储器中的地址。只能出现在指令性语句中,标号后应加上冒号。名字段、过程、变量的名字,用来代表它们在存储器中的地址。只能出现在指示性语句中,名字后不加冒号。指令助记符8086助记符、伪指令操作数即指令的操作对象对指令性语句(真指令)0,1,2个对指示性语句(伪指令)根据需要而定操作数之间以逗号分隔操作数可以是:寄存器、存储单元、常数或表达式 例如:AX,DI+BX+10,200,16*8+TABLE,等等,13,注释以分号开头,可放在指令后,也可 单独一行。 注意注解的写法。要写指令(段)在程序中的作用,而不要写指令的操作。 例如:以下为同一条指令写的注释 1)MOV

7、CX,100 ;传送100到CX 2)MOV CX,100 ;循环计数器置初值 显然,第二种写法要比第一种写法要好。,14,汇编语言的一个实例: hello.asm data SEGMENTHello DB Hello, world!,0DH,0AH,$data ENDSprog SEGMENT ASSUME CS:prog,DS:datastart: MOV AX,data MOV DS,AX LEA DX,hello;取字符串首地址 MOV AH,9 INT 21H;显示字符串 MOV AH,4CH INT 21H;退回DOSprog ENDS END start,名字,标号,15,4.1

8、.3 数据项与表达式,数据项(操作数的形式)包括常量、标号/名字、变量及表达式。1.常量二进制数,以B结尾。如01001101B。十进制数,如85。十六进制数,以H结尾。第1个数字为A-F时,前面应加0,如0F160H。字符串:用引号括起来的1个或多个字符。 如ERROR!, a,汇编时被翻译成对应的ASCII码45H,52H,52H,4FH,52H,21H, 61H。,16,有三个属性: 段地址:即标号所在段的段地址; 偏移量:标号所代表存储单元的段内偏移地址; 类 型:NEAR或FAR:(SHORT ?) NEAR表示标号所在语句与转移指令/调用指令在同一码段内,跳转时只需改变IP即可。

9、FAR 标号所在语句与转移指令/调用指令不在同一代码段内。跳转时需改变CS和IP即可。 若没有对类型进行说明,默认为NEAR。标号通常作为转移指令或CALL指令的转移地址。,2.标号/名字指令或数据所在内存单元的符号地址,如 Start : MOV AX, data JMP/CALL Start Hello DB 06H,45H,44H,PTR,17,变量即内存中的存储单元或数据区。 变量名是存储单元(数据区)的符号地址 或 名字。变量也有三个属性:段地址变量所在段的段地址偏移量变量单元地址与段首地址之间的位移量。类 型有BYTE、WORD 、DWORD三种之一。变量在程序中作为存储器操作数被

10、引用。,3.变量,如 Start : MOV AX, data,PTR,18,标号和变量名的使用规则:组成:A-Z(不分大小写), 0-9, ? . _ $不能以数字开头,句号(.)只能作为首字符长度小于31个字符不能与保留字(指令助记符、伪指令、预定义符号等)重名不能重复定义例如: 正确的:LP1, AGAIN, NEXT, _GO, OK_1 错误的:4M, LOOP, AAA, #HELP, +ONE,19,4.表达式,表达式是常数、寄存器、标号、变量与运算符的组合。有数字表达式和地址表达式两种。汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运行时不能改变。表达式中的运算符有

11、6类:算术、逻辑、关系、取地址、属性、杂类。,如 Start : MOV AX, 16*8+TABLE,20,用于数字表达式, 例: MOV AX,4*1024 汇编后的形式为: MOV AX,4096 用于地址表达式, 例: LEA SI,TAB+3 若TAB的偏移地址为1000H,则汇编后的形式为: LEA SI,1003H,1)算术运算符 +、-、*、/,MOD,21,逻辑运算符只能用于数字表达式中。 例: MOV CL,36H AND 0FH 经汇编后:MOV CL,06H注意: 不要把逻辑运算符与逻辑运算指令混淆: 例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数

12、被翻译为:3F00H,所以上述指令与 AND AX, 3F00H等价。,2)逻辑运算符 AND、OR、XOR、NOT,22,关系运算的结果是一个逻辑值:真或假 关系为真,结果为全1 关系为假,结果为全0例: MOV BX, PORT GT 300H 若PORT的值大于300H为真,则汇编后为: MOV BX, 0FFFFH 若为假,则汇编后为: MOV BX, 0,3)关系运算符EQ、NE、LT、GT、LE、GE,23,SEG: 取变量/标号的段地址OFFSET:取变量/标号的偏移地址例:VAR DB 12H MOV BX,OFFSET VAR ;取变量VAR的偏移地址 MOV AX,SEG

13、VAR ;取变量VAR的段地址注意: 下面两条指令的异同: MOV BX, OFFSET VAR LEA BX, VAR OFFSET只能取静态的偏移地址; LEA指令即可取静态的偏移地址,也可取动态的偏移地址。,4)取地址运算符SEG、OFFSET,24,TYPE 取变量的类型(1,2,4)LENGTH 取所定义变量的长度 (即变量中元素的个数)SIZE 取所定义存储区的字节数 (=TYPE * LENGTH)例:VAR DW 1,2,3,4,5 则 TYPE VAR = 2 LENGTH VAR = 5 SIZE VAR = 10,5)取值运算符TYPE、LENGTH、SIZE,25,6)

14、属性运算符PTR,用来指定地址操作数的类型。格式: PTR 类型BYTE, WORD, DWORD和 NEAR, FAR ,SHORTBYTE、WORD、DWORD 用于描述数据存储单元(变量)地址NEAR、FAR (SHORT ?) 用于描述转移、调用的目的地址,26,例:MOVBYTE PTRDI,0 ;字节类型 MOVWORD PTRDI,0 ;字类型 MOVDI,0B5H ;类型不定PTR也可用来进行强制类型转换例:STR1 DW ? ;STR1定义为字类型 MOVAX,STR1 ;合法 MOVAL,STR1 ;非法 MOV AL,BYTE PTR STR1 ;合法,27,4.2 伪指

15、令,数据定义 伪指令符号定义 伪指令段定义和段寄存器指定伪指令过程定义 伪指令结束 伪指令,由汇编程序执行的指令,它本身不被汇编成机器指令。常用的伪指令有:,28,4.2.1 数据定义伪指令,用于定义变量,即内存单元或数据区。数据定义伪指令的格式为:变量名 数据定义伪指令 操作数,操作数,常用的数据定义伪指令有如下几种: DB 定义字节 DW 定义字 DD 定义双字操作数可以是常数、变量或表达式,29,例1:DATA_B DB 10,5,10HDATA_W DW 100H,-4DATA_D DD 0FFFBH汇编后的内存分配情况如右图所示。,05H,10H,00H,01H,FCH,FFH,FB

16、H,FFH,00H,00H,0AH,Q,DATA_B,DATA_W,DATA_D,10,5,10H,100H,-4,0FFFBH,30,例2:操作数可以是字符串,例如STR DBHELLO 汇编后的情况如图:,STR,H,E,L,L,O,注意:下面两个定义的不同之处:DBAB ;41H在低字节,42H在高字节(先A后B)DW AB ;42H在低字节,41H在高字节(先B后A),48H,45H,4CH,4CH,4FH,31,操作数?用来保留存储空间,但不存入数据.例3:ABC DB 0,1,2,3,4,OK,$ RSV DW ?,?,?,?,?,?,?,?复制操作符DUP: 重复的数据可以使用复

17、制操作符DUP,如上面RSV亦可写成: RSV DW 8 DUP(?) 若操作数中若使用$,则表示的是地址计数器的当前值。,32,例4: TABLE DB 10 DUP(?) BUFFER DW TABLE,$+3设TABLE的偏移地址为0080H,则汇编后如下图所示:,BUFFER,0080H,80H,TABLE,008AH008BH008CH008DH,.,8DH,00H,00H,0089H,10 Bytes,$,$+3,33,4.2.2 符号定义伪指令,把一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示。类似于C语言中的#define。 符号定义伪指令有两种:EQU,

18、=,用EQU定义的符号未清除前,不能重新定义。清除EQU定义可用PURGE伪指令。用”=”定义的符号可在任何时候进行重定义。二者均不占用存储空间,仅是给符号赋值,34,例:FIVE EQU 5 COUNT EQU CX TEN EQU 10 DIST = BYTE PTRSI+BP GOTO = JMP MOV AX, TEN MOV CX, COUNT ADD DIST, FIVE DIST = WORD PTRSI+BP+1 ADD DIST, AX GOTO LABEL,定义,引用,35,4.2.3 段定义伪指令,汇编语言程序是按段来组织程序和数据的。 和存储器的物理段相对应,汇编语言程

19、序中的段称为逻辑段。汇编连接后被映射到物理段中。3/4类段:代码(程序)、数据/附加数据、堆栈段定义伪指令:SEGMENT、ENDS、ASSUME、ORG定义一个段的基本格式: 段名 SEGMENT 定位类型组合方式类别 段名 ENDS,36,这两个伪指令总是成对出现,二者前面的段名应一致。SEGMENT说明了一个段的开始,ENDS说明了一个段的结束。 对数据段和堆栈段,段中的语句一般是变量定义。 对代码段则是指令语句。如: data SEGMENT data ENDS,SEGMENT和ENDS伪指令,37,ASSUME伪指令,在代码段中,还必须明确段和段寄存器的关系,这由ASSUME语句来指

20、定。如 ASSUME CS:code,DS:data,ES:data,SS:stack 语句中的code和data为段名。 这个语句说明: (1) CS将指向名字为code的代码段 (2) DS和ES将指向名字为data的数据段,38,注意: ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。故下面的语句 MOVAX,data MOVDS,AX MOVES,AX MOVAX,stack MOVSS,AX 将段基址装入段寄存器。如果程序中用到堆栈段,则SS也需装入实际的初值。 代码段基地址不需要程序员装入CS寄存器,而由操作系统(OS)负责装入。,39,S

21、EGMENT语句后可以带有可选参数,用以规定逻辑段的其他一些属性。它的格式为:,1) 定位类型 说明如何确定逻辑段的边界。有4种:PARA(Paragraph): 逻辑段从一个节 (16个字节) 的边界开始。即段的起始地址应能被16整除, 或这说段起始物理地址应为0H。默认类型BYTE : 逻辑段从字节边界开始,即段可以从任何地址开始。WORD : 逻辑段从字边界开始。即段的起始地址必须是偶数。PAGE : 逻辑段从页边界开始。256字节称为一页,故段的起始物理地址应为00H。,也即:PAGE(页边界) - 能被256除;PARA(段边界) -能被16除; WORD(字边界) - (能被2除)

22、;BYTE (字节边界),段名 SEGMENT 定位类型 组合类型 类别,40,2) 组合类型 说明不同模块中同名段的组合方式,共6种:PUBLIC: 所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中。COMMON : 所有此类型的同名段具有相同的起始地址(覆盖),共享相同的存储区域。AT : 按绝对地址定位,段地址就是表达式的值。STACK : 专用于说明堆栈段,组合方式同PUBLICNONE : 不组合 MEMORY :置于地址最高处,多个时取第一个,其余作为COMMON,41,3) 类别 用单引号 括起来的字符串。所有同类别的段被安排在连续的存储区域中。如:在

23、模块1中有段定义: seg1 SEGMENT PARA STACK stack seg1 ENDS 在模块2中有段定义: seg2 SEGMENT PARA STACK stack seg2 ENDS则连接时这两个段被安排在一起。,42,汇编语言源程序的结构简化的段定义,在MASM5.0以上的版本中, 提供了简化的段定义伪指令,使用指定的内存模式编程。,.586.MODEL SMALL.DATA.STACK 100.CODE.STARTUP.EXITEND,;选择指令系统;内存模式说明;定义数据段;定义堆栈段;定义代码段;指示程序开始,初始化DS,SS寄存器;结束程序,返回操作系统,43,内存

24、模式,TINY 程序和数据在64K字节段内SMALL 独立的代码段和独立的数据段MEDIUM 单个数据段,多个代码段COMPACT 单个代码段,多个数据段LARGE 多个代码段,多个数据段,.MODLE 模式,44,简化段定义,简化段定义是MASM 5.0版以后提供的,它较容易使用,和高级语言连接也比较容易,但这种格式并不适用于大多数汇编程序。读者可以按照自己的习惯选择完整段或简化段定义结构。本节简介简化段定义常用结构及与其有关的伪指令。,45,(1)简化段定义常用结构,下面程序给出简化段定义常用结构。注意:当.386等选择处理器伪指令出现在.model之前时表示缺省选择32位指令模式,出现在

25、.model之后时表示缺省选择16位指令模式。,46,程序.MODEL SMALL;定义内存模式为小模式.586 ;选择处理器.STACK 512;定义堆栈段及其尺寸为512字节.DATA;数据段开始;数据在此处定义.CODE;代码段开始.STARTUP ;加载后程序入口点;代码在此处定义.EXIT;返回DOS或父程序 END ;整个程序结束,返回,47,(2)简化段定义常用结构中的伪指令,1)定义存储模型伪指令常用格式:.model 存储模型功能:定义存储模型。,48,常用的存储模型有: TINY SMALL MEDIUM COMPACT LARGE HUGE FLAT,49,2)定义堆栈段

26、尺寸伪指令格式:.stack size功能:建立一个堆栈段并定义其大小说明:若不指定size参数,则使用缺省值1KB,这对大部分程序来讲足够用。,50,(3)有关的预定义符号,CODE:代码段段名。DATA:由.DATA和.STACK定义的段集合成的组名。FARDATA:独立数据段的段名。这些预定义符号类似于用EQU伪指令定义的符号,它们可以在程序中被引用。例如:MOVAX,DATAMOVDS,AX,51,(4)简化段定义举例,例. 在屏幕上显示一串字符。源程序设该程序名为simp.asm,则对其汇编可以使用以下命令:cml /Fl simp.asm汇编连接后生成simp.lst和simp.e

27、xe文件,运行simp.exe后屏幕显示“Hello!”。,52,.MODEL SMALL.586.STACK 64.DATA HIDB HELLO!,0DH,0AH,$.CODE.STARTUPMOV AH,9LEA DX,HIINT 21H.EXITEND,返回,53,显然,与完整段定义相比,.startup和.exit伪指令的引入方便程序设计人员。注意:当.386等选择处理器伪指令出现在.model伪指令之前时不能用.startup和.exit,否则汇编时出错。,54,ORG作用:规定了段内的指令或数据存放的开始地址(偏移地址的初值). 其格式为: ORG 表达式的值即为开始地址,从此地址起连续存放程序或数据。例: ABC SEGMENT ORG 100H begin: ABC ENDS,ORG伪指令,指令从100H开始存放,55,作业:,P193 4.1, 4.2, 4.12, 4.15,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑环境 > 环境科学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报