汇编中的标号
当程序中要跳转到另⼀位置时,需要有⼀个标识来指⽰新的位置,这就是标号,通过在⽬标地址的前⾯放上⼀个标号,可以在指令中使⽤标号来代替直接使⽤地址。
使⽤变量是任何编程语⾔都要遇到的⼯作。变量是计算机内存中已命名的存储位置,在⼤部分的语⾔中都有很多种类的变量,如整数型、浮点型和字符串等,不同的变量有不同的⽤途和尺⼨,⽐如说虽然长整数和单精度浮点数都是32位长,但它们的⽤途不同。
顾名思义,变量的值在程序运⾏中是需要改变的,所以它必须定义在可写的段内,如 .data和 .data?,或者在堆栈内。按照定义的位置不同,MASM中的变量也分为全局变量和局部变量两种。
详细地~~~~~
标号:标号(LABEL)是为⼀组机器指令所起名字.标号可有可⽆,只有当需要⽤符号地址来访问该语句时,才给此语句赋予标号.标号是程序⽬标标志,总是和某地址相联系,供转移或循环指令控制转移使⽤.
1 标号属性
汇编指令有多少个
因标号表⽰是指令地址,所以它有三个属性,即段属性、偏移属性和类型属性.段属性即段地址,标号段必须在CS中.偏移属性是表⽰该标号到段⾸地址距离,单位是字节,是16位⽆符号整数.类型属性是距离属性,指标号和转移指令距离,该标号在本段内引⽤,距离在-128~ 127之间时称短标号,距离属性为SHORT,当标号在本段,距离在-32768~ 32767之间时称近标号,距离属性为NEAR,当引⽤标号指令和标号不在同⼀段时称远标号,距离属性为FAR.
计算机汇编语⾔的⼀个突出优点就是利⽤符号(Symbol)来代替⽬标码,也即⼤量的⼆进制代码⽤符号来表⽰,使汇编语⾔源程序容易理解,便于记忆。
在宏汇编语⾔中所有变量名、标号名、记录名、指令助记符和寄存器名等统称符号.这些符号可通过汇编控制语句的伪操作命令重新命名,也可以通过指令给它定义其它名字及新的类型属性,因⽽给程序设计带来很⼤的灵活性.符号是程序员在程序中⽤来代表某个存储单元、数据、表达式和名字等所定义的标识符,可分为寄存器、标号、变量、数字、名字五类.
汇编语句形式:
START: ADD AX,BUFFER
DATA SEGMENT
BUFFER DB 01H, 02H
DATA ENDS
JMP START其中START,BUFFER,DATA均为符号,它们分别表⽰标号,变量名,段名,它们具有完全不同的特定含意.
标号
标号(LABEL)是为⼀组机器指令所起的名字.标号可有可⽆,只有当需要⽤符号地址来访问该语句时,才给此语句赋予标号.标号是程序的⽬标标志,总是和某地址相联系,供转移或循环指令控制转移使⽤.
2 1 标号的属性
因标号表⽰的是指令地址,所以它有三个属性,即段属性、偏移属性和类型属性.段属性即段地址,标号的段必须在CS中.偏移属性是表⽰该标号到段⾸地址的距离,单位是字节,是16位⽆符号整数.类型属性是距离属性,指标号和转移指令的距离,该标号在本段内引⽤,距离在-128~
+127之间时称短标号,距离属性为SHORT,当标号在本段,距离在-32768~+32767之间时称近标号,距离属性为NEAT,当引⽤标号的指令和标号不在同⼀段时称远标号,距离属性为FAR.
2 2 标号的定义
标号的定义有三种⽅法:
2 2 1 隐含说明标号距离属性为SHORT和NEAR的标号可以使⽤隐含说明,即在代码段中定义,标识符后加冒号,放在⼀条汇编指令的操作符前⾯.例:
NEXT: MOV AX,BX
----------
LOOP NEXT
- - - - - - - - - ?
NEXT1: CMP AX,BX
JA NEXT1
其中NEXT和NEXT1都是标号名.
2 2 2 ⽤LABEL定义标号
对于属性为NEAR和FAR的标号均可以⽤这种定义.格式是:
标号名 LABEL NEAR/FAR
例如:NEXT LABELNEAR/FAR
- - - - - - - - - ?
LOOP NEXT
2 2 3 ⽤EQU定义标号
对于属性为NEAR和FAR的标号也可⽤EQU定义.格式是:
标号名 EQU THIS NEAT/FAR
例如:
NEXT EQU THIS NEAR
- - - - - - - - - ?
LOOP NEXT
2 3 标号的使⽤
2 3 1 ⽆条件转移指令中标号作为转移地址
格式:
JMP 标号
其中标号可以是短标号,近标号或远标号
. 2 3 2 循环指令中,标号作为转移地址
格式:LOOP 标号
其中标号只能是短标号
2 3 3 条件转移中标号作为转移地址
格式:
条件转移指令 标号
其中标号只能⽤短标号
2 3 4 属性分离符
2 .3. 4. 1 取段地址算符SEG
例如:MOV AX,SEG NEXT
SEG NEXT就是取标号NEXT所在段的段地址.
2 3 4 2 取偏移量算符OFFSET
例如:MOV BX, OFFSET NEX
其中OFFSET NEXT就是取标号NEXT的有效地址,该语句等效于:LEA BX, NEXT
2 3 4 3 取类型算符TYPE
例如:
MOV AX, TYPE NEXT
若NEXT为近标号,则TYPE NEXT值为FFFFH(-1),若NEXT为远标号TYPE NEXT值为FFFEH(-2).其中-1和-2⽆真正的物理意义,仅以数值表⽰标号类型⽽已.
变量
变量(Variable)代表存放在某些存储单元的数据,这些数据在程序运⾏期间可以随时被修改.变量是通过变量名在程序中引⽤,变量名实际上是存储区中⼀个数据区的名字,以变量名数据的⽅式供程序员使⽤,作为指令或伪.指令的操作数,⼤⼤⽅便了程序设计者.
由于变量是在逻辑段中定义.这就决定了变量和标号⼀样具有段属性、偏移属性和类型属性,前两个和标号的属性相同,⽽类型属性是指出数据区的数据项的存取单位是字节(BYTE),字(WORD)或数字(DWORD)等.可见变量和标号的主要区别在于变量指的是数据,⽽标号则对应的是指令。
.3 1 变量的定义
变量通常也有三种定义法
.3 1 1 ⽤伪指令DB,DW,DD等来定义
格式:[变量名] 定义数据伪指令〈表达式〉
其中变量名可有可⽆,若没有名字则该变量为⽆名变量.表达式可以是常数、保留符号"?"、ASCII码字符串(只能⽤DB定义)、地址表达式(不能⽤DB定义)、预置数据表格和⽤DUP定义的重复值.变量名可在任⼀逻辑段中定义,其后边不紧跟冒号⽽是加⼀空格。
.例如:A DB 100;A为⼀个字节,值为100.
B DB 100,2 3;B值为100,B+1的值为6.
C DB 'ABC';C的值为41H,C+1的值为42H,C+2的值为43H.D DB ?;
D是⼀个字节,预留⼀个字节,可以置⼊任何内容.
E DB 23 DUP(0);定义23个0,每⼀个0占⼀个字节.
F DB 3 DUP(1,2 DUP(0));定义9个数,顺序为:1,0,0,1,0,0,1,0,0.
G DW 'AB','CD';G的值为4142H,G+2的值为4344H.
H DW 2 3;H为⼀个字,存放顺序为06,00H
I DW ? 预留⼀个字,占两个字节单元,
3 1 2 ⽤伪指令LABEL定义变量
格式:
变量名 LABEL BYTE/WORD/DWORD
例如:
BUF LABEL BYTE
DB 21
它等价于 BUF DB 21
3 1 3 ⽤伪指令EQU定义变量
格式:变量名 EQU THIS BYTE/WORD/DWORD
THIS是定义任意类型算符,它同LABEL⼀样⽤于建⽴变量或标号类型属性,⽽其段属性为语句所在段的段地址,偏移属性为所在位置的下⼀个能分配到的可⽤偏移地址.例如:
STACK SEGMENT
DW 100 DUP(?
TOP EQU THIS WORD(或TOP LABEL WORD)
STACK END
变量TOP被定义为字类型,它的偏移量应为STACK段定义100个字后的下⼀个字的偏移量,它恰就是堆栈指针SP的初值,因此经常⽤这种⽅法为SP赋初值.
3 1 4 双重定义变量名利⽤隐含⽅式和显⽰⽅式的双重⽅式,可以对同⼀位置定义为双重变量.
格式
〈变量名〉 EQU THIS〈类型〉
〈变量名〉 DB/DW/DD…
例如:
AB EQU THIS BYTE
(或AB LABEL BYTE)
AW DW 50 DUP(0)AW定义为字变量,在AW前使⽤了THIS BYTE,定义了⼀个字节类型变量,访问同⼀个位置,⽤AB按字节访问,⽤AW则按字访问.
3 2 变量的访问
3 2 1 变量名作为存储单元的直接地址
变量名⽤直接寻址时,变量的类型必须与指令的要求相符合.
例如:AB已定义字节变量,AW定义为字变量,⽤变量名作直接寻址形式如下:
MOV AH,AB
MOV AX,AW
3 2 2 ⽤合成运算符PTR临时改变变量类型
接上例⽤
MOV CX,WORD PTR AB
MOV CL,BYTE PTR AW
则可临时把AB变为字类型,AW变为字节类型,但段和偏移属性不变.
3 2 3 变量名作为相对寻址中的偏移量
例如:
MOV AX,AB〔SI〕
MOV AX,AW[BX][SI]
在这⾥AB,AW分别表⽰它们的偏移量⽽不是它们所表⽰的数据,常⽤于数组或表格操作中,AB[SI]就表⽰AB数组中第SI个元素.
3 2 4 属性分离符
其中SEG和OFFSET⽤法和标号相同,分别表⽰取变量所在段的段地址和变量的偏移地址.⽽TYPE运算符,将回送该变量类型所表⽰的字节数.
例如:设AB为字节变量,AW为字变量,则:
MOV AH,TYPE AB即MOV AH,1
MOV AX,TYPE AW即MOV AX,2
3 2 5 取变量数据项个数运算符LENGTH对于变量定义时使⽤DUP的情况,汇编程序将回送DUP前的重复次数,即分配给该变量的单元数,若表达式有多个DUP,则取第⼀个DUP项,其它情况则回送1.
例如:ARRAY DW 50 DUP(0)则
MOV CX,LENGTH ARRAY即MOV CX,50
ARRAY1,DW1,2,3 则
MOV CX,LENGTH ARRAY1
即MOV CX,1
可见LENGTH表⽰数组元素个数,⽽不管其类型.
3 2 6 取变量数据项长度算符SIZE
SIZE算符,汇编程序将回送分配给该变量的字节数,即
SIZE=LENGTHTYPE
例如:
ARRAY DW 50 DUP(0) 则
SIZE ARRAY=50 2=100
要注意:对字符串变量求其长度,使⽤SIZE不能达到⽬的.
例如:
ST DB 'ABCDEFG' 则
SIZE ST值为1⽽不是7,欲求字符串长可⽤COUNT EQU $-ST,则COUNT值为7,其中$为定义ST⼀串字符后下⼀个可⽤的偏移地址.
3 2 7 变量名仅对应数据区第⼀个数据项
例如:
WORD DW 20 DUP(?)
MOV AX,WORD;第⼀个元素送AX,
MOV AX,WORD+38;第20个元素送AX.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论