《汇编语⾔》学习笔记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指令进⾏初始化。注意:段地址(即段名)不能直接传送给段寄存器,要⽤⼀个寄存器作为中介转存⼀下。若在编写源程序时,只有数据段和代码段,则只需要给出数据段段寄存器DS赋值即可。
4.数据定义伪指令
1.程序中⽤到的存储单元个数、类型、内容、和名称等需要在数据段中定义
2.作⽤定义存储单元的类型,并确定该单元的内容
3.格式:[存储单元名] DB(或DW、DD)操作数
其中:
1.存储单元名可有可⽆
2.数据定义伪指令
DB 定义字节单元
DW 定义字单元
DD 定义双字单元
DQ 定义四字单元
DT 定义⼗字节单元
3.操作数⽤于指出存储单元的内容,即该单元的值。⼀个数据定义伪指令可以给多个存储单元赋值
1.注意:确定存储单元的内容要与存储单元的属性⼀致
2.操作数是常数或表达式
1.⼀次定义多个存储单元,字母打头的16进制数要在前⾯加0,"?"代表空单元【xx DB 12,0,0E4 定义3个字节单元初始化分别为⼗进制12,0和16进制E4 YY DW 5,?,6*3 定义3个字单元初始化分别为5,空,6*3的值】
2.⽤DUP()⼦句重复定义相同操作数【MSN DB 5 DUP(?) 定义5个字节空单元,即循环定义5次,每次定义⼀个字节空单元】,格式:数字 DUP(操作数) 数字表⽰循环的次数,操作数表⽰单元值
3.DUP()⼦句可以嵌套
例:BUF DB 2 DUP(96,2 DUP(1,4),8)
分析:先进外层循环(执⾏两次):定义⼀个字节单元并初始化为96,此时进到内层循环
(执⾏两次):定义两个字节单元并初始化为1,4。重复执⾏然后跳出内层循环,定义⼀个字节单元并初始化为8。然后在重复执⾏外层循环,最后跳出。【⼀次在内存中的存储:{60(⼗进制96)、{01、04、(内层⼀次循环)}{01、04、(内层⼆次循环)}08、(外层⼀次循环)}{60、01、04、01、04、08(外层⼆次循环)}】
3.操作数是字符串
1.定义字符及字符串,要⽤单引号括起来【x DB 'A','B'】。由于字符串⼜ASCII码表⽰,存⼊的是该字符的ASCII码,则字符串应⽤DB伪指令定义,DW定义只能是两个字符以内,且两个字符看成⼀个字。【x1 DB 'A','B'和x2 DW 'AB'的存储结果是不同的,x1:A、B x2:B、A】
2.定义字符必须⽤DB。(DB定义的存储单元为字节单元,⼀个单元保存⼀个字符。DW定义的单个字符要占两个字节单元。)
5.其他伪指令
汇编语言结束指令 1.赋值伪指令:EQU、=
1.可以⽤EQU定义⼀个符号来代表表达式或数。 格式:符号 EQU 数/表达式
2.=也可以给表达式赋值。 格式:符号 =数/表达式
3.=允许对⼀个符号多次重复定义,EQU不允许重复定义
2.模块定义伪指令:程序可定义为多个模块,⽤LINK连接。模块可⽤模块定义伪指令,定义名称和结束标识。
1.格式:[NAME 模块名] ...... END 起始标号
1.NAME伪指令可缺省,若缺省则以该模块的源程序名作为模块名,END伪指令不能缺省,其后的起始标号可是程序第⼀条汇编指令的标号START,或是主过程名。⽤来指出程序的起始地址,也是对代码段寄存器CS初始化的依据。
3.地址计数器$:表⽰当前的偏移地址值
1.在数据段的存储单元定义中使⽤:ABC DW 1,2,$+3,4 ABC+0字单元存放1,ABC+2字单元存放2,ABC+4字单元存放7(4+3,因为$当前为4),ABC+6字单元存放4
2.$不能⽤于字节单元定义伪指令DB中
3.⽤在转移指令中:JMP $+5 ⽆条件跳转到当前指令的偏移地址+5单元继续执⾏
4.设置偏移地址伪指令
1.当前的偏移地址可⽤ORG伪指令定义
2.⽤在数据段中,该指令可确定存储单元的偏移地址。
3.⽤在代码段中,可从指定的单元开始存放并执⾏指令。
5.操作符:在汇编时将操作符变为相应的数值回送或定义属性
1.回送偏移地址值OFFSET【MOV BX,OFFSET X 将x单元的偏移地址传送给BX】
2.回送段地址值SEG【MOV BX,SEG X 将x单元的段地址传送给BX】
3.类型回送操作符TYPE【MOV BX,TYPE X 若x是字节单元,则回送值为1,即BX=1。若是字单元,值为2,双字节单元值为4,即BX=4】
4.变量数回送操作符LENGTH【MOV CX,LENGTH Y 若Y是⽤DUP()定义的,CX=变量个数】
5.字节数回送操作符SIZE【MOV AX,SIZE Y 若Y是⽤DUP()定义的,给出变量个数所占字节总数】
6.属性定义操作符PTR【MOV BYTE PTR [BX],10 定义⽬的操作数为字节单元,MOV WORD PTR [SI],20 定义⽬的操作数为字单元】
7.多重属性操作符THIS【X1 EQU THIS BYTE X2 DW 1234H THIS要求与EQU配合,X1和X2单元是同⼀单元,但属性不⼀样,x1为字节,X2为字】
8.类型操作符LABEL【x LABEL BYTE 将x单元的类型定义为BYTE字节型】
6.注释伪指令:;后⾯内容为注释。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论