伪指令及汇编程序结构和上机

合集下载

汇编语言指令及伪指令练习的实验报告总结(范文)

汇编语言指令及伪指令练习的实验报告总结(范文)

汇编语言指令及伪指令‎练习的实验报告总结‎汇编语言指令及伪指令‎练习的实验报告总结‎‎篇一:汇‎编语言实验报告福建‎农林大学金山学院课‎程名称:姓‎名:系:‎专业:‎年级:学‎号:指导教师‎:职称:‎ (程序设计类‎课程) 实验报告汇‎编语言 201X~2‎01X学年第二学期‎实验项目列表福建农‎林大学金山学院实验报‎告系:专‎业:年级:‎姓名:‎学号:‎实验课程:‎汇编语言实验室号:‎_ _1#6‎05 实验设备号:‎ I3 实验时‎间:201‎X.4.25‎指导教师签字:‎成绩:‎实验一汇编程序的‎汇编及运行1‎.实验目的和要求‎ (1)熟悉汇编程‎序的汇编、连接、执行‎过程;(2)‎生成LST文件,查看‎L ST文件;‎(3)生成BJ文件,‎修改语法错误;‎(4)生成EXE文‎件;(5)执‎行程序。

2.‎实验环境 IBM—P‎C机及其兼容机;实‎验的软件环境是:‎操作系统:‎ DS2.‎0以上;调试程序:‎ DEBUG.C‎M;文本编程程序:‎ EDIT.EX‎E、PS.EXE;宏‎汇编程序:M‎A SM.EXE(或A‎S M .EXE);连‎接装配程序:‎L INK .EXE;‎交叉引用程序:‎CREF.EXE(‎可有可无)。

‎3.实验内容及实验数‎据记录(1)‎将数据段输入,取名‎ 1.txt,保存‎在MASM文件夹下。

‎生成LST文件,(不‎必连接、运行)用ED‎I T查看1.L‎S T文件。

试回答:‎ DA1,DA2‎的偏移量分别是多少?‎C UNT的值为多少?‎DATA SEGM‎E NT RG 20H‎NUM1=8 NU‎M2=NUM1+10‎H DA1 DB ‘‎I BM PC’ CU‎N T EQU $-D‎A1 DATA EN‎D S DA2 DB ‎0AH, 0DH E‎N D(2)输‎入有错误的文件,修改‎错误语句。

(MASM‎没有出现错误即可。

不‎必连接、运行。

)‎D ATA SEGME‎N T VAR1 DB‎0, 25, DH‎,300 VAR2‎DB 12H, A‎4H, 6BH VA‎R3 DB ’ABC‎D EF’ VAR4 ‎D 1H, 5678‎H VAR5 D 1‎0H DUP(?) ‎D ATA ENDS ‎C DE SEGMEN‎T ASSUME C‎S: CDE, DE‎: DATA MV ‎D S, AX LEA‎SI, VAR5 ‎M V BX, FFS‎E T VAR2 MV‎[SI], 0AB‎H MV AX, V‎A R1+2 MV [‎B X], [SI] ‎M V VAR5+4,‎VAR4 MV A‎H, 4CH INT‎21H ENDS ‎E ND START ‎B EING MV A‎X, DATA CD‎E(3)输入‎正确的程序,汇编、连‎接、运行 STACK‎S SEGMENT ‎S TACK D 12‎8DUP(?) E‎N DS SEGMEN‎T ENDS SEG‎M ENT ASSUM‎E CS: CDES‎,DS: DATA‎S STACKS D‎A TAS DATAS‎CDES STRI‎N G DB ‘ELC‎M E!’, 13, ‎10, ‘$’ ST‎A RT: M‎V AX, DATA‎S MV DS, A‎X LEA DX, ‎S TRING MV ‎A H, 9 INT ‎21H MV AH,‎4CH INT 2‎1H CDES EN‎D S END STA‎R T4.算法‎描述及实验步骤 1)‎首先,用记事本输入‎各段程序,并储存成源‎程序,保存在MASM‎目录下。

《汇编语言》学习笔记6——伪指令

《汇编语言》学习笔记6——伪指令

《汇编语⾔》学习笔记6——伪指令1.伪指令⼜称伪操作,即不能像汇编指令⼀样⽣成可执⾏的⼆进制机器代码,⽽是在汇编程序对汇编语⾔源程序进⾏汇编(编译)期间,由汇编程序执⾏。

它与C中的说明性语⾔的含义类似,起到说明作⽤,⽤来指出程序分段、数据定义、存储分配、程序开始和结束等信息,这些信息在汇编(编译)完成后就不⽤了。

但程序中没伪指令,则系统就⽆法完成编译。

2.段定义伪指令:⽤来定义各种类型的段 1.格式:段名 SEGMENT [类型参数] ...... 段名 ENDS 1.其中SEGMENT和ENDS必须成对出现,表⽰段的开始和结束。

⼀般的,段名和段的意义⼀致,便于识别。

2.段名实际就是段地址,在汇编过程中,系统给出具体的地址值,⼀个段必须有⼀个名字来标识。

3.参数是可选项(可有可⽆),⽤于指出段的边界、段的组合、类别标识,⼀般⽤于多模块程序设计中。

2.类型参数 1.定位类型 PARA 该段的起始地址必须为⼩段的⾸地址,即起始地址的16进制数最低位为0 BYTE 该段可以从任意地址开始 WORD 该段必须从字边界开始,即起始地址为偶数 DWORD 该段必须从双字边界开始,即起始地址的16进制数为最低应为4的倍数 PAGE 该段必须从页边界开始,即起始地址的16进制数最低两位为00(能被256整除) 若不指定定位类型,系统默认为PARA 2.组合类型 PRIVATE 该段为私有段,连接时不与其他同名段合并 PUBLIC 连接时可与其他模块中的同名段按顺序连接成⼀个段 COMMON 表⽰该段与其他模块中的同名段有相同的起始地址,如果连接将产⽣覆盖,连接后段的长度为同名段中的最长者 STACK 表⽰该段为堆栈段 AT 表达式 该段直接定位在表达式指出的位置上 若不指定组合类型,默认为PRIVATE 3.类型标识:在引号中给出段的类型名。

在连接时,类别标识相同的段放在连续的存储区中。

(如:"STACK"⽤啦标识该段为堆栈段) 4.END:结束标记,若碰到伪指令END则停⽌编译3.ASSUME伪指令:⽤于指明段寄存器与段的对应关系 1.格式:ASSUME 段寄存器:段名,[段寄存器:段名,段寄存器:.....]【[]中标识可选项】 2.除了代码段寄存器CS不能⽤MOV指令赋值外,其他段寄存器都可⽤MOV指令进⾏初始化。

实验二_汇编语言程序上机过程

实验二_汇编语言程序上机过程

实验二:汇编语言程序上机过程实验目的:1、掌握常用工具EDIT,MASM和LINK的使用。

2、伪指令:SEGMENT, ENDS, ASSUME, END, OFFSET, DUP。

3、掌握汇编源程序的基本架构4、了解.EXE文件及用INT 21H 4C号功能返回系统的方法。

源程序1:;This is an simple example;--------------------------------------------data segment ;define data segmentmsg db 'hello,everybody!',0dh,0ah,'$'data ends;-------------------------------------------code segment ;define code segmentassume ds:data,cs:codestart:mov dx,data ;set ds segmentmov ds,dxlea dx,msg ;display stringmov ah,9int 21hmov ax,4c00h ; returnint 21hcode ends;--------------------------------------------end start源程序2:;program title goes here----ex_movs;*********************************************data segment ;define data segmentsource_buffer db 40 dup('a')data ends;****************************************************** extra segment ;define extra segmentdest_buffer db 40 dup(?)extra ends;****************************************************** code segment ;define code segment;------------------------------------------------------main proc far ;main part of programassume cs:code, ds:data, es:extrastart:;set up stack for returnpush ds ;save old data segmentsub ax, ax ;put zero in AXpush ax ;save it on stack;set DS register to current data segmentmov ax, data ;data segment addrmov ds, ax ;into DS register;set ES register to current extra segmentmov ax, extra ;extra segmentmov es, ax ;into ES register;main part of program goes herelea si, source_buffer ;put offset addr of source buffer in SI lea di,dest_buffer ;put offset addr of dest buffer in DIcld ;set DF flag to forwardmov cx,40 ;put count in CXrep movsb ;mov entire stringret ;return to dosmain endp ;end of main part of program;------------------------------------------------------------code e nds ;end of code segment;************************************************************end start ;end assembly实验步骤:1、用文字编辑工具EDIT将源程序输入,其扩展名为.ASM。

第2章 汇编语言程序中的指令与伪指令

第2章  汇编语言程序中的指令与伪指令

(2) 类型指定运算符 • 格式:THIS 属性或类型 • 功能:该运算符主要用来为相应的变量名或标 号指定类型属性,用来指定下一个能分配的存 储单元的类型。被指定变量或标号的地址属性 (段基址和偏移量)和下一条邻接语句的变量或标 号相同。 (3) 段属性前缀 • 格式:段寄存器(或“段名”,或“段组名”): 地址表达式 • 如 MOV AX,ES:[BX+SI] • (4) 短转移运算符SHORT • 见 转移指令
2.DS和ES的装入
• 在程序中,必须使用MOV指令才能将对应段的段地址 装入寄存器DS和ES中。 • 例如:MOV AX , DATA1 • MOV DS , AX • ……………… • MOV ES , AX • ……………… 3.SS的装入 • 堆栈段是一个特殊的段,一个完整的源程序一般最好定 义堆栈段。除了要生成COM型执行文件的源程序外, 如果在程序中不定义堆栈段,那么,操作系统在装入该 执行程序时将自动为其指定一个64K字节的堆栈段。 • 在程序没有定义堆栈段的情况下,在由连接程序生 成执行文件时,将会产生警告信息,但可以不理会,所 生成的执行文件是可以正常运行的。 • warning xxxx: no stack segment (其中:xxxx是错 误号)
2.1.2
操作数及其表达式
• 1.常量
• (1) 数值常数 • (2) 字符串常量 • (3) 符号常量
2.表达式
• • • • • • • • • • • • • • (1)数值表达式 X +1 ;表达式为变量名“X”的值加1 19 MOD 7 ;19除7的余数是5 AND AX ,075FH ;将(AX)和075FH按位作“与”运 算 (2) “?“表示预留的存储空间。 (3) 地址表达式的运算结果是内存的偏移地址。 第一章讲过的“寻址方式”,都是简单的地址表达式。如 地址表达式 offset data ;表示取变量“data”的偏移量 1)两个地址相加、相乘、相除是无意义 2) 地址加(减)数字量的表达式是有意义的, 3)两个地址相减也是有意义的 而指令MOV AX,(ARRAY_END –ARRAY)/2 则表示把数组长度(即字数)存入寄存器AX中。 (4) 操作数字段可以使用复制定义符DUP。

4-10汇编伪指令

4-10汇编伪指令

段定义伪指令
类别名,指明程序连接时,段间次序的确定方法
LINK程序将各模块相同‘类别名’的各段依次序连续存 放在内存中,但各段相互独立。缺省项为空。
段定义伪指令示例
D_SEG SEGMENT NUM1 DB 10 DUP(?)
D_SEG ENDS
S_SEG SEGMENT DW 100 DUP(?)
可为常数、表达式、?表达式、字符串、DUP表达式 字符串用单引号括起来,如‘ABCDE’ DUP表达式格式:n DUP(参数{[,参数]})
数据定义伪令
DATA SEGMENT X1 DB 40H X2 DW 1764H X3 DB 10,20,30 Y1 DB 20H,? S1 DB ‘HEL’ S2 DB ‘H’, ‘E’, ‘L’ S3 DW ‘HE’ V1 DW 2 DUP(2,4) V2 DB 2 DUP(?,2 DUP(‘A’,‘B’) ) DATA ENDS
S_SEG ENDS
E_SEG SEGMENT STRING DB 'HELLO'
E_SEG ENDS
回顾: 在汇编程序中,从段的性质上 看,可分为代码段、堆栈段、 数据段和附加段4种。
每个段具体对应到什么性质的 段,取决于段寄存器的指向
指定段寄存器伪指令
格式:ASSUME 段寄存器:段名 {[,段寄存器:段名]} 操作:明确段和段寄存器的关系 说明:①代码段中必须至少有一个ASSUME语句,
S_SEG SEGMENT PARA STACK DW 100 DUP(?)
S_SEG ENDS
思考:若有多个STACK属 性的堆栈段,结果如何?
缺省指定:当无组合类型为STACK的段时,无论是否用 ASSUME设定,SS自动指向程序区开始(SP=0000H)

8086汇编语言伪指令

8086汇编语言伪指令

一、伪指令详解伪指令在百度百科中的定义为:伪指令(Pseudo Instruction)是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有机器代码,只用于汇编过程中为汇编程序提供汇编信息。

例如,提供如下信息:哪些是指令、哪些是数据及数据的字长、程序的起始地址和结束地址等。

伪指令有2个特点:1.由于是伪“指令”,因而它只存在于汇编语言中。

高级语言中不叫指令,叫语句;2.由于是“伪”指令,也即“假”指令,因而不是可执行指令,不会产生机器代码,不会占用ROM空间,只用于汇编过程中为汇编程序提供汇编信息。

与指令的区别::1.指令是在执行阶段发挥作用的,由CPU(Intel、AMD等)来执行。

2.伪指令是在编译阶段发挥作用的,由汇编器(MASM、TASM等)来解释。

二、数据定义伪指令为源程序中的数据和堆栈区分配数据存储单时,使用最多的伪指令。

数据定义伪指令格式如下:常用的数据定义伪指令类型有:∙DB(定义字节,常用)一个字节数据占1个字节单元,读完一个,偏移量加1∙DW(定义字,常用)一个字数据占2个字节单元,读完一个,偏移量加2∙DD(定义双字)一个双字数据占4个字节单元,读完一个,偏移量加4∙DQ(定义四字)一个四字数据占8个字节单元,读完一个,偏移量加8∙DT(定义十字节,用于BCD码)数据定义伪指令后面的初值表可以是常数、表达式、字符串。

例如:D2DW110*230;为D2分配1个字,存放表达式的值D3DB‘GOOD!’;为D3分配5字节,用来存放字符串‘GOOD!’D4DD2.4E+3;为D4分配2个字,存放一个浮点数D5DB‘AB’;为D5分配2字节,字符A在低字节,B在高字节D6DW‘AB’;为D6分配1个字,字符A在高字节,B在低字节S1DB5DUP(?);为S1预留5字节的存储空间S2DW3DUP(0);为S2分配3个字,初值设为0语句1相当于C语言中的DW D2=110*230,只不过是语法结构不太一样注意:通过变量名操作时,变量名代表存储区的第一个数据的地址。

第二部分 汇编语言程序设计——伪指令


例3.2:数据定义综合应用-2/2
.code .startup mov bl,bvar mov ax,word ptr dvar[0] mov dx,word ptr dvar[2] ;取双字到DX.AX mov dx,offset msg mov ah,09h CALLDOS .exit 0 end
运算符
算术运算符 + - * / MOD 逻辑运算符 AND OR XOR NOT 移位运算符 SHL SHR 关系运算符 EQ NE GT LT GE LE 高低分离符 HIGH LOW HIGHWORD LOWWORD
地址型参数
汇编语言程序中,指令参数还有地址型,
它的主要形式是标号和名字(变量名、段 名、过程名等) 硬指令的操作数有存储单元;存储单元就 应该用地址型参数(存储器操作数)表达
定义字节单元伪指令DB
DB伪指令用于分配一个或多个字节单元, 并可以将它们初始化为指定值 初值表中每个数据一定是字节量 (Byte),存放一个8位数据: 可以是0~255的无符号数 或是-128~+127带符号数 也可以是字符串常数
data X Y data
segment ;数据段 db 'a',-5 db 2 dup(100),? db 'ABC' ends
例3.4:属性及其应用-2/5
.code .startup mov al,byte ptr v_word ;用PTR改变v_word的类型,否则类型不匹配 dec al mov v_byte,al ;对v_word的头一个字节操作,原为32H、现为31H n_label: cmp flag,1 jz s_label ;flag单元为1转移 inc flag jmp n_label ;进行短转移

汇编语言程序设计2(汇编语言源程序的结构、语句格式、伪指令)


7.设置中断向量 ( 25H功能 )
38
DOS 功能调用

调用格式:
MOV AH,功能号
<置相应参数>
INT 21H
39
1.从键盘输入单字符并显示

调用方法:
MOV AH,01 INT 21H 输入的字符在AL中

40
单字符输入例
GET_KEY: MOV INT CMP JZ CMP JZ JNZ YES: ┇ NO: ┇
<汇编语言语句> 段名 ENDS
16
SEGMENT和ENDS伪指令

这两个伪指令总是成对出现,二者前面的段名应一致。 SEGMENT说明了一个段的开始,ENDS说明了一个段的结束。 对数据段和堆栈段,段中的语句一般是变量定义。 对代码段则是指令语句。

如: data SEGMENT <指令语句> data ENDS
23

23
其它伪指令

NAME-------为目标程序设定一个名字 格式:
NAME 模块名

TITLE-------为程序清单指定打印标题 格式:
TITLE 标题名
24 24
4.3 功能调用
DOS 功能调用 BIOS功能调用
高级调用,操作系统提供 低级调用
25
3. 调用方法 设置入口参数

与其它模块中的同名段在满足定位类型的前 提 下具有的组合方式:




NONE: 不组合 PUBLIC: 依次连接(顺序由LINK程序确定) COMMON: 覆盖连接 STACK: 堆栈段的依次连接 AT 表达式:段定义在表达式值为段基的节边界 MEMORY: 相应段在同名段的最高地址处。

汇编学习笔记(4)-伪指令(MASM)

汇编学习笔记(4)-伪指令(MASM)前⾔ 编写汇编代码的时候会使⽤到两种语句,⼀种就是前⾯介绍的汇编指令⼜CPU提供功能⽀持,另⼀种呢叫做伪指令,伪指令是由汇编的编译器提供⽀持。

所以伪指令的运⾏结果都必须实在编译的时候就能确定的,下⾯介绍的就是伪指令了。

注意接下来介绍的伪指令都是基于MASM汇编编译器,⽐较常⽤的还有NASM 它的语法以后有机会介绍数值表达式 数值表达式不是汇编指令,表达式的值是在汇编代码的汇编过程中就由汇编编译器计算出结果⽽写到⼆进制程序中了,并不是在程序运⾏的过程中才计算的 (1) 常数表达式 常数就是直接的数字,直接写数字默认表⽰10进制数,也可以⽤符号指定为其他进制 D = ⼗进制 ; MOV AL, 1234D B = ⼆进制 ; MOV AL, 0101B H = ⼗六进制 ; MOV AL, 0FFFFH , 注意常数必须是数字开头不能是字母开头,如果16进制数第⼀个数字是字母的话就要补⼀个0在前⾯ Q = ⼋进制 ; MOV AL, 123Q 因为在程序中字母也是数字,所以其实也可以直接将字母或者字符串当成数字,⽐如 MOV AL, 'a' MOV AX,"ab" ; 双引号和单引号都是可以使⽤的 (2) 算数运算符 就是简单的正(+) 负(-) 加(+) 减(-) 乘(*) 除(/) 模(mod) mov ax, 100+200 mov ax, 100/2 (3) 关系运算符 等于(EQ) 不等(NE) ⼤于(GT) ⼩于(LT) ⼤于等于(GE) ⼩于等于(LE) 如果等式成⽴则实际的值为0FFFF就是补码表⽰的-1, 如果关系不成⽴那么结果就是0 mov ax, 123 gt 234 mov ax, 1234+5 lt 1235 (4) 逻辑运算 与(and) 或(or) ⾮(not) 异或(xor) 左位移(shl) 右位移(shr) mov ax, 1 shl 3 mov al, 3 and 47 (5) 其他操作符 HIGH LOW WIDTH MASK HIGH 表⽰取数据的⾼⼋位 LOW 表⽰取数据的低⼋位地址表达式 地址表达式所表⽰的是存储器操作数的地址。

3.2 汇编语言程序设计伪指令

(二)循环程序设计举例 例7 设单片机系统采集的8个单字节数据存储在单片机内 部RAM的30H开始的连续单元中,求它们的均值。 N x x 计算一组数据平均值的公式为:= ∑xi N ,其中,i 为第i个 i=1 数据,N为数据的个数。因此,要计算出平均值需要进行2种 运算:求数据的总和、数据总和除以数据个数。 (1)求数据的总和 设S为数据的总和,在计算机中求多个数据总和的算法如下:
2012-2-29
单片机原理及其应用
11
7.2 算术运算程序的设计

DA A DA A DA A
图7.3 多位十进制加法算法
2012-2-29
单片机原理及其应用
12
7.2 算术运算程序的设计
例4 多位十进制减法 在第3章的例30中,我们介绍了2位十进制数减 法算法:X-Y=X+100-Y→ X+9AH-Y,把十进 制减法变换成二进制减法(求十进制减数的补码) 和十进制加法2步进行。多位十进制数减法也采用了 同样的算法。设被减数存放在20H开始的内部RAM 存储单元,减数存放在30H开始的存储单元,6位十 进制数减法的程序如下
15
7.2 算术运算程序的设计
例5 多字节数二进制乘法 2个多字节二进制数乘法的算法与按位进行十进 制数乘法相似。把它转换为几个多字节与单字节的 乘法运算,先分别计算出它们的部分积,然后按照 规则把部分积累加计算出乘积。 图7.4为2个16位二进制数相乘的算法原理图。 图中被乘数为X,其高八位和低八位分别存储在XH 和XL单元,乘数为Y,YH和YL分别高八位和低八位 存储单元。
2012-2-29
单片机原理及其应用
16
7.2 算术运算程序的设计
算法分2步进行:首先,分别用乘数的高八位和 低八位与被乘数相乘,计算部分积,分别存储在 (XYH3),(XYH2),(XYH1)和 (XYL3),(XYL2)(XYL1)单 元;在编写程序时,乘法运算可以用子程序调用的 方法实现(第3章例33)。第二步,采用加法运算求 出乘积存储在(XY4)(XY3)(XY2)(XY1)单 元。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微机原理与汇编语言程序设计本讲教学重点及要求汇编语言及汇编程序的基本概念汇编语言的书写规则、语句格式及程序结构 伪指令的格式、功能及应用上机调试过程汇编程序的主要功能:•检查源程序,给出出错信息•产生目标文件(.obj )和列表文件(.lst )•展开宏指令连接程序汇编程序编辑程序program.asmprogram.obj program.exe(汇编语言源程序)汇编程序和汇编语言源程序是两回事。

汇编程序是将汇编语言源程序翻译成机器能够识别和执行的目标程序的一种系统程序。

汇编语言语句种类1)指令语句:是计算机可以执行的,它与机器指令相对应,能够产生目标代码。

2)伪指令语句:不是在程序运行期间由计算机来执行,而是在汇编程序对源程序汇编期间由汇编程序处理的操作,不能产生目标代码。

3)宏指令语句:是汇编语言为简化程序设计,使用一条宏指令代替一段程序,凡是在程序中需要使用该程序的地方,均可使用宏指令语句来代替。

标号指令常数说明程序或语句的功能变量伪指令寄存器宏指令标号变量表达式源程序的每条语句可表示为:[名字] 操作码项[操作数项] [; 注释]汇编语言语句格式汇编语言语句格——名字项1、组成名字的字符及规则:由下列字符组成的,由字母打头的字符串.字母A ̄Z和a ̄z数字0 ̄9专用字符?. @ -¥除数字0 ̄9外其他字符都可以放在名字项首位; 专用字符'.'只能出现在名字的第一位置;名字最长由31个字符组成.2、标号和变量的区别标号是某条指令所存放单元的符号地址。

变量是某操作数所存放单元的符号地址。

指令语句中的名字采用标号,可以任选,可以不写;指令语句的标号出现在代码段,后面跟冒号¡°:¡±。

伪指令语句中的名字可以是变量名、段名、过程名、符号名等,可以是规定必写、任选或省略;伪指令语句中的名字之后不要用冒号¡°:¡±。

例如:LAB1:MOV AX ,2050H这是指令语句,标号LAB1是名字,后跟¡°:¡±,LAB1也是这条指令第一字节的符号地址。

VAR1 DW 1200H这是伪指令,变量VAR1是名字,后不跟¡°:¡±,VAR1也是符号地址。

同一程序中,同样的标号或变量的定义只允许出现一次.一个标号与一条指令的地址相联系,因此,标号可以作为JMP和CALL指令的操作数.3、标号和变量的属性Ø段属性定义了标号和变量的段起始地址,其值必须在一个段寄存器中。

Ø偏移属性表示标号和变量相距段起始地址的字节数,是一个16位无符号数。

Ø类型属性•对于标号:指出该标号是在本段内引用还是在其他段中引用. 本段内引用为NEAR,段外引用为FAR•对于变量:说明变量有几个字节长度。

这一属性由伪指令DB、DW、DD等确定。

汇编语言语句格——操作码项1)指令:指CPU指令系统的指令,汇编程序将其翻译成对应的机器语言指令。

2)伪指令:不能翻译成对应的机器码,只在汇编过程中完成相应的控制操作。

3)宏指令:有限的一组指令定义的代号,汇编时将根据其定义展开成相应的指令。

汇编语言语句格——操作数项v常数指操作数位置出现的数值数据或字符数据,其值在汇编时已完全确定,程序运行过程中不会发生变化。

二进制(以B结尾)、八进制(以O结尾)十进制(以D结尾或省略)、十六进制(以H结尾)字符串常数(以单引号括起来的字符或字符串)常数主要以立即数、位移量的形式出现在指令语句或伪指令语句中。

v表达式和运算符由运算对象和运算符组成的合法式子叫表达式。

表达式的运算结果在汇编过程中计算出来。

数值表达式:其运算结果是一个数地址表达式:其运算结果是一个存储单元的地址。

运算符算术运算符逻辑运算符关系运算符分析运算符综合运算符(1)算术运算符:+、−、∗、⁄、MOD、SHL、SHR例: MOV DX, BLOCK+(6-1)*2 ; 把首地址为BLOCK 的字数组的第6个字传送到DX注意:•加、减、乘、除运算都是整数运算,结果也是整数.•除法运算所得是商的整数部分,求余运算是两数整除后的余数.•算术运算符适用于数值和地址表达式,但用于地址表达式时,只有结果有明确的物理意义才有效.且表达式中的地址要在同一段内。

•‘地址±数字量’表示在原地址基础上偏移若干个单元;•‘地址-地址’表示两个单元间的距离。

•‘地址+地址’、‘地址*地址(或数字量)’、‘地址/地址(或数字量)’都无意义;(2) 逻辑运算符:AND、OR、XOR、NOT注意:•逻辑运算符是对其操作数进行按位操作;•只能用于数值表达式,不能对地址进行逻辑运算;•逻辑运算是在汇编时完成的;•运算后产生一个逻辑运算值供指令操作数使用,不影响标志位。

例: OPR1 EQU 25OPR2 EQU 7AND AX, OPR1 AND OPR2; 等价于AND AX, 1说明:逻辑运算符与逻辑指令不同。

逻辑指令是在程序执行时完成.(3) 关系操作符:EQ(=)、NE(≠)、LT(<)、LE(≤)、GT(>)、GE(≥)注意:•两个操作数必须是数字,或同一段内的两个存储器地址.即对两个不同性质的项目进行比较是无意义的。

•计算结果为逻辑值:真为0FFFFH或0FFH, 假为0。

例:MOV CX,5 NE 3;汇编为MOV CX,0FFFFHMOV AL,0FH EQ 1111B;汇编为MOV AL,0FFH(4) 分析运算符:SEG、OFFSET、TYPE、LENGTH、SIZE 格式:SIZE 变量;LENGTH * TYPEj 格式:SEG 变量/标号;得到变量或标号的段址。

k 格式:OFFSET 变量/标号;得到变量或标号的偏移量。

m 格式:LENGTH 变量;得到所包含变量的个数。

l 格式:TYPE 变量/标号/常数;得到这些存储器操作数的类型TYPE DB DW DD NEAR FAR 常数返回值1 2 4 -1 -2 0LENGTH 对于DUP定义的情况其它情况返回值分配给该变量的单元数1ARRAY DW 100 DUP (?)TABLE DB ‘ABCD’ADD SI , TYPE ARRAY; ADD SI, 2ADD SI , TYPE TABLE; ADD SI, 1MOV CX , LENGTH ARRAY; MOV CX, 100 MOV CX , LENGTH TABLE; MOV CX, 1MOV CX , SIZE ARRAY; MOV CX, 200 MOV CX , SIZE TABLE ; MOV CX, 1MOV BX, OFFSET ARRAY ;等于LEA BX, ARRAY MOV BX, SEG ARRAY ;取ARRAY的段址送BX(5)属性运算符:PTR、段属性前缀、SHORT、THIS、HIGH和LOWj 格式:类型PTR 存储器如:VAR1 DB 30H ,40H VAR2 DW 2050H ……MOV AX ,WORD PTR VAR1MOV BL ,BYTE PTR VAR2功能:建立一个新符号地址,本身不实际分配存储器,只是用来给已分配的存储地址赋予另一种属性。

即将左边的类型指定给右边的地址表达式。

新的存储器地址操作数,具有和右边地址表达式一样的段基址和偏移量,即它们指示的是同一存储单元,但却有不同的类型。

可以是BYTE、WORD、DWORD、NEAR、FAR、或结构名称可以是标号以及作为地址指针的寄存器、变量和数值的各种组合形式l 格式:SHORT 标号功能:用来修饰JMP 指令中跳转地址的属性,指出跳转地址是在下一条指令地址的-128~+127个字节范围内.如:JMP SHORT NEXT ;跳转标号NEXT 与JMP 指令的距离不能大于127个字节.说明:在8086指令系统中,JMP 指令可以实现段间或段内跳转,在段内跳转时,跳转距离可以在±32KB 范围内,若用SHORT 修饰后,则只能在±127字节范围内短距离跳转。

k 段属性前缀功能:需要进行段超越寻址时应用。

格式: 段寄存器名称: 地址表达式如MOV AX ,ES:[BX+SI ]m格式:THIS 类型功能:建立一个指定类型的存储器地址操作数,不实际分配新的存储单元。

用THIS建立的存储器地址操作数的段和偏移量部分与目前所能分配的下一个存储单元的段和偏移量相同,但类型由THIS指定。

例:要,又可以字为单位存取。

AREA1EQU THIS WORDAREA2DB100 DUP(?);AREA1和AREA2实际上代表同一个数据区,共有100个字节,但AREA1的类型为WORD,而AREA2的类型为BYTE。

HIGH/LOW被称为分离运算符 格式:HIGH/LOW 表达式 功能:接受一个数或地址表达式,HIGH取高位字节, LOW取低位字节。

例:定义一个符号常数COUNT,值为1234H,将其高低字节分离 出来,分别由寄存器AH和AL保存。

CONS EQU 1234H ;汇编后 MOV AH, HIGH CONS ;MOV AH,12H MOV AL, LOW CONS ;MOV AL,34H运算符小结以上介绍的常用运算符和常数、寄存器名、标 号、变量一起共同组成表达式,放在语句的操 作数字段中。

在汇编过程中,由汇编程序先计算表达式的 值,然后再翻译指令。

运算规则优先级高的先运算,低的后运算 优先级相同时,按表达式中从左到右的顺序运算 括号内的运算总是在相邻的运算之前进行各类运算符的优先级别优先级别 运算符 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 L N T 、S Z 、WI T 、MA K E G H IE DH S 、()、[、<> ] . ( 结构变量名后面的运算符) : ( 段超越运算符) P R F S T E 、T P 、T I T 、O F E 、S G Y E H S H G 、L W IH O +、- (一元运算符) * 、MO 、S L H 、/ D H 、S R +、- (二元运算符) E 、N 、L 、L 、G 、G Q E T E T E N T O A D N O 、X R R O SO T H R伪指令语句数据定义伪指令 符号定义伪指令 段定义伪指令 过程定义伪指令 结构定义伪指令 模块定义和连接伪指令 程序计数器¥ R 伪指令 和O G数据定义伪指令格式:[变量] 助记符 操作数 [ , 操作数 , … ] [ ; 注释 ]助记符有 1) DB:定义字节,其后的每个操作数占有一个字节. 2) DW:定义字,其后的每个操作数占有一个字(16位,其低位 字节在低地址中,高位字节在高地址中). 3) DD:定义双字,其后的每个操作数占有两个字(32位) 4) DQ:定义4个字,其后的每个操作数占有4个字. 5) DT:定义10个字节,其后的每个操作数占有10个字节.格式:[变量]助记符 操作数 [ , 操作数 , … ] [ ; 注释 ](1)可以是常数、表达式或字符串,但每项的值不能超过定义的 数据类型限定的范围。

相关文档
最新文档