资源预览内容
第1页 / 共67页
第2页 / 共67页
第3页 / 共67页
第4页 / 共67页
第5页 / 共67页
第6页 / 共67页
第7页 / 共67页
第8页 / 共67页
第9页 / 共67页
第10页 / 共67页
亲,该文档总共67页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第5章课程汇编语言程序设计一汇编语言的特点u汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数u利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序u在有些应用领域,汇编语言的作用是不容置疑和无可替代的u汇编程序设计的过程是与其他高级语言程序设计大致相同汇编语言源程序汇编程序可执行指令和伪指令DEBUG、 ASM、 MASM机器语言汇编语言的特点汇编语言源程序示例:DATA SEGMENT M1 DW 00FFH M2 DW 00FFH P1 DW ? P2 DW ? DATA ENDS STACK SEGMENT ST DB 100 DUP (?) TOP EQU LENGTH ST STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,TOP MOV BX,OFFSET M1 MOV AX,BX MOV DX,00H MOV BX,OFFSET M2 MUL WORD PTR BX MOV BX,OFFSET P1 MOV BX,AX MOV BX,OFFSET P2 MOV BX,DX HLT MOV AH,4CH INT 21H CODE ENDS END START 5.1 汇编语言源程序格式u完整的汇编语言源程序由段组成u一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列u需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点u所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内u通常,程序还需要一个堆栈段u整个程序以END结束 源程序由语句序列构成一、汇编语言的语句格式u执行性语句执行性语句用于表达处理器指令(也称为硬指令),汇编后对应一条指令代码。由处理器指令组成的代码序列是程序设计的主体标号: 硬指令助记符 操作数 ; 注释u说明性语句说明性语句用于表达伪指令,指示源程序如何汇编、变量怎样定义、过程怎么设置等名字 伪指令助记符 参数 ;注释1、标号、名字与标识符u标号是反映硬指令位置(逻辑地址)和属性的标识符,后跟一个冒号分隔u名字是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒号u标识符(Identifier)一般最多由31个字母、数字及规定的特殊符号(如 _、$、?、)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写u一个源程序中,每个标识符的定义是唯一的,且不能是汇编系统所采用的保留字名字和标号的属性u名字和标号是用户自定义的标识符。名字用于伪指令,标号用于硬指令。名字和标号一经使用便具有两类属性:u逻辑地址属性名字和标号对应存储单元的逻辑地址,含段地址和偏移地址;u类型属性u变量名的类型可以是BYTE(字节)、WORD(字)和DWORD(双字)等;u标号、段名、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间调用u汇编程序提供有关操作符,以便获取这些属性值保留字u保留字(Reserved Word)是汇编程序已经利用的标识符(也称为关键字),主要有:u硬指令助记符例如:MOV、ADDu伪指令助记符例如:DB、DWu操作符例如:OFFSET、PTRu寄存器名例如:AX、CSu预定义符号例如:data 汇编语言对大小写不敏感2、(硬)指令和伪指令u指令是目标机器所能执行的代码,为目标cpu所执行 使CPU产生动作、并在程序执行时才处理的指令,硬指令就是第4章学习的处理器指令,与具体的处理器有关、与汇编程序无关u伪指令是汇编程序所执行的一些操作,为交叉汇编机器所执行 不产生CPU动作、在程序执行前由汇编程序处理的说明性指令,伪指令与具体的处理器类型无关,但与汇编程序有关。不同版本的汇编程序支持不同的伪指令3、操作数和参数u处理器指令中的操作数可以是立即数、寄存器和存储单元u伪指令中的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔u汇编语言程序中,指令参数有数值型(主要形式是常数和数值表达式)和地址型(主要形式是标号和名字,包括变量名、段名、过程名等)。u例如,硬指令的操作数有立即数、寄存器和存储单元;其中,立即数就要用数值型参数表达,存储单元就应该用地址型参数(存储器操作数)表达。1) 常量u常量表示一个固定的数值,它又分成多种形式常数字符串符号常量数值表达式 常数u指由10、16、2和8进制形式表达的数值,各种进制的数据以后缀字母区分,默认不加后缀字母的是十进制数01100100B由0和1两个数字组成,以字母B/b结尾二进制64H0FFH0B800H由0 9、A F数字组成,以字母H/h 结尾,以字母开头的常数需要加一个前导0十六进制100255D由0 9数字组成,以字母 D/d 结尾(缺省情况可以省略)十进制 字符串u字符串常量是用单引号或双引号括起来的单个字符或多个字符u其数值是每个字符对应的ASCII码值u例如:d(等于64H)AB(等于4142H)Hello, Assembly ! 符号常量u符号常量使用标识符表达一个数值uMASM提供等价机制,用来为常量定义符号名u符号定义伪指令有等价“EQU”和等号“”:符号名 EQU 数值表达式符号名 EQU 不支持符号名 数值表达式uEQU用于数值等价时不能重复定义符号名,但“”允许重复赋值。例如:X = 7 ;等效于:X equ 7X = X+5 ;“X EQU X+5”是错误的符号定义实例:符号定义DosWriteChar equ 2CR = 13CallDOS equ 符号应用(左边的程序段等价右侧的符号形式)mov ah,2 mov ah, DosWriteCharmov dl,13 mov dl, CRint 21h CallDOS 数值表达式u数值表达式一般是指由运算符连接的各种常量所构成的表达式u汇编程序在汇编过程中计算表达式,最终得到一个确定的数值,所以也是常量u表达式的数值在程序运行前的汇编阶段计算,所以组成表达式的各部分必须在汇编时就能确定u汇编语言支持多种运算符u我们经常使用的是加减乘除( * / )u例如:mov ax,3*4+5;等价于:mov ax,172 )变量 u变量实质上是指可以读写的内存单元,虽然内存单元地址不变,但其中存放的数据可以改变u变量需要事先定义才能使用u变量定义(Define)伪指令为变量申请固定长度为单位的存储空间,并可以同时将相应的存储单元初始化u定义后的变量可以通过变量名等方法引用(读写)其中的数据,即变量中的数值 变量的定义 u变量定义的汇编语言格式为:变量名 变量定义伪指令 初值表u变量名为用户自定义的标识符,有时变量名也可以缺省u变量定义伪指令有DB、DW、DD等u初值表是用逗号分隔的参数,主要由常量、数值表达式或“?”组成。其中“?”表示未赋初值u多个存储单元如果初值相同,可以用复制操作符DUP进行定义:重复次数 DUP(重复参数)u表示初值表首元素的逻辑地址,常称为符号地址。 变量名u变量名是用户自定义的标识符,用来表示可读写数据的首地址,或初值表的首地址。u这个用符号表示的地址,常称为符号地址。u一个变量可以没有变量名,在这种情况下,汇编程序将直接为初值表分配空间,即该变量没有符号地址。u设置变量名是为了方便存取它指示的存储单元。 初值表u初值表一般指用户定义的多个数据(用逗号分隔)或 内存空间u主要由数值常数、表达式或?、DUP等组成?表示初值不确定,即未赋初值;DUP表示重复初值。uDUP的格式为:重复次数 DUP (重复参数)4、注释u语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性u必要时,一个语句行也可以由分号开始作为阶段性注释u汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理5、分隔符u语句的4个组成部分要用分隔符分开u标号后用冒号,注释前用分号u操作数之间和参数之间使用逗号分隔u其他部分通常采用空格或制表符u多个空格和制表符的作用与一个相同uMASM支持续行符 “”二、表达式用运算符 1、算术运算符u实现加、减、乘、除、取余的算术运算。mov ax, 3*4+5;等价于 mov ax,17u其中MOD也称为取模,它产生除法之后的余数,如:19 mod 7 = 5u+ 和- 运算符还可以用于地址表达式。u除加、减外,其他运算符的参数必须是整数。2、逻辑运算符u实现按位相与、相或、异或、求反的逻辑运算。or al,03h AND 45h ;等价于 or al,01h3、移位运算符u实现对数值的左移、右移的逻辑操作;移入低位或高位的是0。其格式为: 数值表达式 SHL/SHR 移位次数 mov al,0101b SHL (2*2);等价于 mov al,01010000b4、关系运算符u用于比较和测试符号数值uMASM用0FFFFH(补码-1)表示条件为真,用0000H表示条件为假。u 运算符包括:EQ NE GT LT GE LE 例:mov bx, (PORT LT 5) AND 20H ) OR (PORT GE 5) AND 30H );当PORT5时,汇编结果为mov bx,30H;否则,汇编结果为mov bx,00H5、高低分离符u取数值的高半部分或低半部分。uHIGH、LOW从一个字数值或符号常量中得到高、低字节mov ah, HIGH 8765h ;等价于mov ah,87hu从引入的HIGHWORD、LOWWORD取一个符号常量(不能是其他常数)的高字或低字部分dd_value equ 0ffff1234h ;定义一个符号常量mov ax, LOWWORD dd_value ;等价于mov ax,1234h6、地址操作符u地址操作符取得名字或标号的段地址和偏移地址返回名字或标号的段地址SEG 名字/标号返回名字或标号的偏移地址OFFSET 名字/标号段前缀,采用指定的段地址寄存器 :当前偏移地址 $将括起的表达式作为存储器地址指针 7、类型操作符u类型操作符对名字或标号的类型属性进行设置u类型操作符包括:PTR / THIS / SHORTTYPE / LENGTH / SIZE1)PTR 操作符类型名 PTR 名字/标号uPTR 操作符使名字或标号具有指定的类型,其中:u类型名可以是:uBYTE / WORD / DWORD / FWORD / QWORD / TBYTE;uNEAR/FAR;u由STRUCT、RECORD、UNION以及TYPEDEF定义的类型。mov al,byte ptr w_var;w_var是一个字变量jmp far ptr n_label;n_label是一个标号u使用PTR操作符,可以临时改变名字或标号的类型。2)THIS 操作符THIS 类型名u用THIS说明的操作数,在汇编时,具有当前逻辑地址和指定的类型:b_var equ THIS byte ;字节变量b_var,w_var dw 10 dup (0) ;字变量w_var,两变量地址相同f_jump equ THIS far ;f_jump为段间转移地址(f_jump label far)uLABEL伪指令的功能等同于“EQU THIS”。3)SHORT操作符SHORT 标名u指定标号作为-128+127字节范围内的短转移,如果标号实际上超出了这个范围,则出错。jmp short n_jump4)TYPE 操作符TYPE 名字/标名u返回与名字或标号类型相关的数值u对字节、字和双字变量分别返回1、2和4;u对短、近和远转移分别返回ff01h、ff02h和ff05h。mov ax, TYPE w_var;汇编结果为mov ax,2mov ax, TYPE n_jump;汇编结果为 mov
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号