null第4章 伪指令及汇编语言程序结构第4章 伪指令及汇编语言程序结构
null 重点掌握:
汇编语言和汇编程序
源程序的格式及程序分段
参数的表达、变量的定义
伪指令的格式、功能及应用
汇编语言源程序的建立、汇编、连接、调试及运行null4.1 汇编语言和汇编程序汇编语言的特点汇编语言的特点汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数。
利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序。
在有些应用领域,汇编语言的作用是不容置疑和无可替代的。
汇编程序设计的过程是与其他高级语言程序设计大致相同。null汇编程序功能●汇编程序的主要功能:
检查源程序,给出出错信息。
产生目标文件(.obj)和列表文件(.lst)。
展开宏指令。null●汇编语言程序的处理过程(开发步骤):编辑程序. ASM
文件汇编程序. OBJ
文件连接程序. EXE
文件Edit 等MASMLINK运行
与
调试null1、编辑:形成 .ASM文件 (EDIT)
2、汇编(编译):将.ASM文件翻译成二进制代码的目标文件(即将助记符语言翻译成机器指令),形成.OBJ文件。(MASM)
3、连接:.OBJ虽是二进制文件,但不能直接上机运行,必须经过连接,把目标文件与库文件等其他连接在一起,形成可执行文件.EXE。(LINK)
4、运行:可在DOS提示符下键入文件名运行。
5、调试:在DEBUG下进行动态调试,检查错误等。null4.2 汇编语言语句格式null●汇编语言程序由三种基本语句组成:
指令语句、伪指令语句、宏指令语句●指令语句格式:null完整的汇编语言程序格式;大于50送数,小于等于则省略
my_data segment again: Mov al,[si]
array1 db 05,a2H,00,10H,85H Inc si
n equ 5 Cmp al, 50
array2 db n dup(?) Jbe next
my_data ends Mov [di], al
my_code segment Inc di
assume cs:my_code next: dec cx
assume ds:my_data jnz again
begin: mov ax, my_data mov ah,4ch
mov ds, ax int 21h
Lea si, array1 my_code ends
Lea di, array2 end begin
Mov cx, n汇编语言源程序格式汇编语言源程序格式完整的汇编语言源程序由段组成。
一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列。
需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。
所有的可执行性语句必须位于某一个代码段内,
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
性语句可根据需要位于任一段内。
通常,程序还需要一个堆栈段。 源程序由语句序列构成汇编语言的语句格式汇编语言的语句格式⑴执行性语句——执行性语句用于表达处理器指令(也称为硬指令),汇编后对应一条指令代码。由处理器指令组成的代码序列是程序设计的主体。
标号: 硬指令助记符 操作数,操作数 ;注释
⑵说明性语句——说明性语句用于表达伪指令,指示源程序如何汇编、变量怎样定义、过程怎么设置等。
名字 伪指令助记符 参数,参数,…… ;注释null汇编语言程序格式标号 指令 寄存器 说明程序或语句
变量 伪指令 标号 的功能
宏指令 变量
常数
表达式源程序的每条语句可表示为:
[名字] 操作项 操作数 [; 注释]标号/变量:段值、偏移量、类型三种属性
表达式:数字表达式 地址表达式一、名字项一、名字项●每条语句中的名字项可以是标号,或伪指令定义的对象。
例:START:PUSH DS
XOR AX,AX
PUSH AX
MESS1 DB ‘NO····$ '标号,用来表示一条指令的地址。变量,用来表示数据的地址。null●不论是标号还是伪指令定义的对象,都可称标识符。
◆标识符的组成:
◆标识符的规定:
①不能以数字开头。
②标识符的长度≦31。
③专用字符?不能单独构成标识符。
一般情况下,名字项可以是标号或变量。他们用来表示本语句的符号地址,是可有可无的,只有当需要用符号地址来访问该语句时才出现。null1、标号
标号实际上是用符号表示的地址。标号在代码段中定义,后跟“:”号。是一条指令目标代码所在存储单元的符号地址,表明该指令代码在存储器中的位置,可作为转移指令或CALL指令的操作数,以确定程序转移的目标地址。
●标号有三种属性:null◆段属性(SEG):表明该条指令目标代码在哪个逻辑段中,即提供标号所在段的基址。(16位)
◆偏移量属性(OFFSET):表明标号所在段的偏移地址,即标号所在单元与首地址之间的字节距离。(16位)
◆类型属性(距离属性):表明标号可作为段内或段间转移的特性。
①NEAR(近距离):段内转移,只修改IP值,不修改CS值。类型值为-1(0FFH)。
②FAR(远距离):段间转移,修改CS、IP值。类型值为-2(0FEH)。null2、变量
变量是除代码段以外的其他段中的定义,后面不跟“:”号。一般指存放在存储单元中的数据,在程序运行过程中,可随时修改,常以变量名的形式出现在程序中,可作为是存放数据的存储单元的地址。
●变量的定义与预置
定义变量就是给变量分配存储单元,并且对存储单元赋予一个符号名——变量名,同时对这些单元预置初值。null●变量的属性:
◆段属性(SEG):表明变量在哪个逻辑段中,即变量单元所在段的基址。(16位)
◆偏移量属性(OFFSET):表明变量所在段的偏移地址。(16位)
◆类型属性(TYPE):表明变量所占存储单元的字节数。
类型: 字节(DB) 字(DW) 双字(DD)
属性值: 1 2 4null二、操作项
可以是指令、伪指令或宏指令的助记符。三、操作数项三、操作数项 操作数项由一个或多个表达式组成,中间用逗号隔开。对于指令,一般给出操作数的地址;对于伪指令或宏指令,则给出所要求的参数。
操作数项可以是常数、寄存器、标号、变量或由表达式组成。
表达式由操作数和运算符组成。 null●表达式操作运算符:(1) 算术操作符: 、 、、 、modMOV DX, BLOCK+(6-1)*2ARRAY DW 1,2,3,4,5,6,7
ARYEND DW ?
MOV CX, (ARYEND-ARRAY)/2ADD AX, BLOCK+2 ; 符号地址常数 有意义
; 时意义不明确
MOV AX, BX+1 ; MOV CX,7nullOPR1 EQU 25
OPR2 EQU 7
AND AX, OPR1 AND OPR2(2) 逻辑和移位操作符: AND、OR、XOR、NOT
SHL、SHR; AND AX,1IN AL, PORT_VAL
OUT PORT_VAL AND 0FEH, ALMOV AX, 0FFFFH SHL 2; MOV AX,0FFFCHnull(3) 关系操作符: EQ、NE、LT、LE、GT、GE计算结果为逻辑值:真 0FFFFH
假 0000HX: ……
……
Y: ……若 128 (真) 汇编结果: MOV FID, -1
若 128 (假) 汇编结果: MOV FID, 0MOV FID, (OFFSET Y - OFFSET X) LE 128null(4) 数值回送操作符: OFFSET、SEG、TYPE、
LENGTH、SIZE●OFFSET / SEG 变量 / 标号
功能:回送变量或标号的偏址 / 段址●TYPE 变量 / 标号 / 常数
DB DW DD DF DQ DT NEAR FAR 常数
1 2 4 6 8 10 -1 -2 0null●LENGTH 变量
功能:回送由DUP定义的变量的单元数,其它情况回送1●SIZE 变量
功能:LENGTH * TYPE★ SIZE = TYPE × LENGTHnullARRAY DW 100 DUP (?)
TABLE DB ‘ABCD’
ADD SI, TYPE ARRAY ; ADD SI, 2
ADD SI, TYPE TABLE ; ADD SI, 1
MOV CX, LENGTH ARRAY ; MOV CX, 100
MOV CX, LENGTH TABLE ; MOV CX, 1
MOV CX, SIZE ARRAY ; MOV CX, 200
MOV CX, SIZE TABLE ; MOV CX, 1null(5) 属性操作符: PTR、段操作符、SHORT、
THIS、HIGH、LOW、
HIGHWORD、LOWWORD类型 PTR 表达式
例: MOV WORD PTR [BX], 5
段操作符
例:MOV ES: [BX], AL
SHORT 标号
例:JMP SHORT NEXTnullTHIS 类型
例: TA EQU THIS BYTE
NEXT EQU THIS FARCONS EQU 1234H
MOV AH, HIGH CONS
MOV AL, LOW CONS null操作符的优先级1 () <> [] · LENGTH SIZE WIDTH MASK
2 PTR OFFSET SEG TPYE THIS :
3 HIGE LOW
4 * / MOD SHL SHR
5 + -
6 EQ NE GT LT GE LE
7 NOT
8 AND
9 OR XOR
10 SHORT 建议采用圆括号“( )”显式表达,它可以极大地提高程序的可阅读性null4.3 伪指令语句null●何谓伪指令:
并非由CPU执行的指令,而是在汇编程序对源程序进行汇编期间,由汇编程序执行的操作。主要是为汇编程序服务的,为其提供一些必要的格式、信息等。可以处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。指令和伪指令采用易于记忆的符合表达,这就是助记符null●伪指令语句格式:◆处理器选择伪操作 ◆段定义伪操作
◆程序开始和结束伪操作 ◆数据定义及存储器分配伪操作◆表达式赋值伪操作 ◆地址计数器与对准伪操作
◆基数控制伪操作标号、名字与标识符标号、名字与标识符标号是反映硬指令位置(逻辑地址)和属性的标识符,后跟一个冒号分隔。
名字是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒号。
标识符(Identifier)一般最多由31个字母、数字及规定的特殊符号(如 _、$、?、@)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写。
一个源程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的保留字。保留字保留字保留字(Reserved Word)是汇编程序已经利用的标识符(也称为关键字),主要有:
硬指令助记符——例如:MOV、ADD
伪指令助记符——例如:DB、DW
操作符——例如:OFFSET、PTR
寄存器名——例如:AX、CS
预定义符号——例如:@data 汇编语言大小写不敏感操作数和参数操作数和参数处理器指令的操作数可以是立即数、寄存器和存储单元。
伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔。
注释注释语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性。
必要时,一个语句行也可以由分号开始作为阶段性注释。
汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理。分隔符分隔符语句的4个组成部分要用分隔符分开。
标号后用冒号,注释前用分号。
操作数之间和参数之间使用逗号分隔。
其他部分通常采用空格或制表符。
多个空格和制表符的作用与一个相同。
MASM支持续行符 “\”。一、数据定义及存储器分配伪操作指令一、数据定义及存储器分配伪操作指令1、功能:
定义变量。变量主要用来定义存储器中的数据,在程序运行中,变量是可以被修改的运算对象。
2、格式:
[变量名] DB/DW/DD <数据项表> [;注释]单元地址数据定义伪指令数据表达式 变量定义伪指令最常使用null●定义数据的操作符有:
字节定义——DB
字定义——DW
双字定义——DD
四字定义——DQ
十字节定义——DT
重复定义—— m DUP (n) (重复m次个数据 n )
3、含义
在定义变量后,就为变量分配若干个存储单元,并由变量名作为单元起始地址,并把后跟数据存入指定单元即可。字节变量的定义DB(Define Byte)字节变量的定义DB(Define Byte)DB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值
初值表中每个数据一定是字节量,存放一个8位数据:
可以是0~255的无符号数
或是-128~+127带符号数
也可以是字符串常数字节变量定义实例字节变量定义实例;数据段
X db 'a',-5
db 2 dup(100),?
Y db 'ABC'字变量的定义DW(Define Word)字变量的定义DW(Define Word)DW伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值
初值表中每个数据是字量,一个字单元可用于存放任何16位数据:
一个段地址
一个偏移地址
两个字符
0~65535之间的无符号数
-32768~+32767之间的带符号数字变量定义实例字变量定义实例;数据段
count dw 8000h,?,'AB'
maxint equ 64h
number dw maxint
array dw maxint dup(0)双字变量的定义DD(Define Double word)双字变量的定义DD(Define Double word)DD伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值
初值表中每个数据是一个32位的双字量:
可以是有符号或无符号的32位整数
也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针
vardd DD 0,?,12345678h
Farpoint DD 00400078h变量的应用变量的应用变量具有存储单元的逻辑地址。
程序代码中
通过变量名引用其指向的首个数据。
通过变量名加减位移量存取以首个数据为基地址的前后数据。 null●数据定义伪指令的几种数据表达式:
①数值表达式:由立即数构成。
②字符串表达式:表示将字符串中的字符的ASCII码存放在存储单元中。
③?号表达式:不带引号的?表示可预置任何内容。
④DUP表达式:DUP是定义重复数据操作符。
格式: 变量名 DB/DW/DD 表达式1 DUP(表达式2)重复次数重复内容null 通过上述定义,在存储器中将产生如图所示的结果,以DATA1到DATA6为例:
例:
DATA1 DB ?
DATA2 DW 1000H
DATA3 DD 3000A455H
DATA4 DB 4 DUP(0)
DATA5 DW 0120H, 0240H, 0360H
null例: DATA6 DB ‘THIS IS A EXAMPLE’nullnullOPER1 DB ?, ?
OPER2 DW ?, ?
……
MOV OPER1, 0 ;字节指令
MOV OPER2, 0 ;字指令
……
MOV AX, OPER1+1 ×
MOV AL, OPER2 × 类型不匹配
MOV AX, WORD PTR OPER1+1
MOV AL, BYTE PTR OPER2null二、表达式赋值伪操作:表达式名 EQU 表达式
B EQU [BP+8]
ALPHA EQU 9
BETA EQU ALPHA+18 1、作用:为了使程序便于阅读和修改,我们有时使用一个符号来代表一个数,而符号代表了一定的意义,在程序中使用一个符号代表一个数进行操作。
2、格式:null ‘ = ’ 号操作
对符号的赋值还可使用“=”操作,它与EQU的区别是“=”操作可以重复定义,而EQU则不能重复定义。如:
X=3
Y=6
Y=Y*Y-X
……
MOV AX, Y
通过上述操作,最后使Y=33,后面的MOV语句中,当生成目标代码时将用33取代Y。即
MOV AX, 21H (33D)三、段定义伪操作指令三、段定义伪操作指令1、格式:
段名 SEGMENT [定位类型] [组合类型] [‘类别名’]
……
…… ; 语句序列
段名 ENDSnull完整的段定义伪操作null 从上述程序中,我们可
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
出如下结论:
① SEGMENT和ENDS前面必须有标号,而且在相互配对的段,它们前面要使用相同的标号。对于不同的段定义标号,尽管这些标号可以是任意字串,但为了程序的可读性,应使其有一定的意义。
ASSUME语句可使汇编器知道CS、DS、SS指向哪个段,但它只在汇编时起作用,在运行时CPU并不知道除CS外的其它段地址,所以必须在程序中用指令进行赋值。
格式:ASSUME 段寄存器:段名1[,段寄存器:段名2,┉]
③ 首条被执行的语句有一个标号,用以标出这个程序的开始执行处。(在程序的结尾处使用END后跟这个标号)。null④除代码段外,其余段可以省略,也可以与代码段共用一个段。
例:CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
START: ……
……
⑤段定义时的参数(可以省略)
定位类型
组合类型
类别null 在程序的开始可以用 NAME 或 TITLE 为程序取名字。
格式为: NAME 程序名
TITLE 程序名
整个程序的结束使用 END 标出,当汇编器读到 END 时,它认为程序到此就结束了。(通常使用END后跟程序开始处的标号。)
注: NAME 、TITLE 操作不是必须的。
END 则必不可少。四、程序开始和结束伪操作:五、对准伪操作五、对准伪操作●EVEN ;使下一地址从偶地址开始(规则字)
A DB ‘morning’
EVEN
B DW 2 DUP (?)
● ORG ;用于指定目标程序存放单元的起始偏移地址,通常写在第一条源程序的前面,用于指定这段程序的首地址。
ORG 100
则程序执行时就从CS:100处开始执行其后面的程序。null地址计数器与对准伪操作:地址计数器 $ :保存当前正在汇编的指令的地址
ORG $+8 ; 跳过8个字节的存储区
JNE $+6 ; 转向地址是 JNE 的首址 +6
$ 用在伪操作的参数字段:
表示地址计数器的当前值 ARRAY DW 1, 2 , $+4 , 3 , 4 , $+4null六、基数控制伪操作:. RADIX 表达式(基数值) ; 规定无标记数的基数MOV BX, 0FF
MOV BX, 178DMOV BX, 0FFH
MOV BX, 178
.RADIX 16null4.5 汇编语言程序上机过程null汇编语言程序的上机过程一、建立ASM文件(EDIT)
二、用MASM(或ASM)产生OBJ文件
三、用LINK产生EXE文件
四、程序的执行和DEBUG调试 汇编语言程序的开发过程汇编语言程序的开发过程源程序:文件名.asm目标模块:文件名.obj可执行文件:文件名.exe错误开发过程1:源程序的编辑开发过程1:源程序的编辑源程序文件要以ASM为扩展名。
源程序文件的形成(编辑)可以通过任何一个文本编辑器实现:
DOS中的全屏幕文本编辑器EDIT
其他程序开发工具中的编辑环境
Windows中的记事本Notepad
EDIT wj.asm开发过程2:源程序的汇编开发过程2:源程序的汇编MASM 5.x提供的汇编程序是MASM.EXE:
MASM wj.asm;
如果利用分号“;”结尾命令,则汇编程序不再提示输入模块文件名、列表文件名等,直接采用默认的文件名。
默认采用源程序文件相同的主文件名,扩展名则是相应类型文件的扩展名,例如模块文件(.obj)和列表文件(.lst)等开发过程3:目标模块的连接开发过程3:目标模块的连接连接程序能把一个或多个目标文件和库文件合成一个可执行程序(.EXE、.COM文件):
LINK wj.obj;
如果没有严重错误,LINK将生成一个可执行文件(wj.exe);否则将提示相应的错误信息。这时需要根据错误信息重新修改源程序文件后再汇编、链接,直到生成可执行文件。开发过程4:可执行程序的调试开发过程4:可执行程序的调试经汇编、连接生成的可执行程序在操作系统下只要输入文件名就可以运行:
wj
操作系统装载该文件进入主存,并开始运行
如果出现运行错误,可以从源程序开始排错,也可以利用调试程序帮助发现错误
采用DEBUG.EXE调试程序:
DEBUG wj.exe作 业作 业
习题(第135页)——
4.1 4.2 4.4 4.6
4.8 4.10 4.15