汇编语言的格式
- 格式:doc
- 大小:44.50 KB
- 文档页数:8
·汇编语言是一种符号编程语言,这些符号构成汇编指令或伪指令,汇编语言程序就是由指令和伪指令构成的。
·汇编语言指令的一般格式:[名字][操作码][操作码][操作数][注释]·CPU:CPU是执行程序的部件。
·内存:RAM是存储程序和数据的部件。
·CS,DS,ES,SS寄存器的功能:段寻址寄存器。
·子程序的作用:把多次引用的相同程序段编成一个独立的程序段,当需要执行这个程序段的时候,可以用Call指令调用。
·BIOS屏幕控制、键盘控制、鼠标控制的中断调用分别是:int 10h int 16h int 33h。
·DOS int 21提示一个字符串:AH=09H。
·打开和关闭扬声器的指令:MOV AL,11B OUT 61H,AL和MOV AL,00 OUT 61H,AL.入栈和出栈的指令格式:PUSH ...16位寄存器和pop (16)位寄存器·数据总线的多少取决于内存单元的大小,地址总线的多少取决于内存单元的多少。
·如果在汇编语言源程序中需要多次用到同一段程序,则可以将这段程序定义成一条指令,称为宏指令,一个宏定义包含3个部分,宏名、宏伪指令和宏体,宏是汇编语言的一个特点,避免了代码的重复,并使源程序简洁易读。
①DATA SEGMENTBUF DB 'HelloWorld ! This is ASM program.$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA DX,BUF MOV AH,09 INT 21HMOV AH,4CHINT 21H CODE ENDS END START②line macro x1,y1,x2,y2,color local xian1,l1,l2mov cx,x1mov dx,y1mov ah,0chmov al,color;0fhmov bh,0xian1:int 10hpush cxmov cx,9999loop $pop cxcmp cx,x2je l1inc cxcmp cx,x2jne xian1l1:cmp dx,y2je l2inc dxcmp dx,y2jne xian1l2:inc dxendmcodes segmentstart:mov ah,0mov al,12hint 10hmov ah,0bhmov bh,0mov bl,3int 10h;---------------line 200,20,400,50,0fh ;-------------------line 400,20,400,250,0fh ;-------------------line 200,250,400,250,0fh ;--------------------- line 200,20,200,250,0fh mov ah,07hint 21hmov ah,4chint 21hcodes endsend start。
汇编语言指令集数据传送指令集MOV功能: 把源操作数送给目的操作数语法: MOV 目的操作数,源操作数格式: MOV r1,r2MOV r,mMOV m,rMOV r,dataXCHG功能: 交换两个操作数的数据语法: XCHG格式: XCHG r1,r2 XCHG m,r XCHG r,mPUSH,POP功能: 把操作数压入或取出堆栈语法: PUSH 操作数POP 操作数格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA功能: 堆栈指令群格式: PUSHF POPF PUSHA POPALEA,LDS,LES功能: 取地址至寄存器语法: LEA r,m LDS r,m LES r,mXLAT(XLATB)功能: 查表指令语法: XLAT XLAT m算数运算指令ADD,ADC功能: 加法指令语法: ADD OP1,OP2 ADC OP1,OP2格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data影响标志: C,P,A,Z,S,OSUB,SBB功能:减法指令语法: SUB OP1,OP2 SBB OP1,OP2格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data影响标志: C,P,A,Z,S,OINC,DEC功能: 把OP的值加一或减一语法: INC OP DEC OP格式: INC r/m DEC r/m影响标志: P,A,Z,S,ONEG功能: 将OP的符号反相(取二进制补码)语法: NEG OP格式: NEG r/m影响标志: C,P,A,Z,S,OMUL,IMUL功能: 乘法指令语法: MUL OP IMUL OP格式: MUL r/m IMUL r/m影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志)DIV,IDIV功能:除法指令语法: DIV OP IDIV OP格式: DIV r/m IDIV r/mCBW,CWD功能: 有符号数扩展指令语法: CBW CWDAAA,AAS,AAM,AAD功能: 非压BCD码运算调整指令语法: AAA AAS AAM AAD影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD)DAA,DAS功能: 压缩BCD码调整指令语法: DAA DAS影响标志: C,P,A,Z,S位运算指令集AND,OR,XOR,NOT,TEST功能: 执行BIT与BIT之间的逻辑运算语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位SHR,SHL,SAR,SAL功能: 移位指令语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL影响标志: C,P,Z,S,OROR,ROL,RCR,RCL功能: 循环移位指令语法: ROR r/m,data/CL ROL r/m,data/CL RCR r/m,data/CL RCL r/m,data/CL 影响标志: C,P,Z,S,O程序流程控制指令集CLC,STC,CMC功能: 设定进位标志语法: CLC STC CMC标志位: CCLD,STD功能: 设定方向标志语法: CLD STD标志位: DCLI,STI功能: 设定中断标志语法: CLI STI标志位: ICMP功能: 比较OP1与OP2的值语法: CMP r/m,r/m/data标志位: C,P,A,Z,OJMP功能: 跳往指定地址执行语法: JMP 地址JXX功能: 当特定条件成立则跳往指定地址执行语法: JXX 地址注:A: ABOVE,当C=0,Z=0时成立B: BELOW,当C=1时成立C: CARRY,当弁时成立CXZ: CX寄存器的值为0(ZERO)时成立E: EQUAL,当Z=1时成立G: GREATER(大于),当Z=0且S=0时成立L: LESS(小于),当S不为零时成立N: NOT(相反条件),需和其它符号配合使用O: OVERFLOW,O=1时成立P: PARITY,P=1时成立PE: PARITY EVEN,P=1时成立PO: PARITY ODD,P=0时成立S: SIGN,S=1时成立Z: ZERO,Z=1时成立LOOP功能: 循环指令集语法: LOOP 地址LOOPE(Z)地址LOOPNE(Z) 地址标志位: 无CALL,RET功能: 子程序调用,返回指令语法: CALL 地址RET RET n标志位: 无INT,IRET功能: 中断调用及返回指令语法: INT n IRET标志位: 在执行INT时,CPU会自动将标志寄存器的值入栈,在执行IRET时则会将堆栈中的标志值弹回寄存器字符串操作指令集MOVSB,MOVSW,MOVSD功能: 字符串传送指令语法: MOVSB MOVSW MOVSD标志位: 无CMPSB,CMPSW,CMPSD功能: 字符串比较指令语法: CMPSB CMPSW CMPSD标志位: C,P,Z,S,OSCASB,SCASW功能: 字符串搜索指令语法: SCASB SCASW标志位: C,P,Z,S,OLODSB,LODSW,STOSB,STOSW功能: 字符串载入或存贮指令语法: LODSB LODSW STOSB STOSW标志位: 无REP,REPE,REPNE功能: 重复前缀指令集语法: REP 指令S REPE 指令S REPNE 指令S标志位: 依指令S而定对于IBM PC机它有它的指令系统,其中包括:数据传送指令、串处理指令、算术指令、控制移动指令、逻辑指令、处理机控制指令。
汇编语言的基本语法在计算机科学领域中,汇编语言是一种低级语言,用于编写计算机程序。
它直接操作计算机硬件,比高级语言更接近计算机底层。
汇编语言的使用需要对其基本语法有一定的了解。
本文将介绍汇编语言的基本语法,以帮助读者更好地理解和使用这种语言。
一、数据传送指令在汇编语言中,数据传送是最基本的操作之一。
它用于将一个数据从一个位置传送到另一个位置。
数据传送指令由源操作数和目的操作数组成,示例如下:MOV 目的操作数,源操作数其中,目的操作数是要传送数据的目标位置,源操作数是数据的来源位置。
例如,将一个常量值传送给寄存器AX的指令可以写成:MOV AX,1000H这条指令将十六进制常量1000H传送给寄存器AX。
二、算术指令在汇编语言中,算术指令用于对数据进行算术运算。
常见的算术运算包括加法、减法、乘法和除法。
以下是一些常用的算术指令示例:ADD 目的操作数,源操作数 ; 相加SUB 目的操作数,源操作数 ; 相减MUL 目的操作数,源操作数 ; 乘法DIV 目的操作数,源操作数 ; 除法其中,目的操作数是要进行运算的操作数存储位置,源操作数是用于运算的数据来源。
三、跳转指令在程序执行过程中,跳转指令用于改变程序的执行顺序。
它根据条件选择不同的路径执行,或者直接跳转到指定的地址。
常见的跳转指令有以下几种形式:JMP 目标地址 ; 无条件跳转JE 目标地址 ; 相等时跳转JNE 目标地址 ; 不相等时跳转JG 目标地址 ; 大于时跳转JGE 目标地址 ; 大于等于时跳转JL 目标地址 ; 小于时跳转JLE 目标地址 ; 小于等于时跳转这些指令根据前面的条件判断进行跳转。
四、循环指令在汇编语言中,循环指令用于重复执行一段程序。
常见的循环指令有以下两种形式:LOOP 目标地址 ; 循环指令,计数器减1并跳转JCXZ 目标地址 ; 循环指令,计数器为0时跳转这些指令根据指定的条件进行重复执行,直到条件不满足为止。
汇编语言及编程实例(电子教案)汇编语言程序设计2005第四章汇编语言程序设计回顾:8086的内部结构、寄存器功能和工作过程,指令格式、寻址方式和功能。
本讲重点:了解汇编的概念及其方法,掌握汇编程序的基本格式,常用运算符的使用方法,汇编的步骤。
4.1汇编语言的基本元素一、汇编语言的语句格式由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。
每个语句由1~4个部分组成,其格式是:[标号]指令助记符[操作数][;注解]其中用方括号括起来的部分,可以有也可以没有。
每部分之间用空格(至少一个)分开,一行最多可有132个字符。
1.标识符给指令或某一存储单元地址所起的名字。
可由下列字符组成:字母:A~z;数字:0~9;特殊字符:、·、@、一、$数字不能作标识符的第一个字符,而圆点仅能用作第一个字符。
标识符最长为31个字符。
当标识符后跟冒号时,表示是标号。
它代表该行指令的起始地址;当标识符后不带冒号时,表示变量;伪指令前的标识符不加冒号。
2.指令助记符表示不同操作的指令,可以是8086的指令助记符,也可以是伪指令。
3.操作数指令执行的对象。
依指令的要求,可能有一个、两个或者没有,例如:RET;无操作数COUNT:INCC某;一个操作数如果是伪指令,则可能有多个操作数,例如:COSTDB3,4,5,6,7;5个操作数MOVA某,[BP+4];第二个操作数为表达式4.注解该项可有可无,是为源程序所加的注解,用于提高程序的可读性。
二、汇编语言的运算符1.算术运算符、逻辑运算符和关系运算符-1-汇编语言程序设计2005算术运算符可以应用于数字操作数,结果也是数字。
而应用于存储器操作数时,只有+、-运算符有意义。
2.取值运算符SEG、OFFSET、TYPE、SIZE和LENGTH·SEG和OFFSET分别给出一个变量或标号的段地址和偏移量。
例如,定义:SLOTDW25则:MOVA某,SLOT;从SLOT地址中取一个字送入A某MOVA某,SEGSLOT;将SLOT所在段的段地址送入A某MOVA某,OFFSETSLOT;将SLOT所在段的段内偏移地址送A某·TYPE操作符返回一个表示存储器操作数类型的数值。
PIC 8位单片机共有三个级别,有相对应的指令集。
基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。
其指令向下兼容。
一、PIC汇编语言指令格式PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:标号操作码助记符操作数1,操作数2;注释指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。
1标号与MCS-51系列单片机功能相同,标号代表指令的符号地址。
在程序汇编时,已赋以指令存储器地址的具体数值。
汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。
标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。
在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。
指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。
书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。
再有标号不能用操作码助记符和寄存器的代号表示。
标号也可以单独占一行。
2操作码助记符该字段是指令的必选项。
该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。
3操作数由操作数的数据值或以符号表示的数据或地址值组成。
若操作数有两个,则两个操作数之间用逗号(,)分开。
当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。
还可以是被定义过的标号、字符串和ASCⅡ码等。
具体表示时,规定在二进制数前冠以字母“B”,例如B;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。
5.2 ARM汇编语言语句格式学习完ARM的指令系统后,让我们系统地看一下ARM汇编语言的语句格式。
{符号}{指令或伪指令}{; 注释}其中,需要注意的是:(1)在ARM汇编语言中,符号必须从一行的行头开始,并且符号中不能包含空格。
符号可以为地址标号,也可以是某些指令中的变量或常量。
(2)在ARM汇编语言中,指令不能从一行的行头开始,前面必须有空格或者符号。
(3)注释以“:”开头,可以单独占据一行。
汇编器在汇编时忽略所有的注释。
(4)在ARM汇编语言中,指令助记符必须统一大写或者小写,不能在一个助记符中既有大写字母又有小写字母。
伪指令必须大写。
(5)语句之间可以插入空行,以增加程序的可读性。
如果一条语句很长,可以分成若干行来写。
在一行的末尾用“\”表示下一行将续在本行之后。
注意在“\”之后不能再有其它任何字符。
6.2.1ARM汇编语言的符号前面提到ARM汇编语言的符号可以为地址标号,以可以为变量或者是常量。
对于地址标号,当以数字开头时,其作用范围为当前段(当没有使用ROUT伪操作时),这种标号又称局部标号。
标号的命名满足如下规则:(1)符号由大小字母、数字以及下划线组成;(2)局部标号以数字开头,其他的符号均不能以数字开头;(3)符号区分大小写;(4)符号中所有字符都是有意义的;(5)符号在其作用范围内必须唯一,即在其作用范围内不可有同名的符号;(6)程序中的符号不能与系统内部变量或者系统预定义的符号同名;(7)程序中的符号通常不要与指令助记符或伪指令同名。
当程序中的符号与指令助记符或伪指令同名时,用双竖线将符号括起来,如||require||,这时的双竖线并不是符号的组成部分。
1.常量ARM中的常量有数字常量、逻辑常量、串常量和字符常量。
在ARM汇编语言中,使用EQU 来定义常量,常量一经定义,其数字就不能再修改。
数字常量是一个32位的整数,当作为无符号整数时,取值范围为0~232-1;当作为有符号整数时,取值范围为-231~231-1汇编器并不区分一个数是无符号数还是有符号数,事实上-n与232-n在内存中是同一个数。
Intel格式和ATT格式汇编区别⼀、AT&T 格式Linux 汇编语法格式1. 在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀;⽽在 Intel 汇编格式中,寄存器名不需要加前缀。
例如:AT&T格式Intel格式pushl %eax push eax2.在 AT&T 汇编格式中,⽤ '$' 前缀表⽰⼀个⽴即操作数;⽽在 Intel 汇编格式中,⽴即数的表⽰不⽤带任何前缀。
例如:AT&T格式Intel格式pushl $1push 13.AT&T 和 Intel 格式中的源操作数和⽬标操作数的位置正好相反。
在 Intel 汇编格式中,⽬标操作数在源操作数的左边;⽽在 AT&T 汇编格式中,⽬标操作数在源操作数的右边。
例如:AT&T格式Intel格式addl $1, %eax add eax, 14.在AT&T 汇编格式中,操作数的字长由操作符的最后⼀个字母决定,后缀'b'、'w'、'l'分别表⽰操作数为字节(byte,8 ⽐特)、字(word,16 ⽐特)和长字(long,32⽐特);⽽在 Intel 汇编格式中,操作数的字长是⽤ "byte ptr" 和 "word ptr" 等前缀来表⽰的。
例如:AT&T格式Intel格式movb val, %al mov al, byte ptr val5.在 AT&T 汇编格式中,绝对转移和调⽤指令(jump/call)的操作数前要加上'*'作为前缀,⽽在 Intel 格式中则不需要。
6.远程转移指令和远程⼦调⽤指令的操作码,在AT&T 汇编格式中为"ljump" 和 "lcall",⽽在Intel 汇编格式中则为"jmp far" 和 "call far",即:AT&T格式Intel格式ljump $section, $offset jmp far section:offsetlcall $section, $offset call far section:offset7.与之相应的远程返回指令则为:AT&T格式Intel格式lret $stack_adjust ret far stack_adjust8.在 AT&T 汇编格式中,内存操作数的寻址⽅式是section:disp(base, index, scale)9.⽽在 Intel 汇编格式中,内存操作数的寻址⽅式为:section:[base + index*scale + disp]10.由于 Linux ⼯作在保护模式下,⽤的是 32 位线性地址,所以在计算地址时不⽤考虑段基址和偏移量,⽽是采⽤如下的地址计算⽅法:disp + base + index * scale11.下⾯是⼀些内存操作数的例⼦:AT&T格式Intel格式movl -4(%ebp), %eax mov eax, [ebp - 4]movl array(, %eax, 4), %eax mov eax, [eax*4 + array]movw array(%ebx, %eax, 4), %cx mov cx, [ebx + 4*eax + array]movb $4, %fs:(%eax)mov fs:eax, 4⼆、Hello World!既然所有程序设计语⾔的第⼀个例⼦都是在屏幕上打印⼀个字符串"Hello World!",那我们也以这种⽅式来开始介绍Linux 下的汇编语⾔程序设计。
5.2 汇编语言源程序的格式在第四章介绍指令系统时曾给出若干程序举例,但是,它们仅仅是一些程序片段,并不是完整规范的汇编语言源程序。
下而给出一个比较简单,然而比较规范的汇编语言源程序。
例5.1要求将两个五字节16进制数相加,可以编写出以下汇编语言源程序。
DATA SEGMENT ;定义数据段DATA1 DB 0F8H,60H,0ACH,74H,3BH ;被加数DATA2 DB 0C1H,36H,9EH,0D5H,20H ;加数DATA ENDS ;数据段结束CODE SEGMMENT ;定义代码段ASSUME CS:CODE,DS:DA TASTART:MOV AX,DATAMOV DS,AX ;初始化DSMOV CX,5 ;循环次数送CXMOV SI,0;置SI初值为0CLC;清CF标志LOOPER:MOV AL,DATA2[SI];取一个字节加数ADC DA TA1[SI],AL;与被加数相加INC SI;SI加1DEC CX;CX减1JNZ LOOPER;若不等于0,转LOOPERMOV AH,4CHINT21H;返回DOS CODE END;代码段结束END START;源程序结束5.2.1 分段结构由上面的例子可以看出,汇编语言源程序的结构是分段结构形式,一个汇编语言源程序由若干段(SEGMENT)组成,每个段以SEGMENT语句开始,以ENDS语句结束。
整个源程序的结尾是END语句。
这里所说的汇编语言源程序中的段与前面讨论的CPU管理的存储器的段,既有联系,又在概念上有所区别。
我们已经知道,微处理器对存储器的管理是分段的,因而,在汇编语言程序中也要求分段组织指令、数据和堆栈,以便将源程序汇编成为目标程序后,可以分别装入存储器的相应段中。
但是,以8086/8088 CPU为例,它有四个段寄存器(CS,ES,SS和DS),因此CPU对存储器按照四个物理段进行管理,即数据段,附加段,堆栈段和代码段。
任何时侯CPU只能访问四个物理段。
而在汇编语言源程序中,设置段的自由度比较大。
例如一个源程序中可以有多个数据段或多个代码段等等。
一般来说,汇编语言源程序中段的数目可以根据实际需要而设定。
为了和CPU管理的存储器物理段相区别,我们将汇编语言程序中的段称为逻辑段。
在不致发生混淆的地方,有时简称为段。
在上面的简单源程序中只有两个逻辑段,一个逻辑段的名字是DATA,其中存放着与程序有关的数据,称为逻辑数据段;另一个逻辑段的名字是CODE,其中包含着程序的指令,称为逻辑代码段。
每个段内均有若干行语句(STA TEMENT),因此,可以说一个汇编源程序是由一行一行的语句组成的。
下面我们来讨论汇编语言语句的类型和组成。
5.2.2 汇编语言语句的类型和格式一.语句的类型汇编语言源程序中的语句可以分为两种类型:指令语句,伪指令语句。
⒈指令语句:它是能产生目标代码,CPU 可以执行的能完成特定功能的语句。
⒉伪指令语句:它是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应如何汇编。
例如,告诉汇编程序已写出的汇编语言源程序有几个段,段的名字是什么;定义变量,定义过程,给变量分配存储单元,给数字或表达式命名等。
所以伪指令语句是为汇编程序在汇编时用的。
二.语句的格式指令语句与伪指令语句的格式是类似的。
一般情况下,汇编语言的语句可以由1~4部分构成:[名字]? 助记符? [操作数]? [;注释]其中带方括号的部分表示任选项,既可以有,也可以没有。
例5.1中有如下语句:LOOPER:MOV AL,DATA2[SI];取一个字节加数DA TA1DB0F8H,60H,0ACH,74H,3BH;被加数第一条语句是指令语句,其中“LOOP ER:”是名字,“MOV”是指令助记符,“AL,DA TA2[SI]”是操作数,“;”后面是注释部分;第二条语句是伪指令语句,其中“DATA1”是名字,“DB”是伪指令定义符,“0F8H,60H,0ACH,74H,3BH”是操作数,“;”后面是注释部分。
下面对汇编语言中的各个组成部分进行讨论。
⒈名字汇编语言语句的第一个组成部分是名字(Name)。
在指令语句中,这个名字是一个标号。
指令语句中的标号实质上是指令的符号地址。
并非每条指令语句必须有标号,但如果一条指令前面有一标号,则程序中其它地方就可以引用这个标号。
在例5.1中,START、LOOPER 就是标号。
标号后面通常有一个冒号。
标号有三种属性:段、偏移量和类型。
①标号的段属性是定义标号在程序段的段地址,当程序中引用一个标号时,该标号的段值应在CS寄存器中。
②标号的偏移量属性表示标号所在段的起始地址到定义该标号的地址之间的字节数。
偏移量是一个16位无符号数。
③标号的类型属性有两种:NEAR和FAR。
前一种标号可以在段内被引用,地址指针为2个字节;后一种标号可以在其它段被引用,地址指针为4字节。
如果定义一个标号时后跟冒号,则汇编程序确认其类型为NEAR。
伪指令语句中的名字可以是变量名、段名、过程名。
与指令语句中的标号不同,这些伪指令语句中的名字并不总是任选的,有些伪指令规定前面必须有名字,有些则不允许有名字,也有一些伪指令的名字是任选的。
即不同的伪指令对于是否有名字有不同的规定。
伪指令语句的名字后面通常不跟冒号,这是它和标号的一个明显区别。
很多情况下伪指令语句中的名字是变量名,变量名代表存储器中一个数据区的名字,例如例5.1中的DATA1、DA TA2就是变量名。
变量也有三种属性:段、偏移量和类型。
①变量的段属性是变量所代表的数据区所在段的段地址。
由于数据区一般在存储器的数据段中,因此变量的段地址常常在DS和ES寄存器中。
②变量的偏移量属性是该变量所在段的起始地址与变量的地址之间的字节数。
③变量的类型属性有BYTE(字节)、WORD(字)、DWORD (双字)、QWORD (四字)、TBYTE(十字)等,表示数据区中存取操作对象的大小。
⒉助记符汇编语言语句中的第二个组成部分是助记符(Memonic)。
在指令语句中的第二部分是CPU指令系统中指令的助记符,例如:MOV ADC等等。
助记符约有90多种,在第四章中已经进行了详细的讨论。
在伪指令语句中的第二部分是伪指令的定义符,例如:DB、SEGMENT、ENDS 、END 等都是伪指令定义符。
它们在程序中的作用是定义变量的类型、定义段以及告诉汇编程序结束汇编等。
关于伪指令的作用和使用方法,将在本章第三节进行讨论。
⒊操作数汇编语言语句中的第三个组成部分是操作数。
在指令语句中是指令的操作数,可能有单操作数或双操作数,也可能无操作数;而在伪指令中可能有更多个操作数。
当操作数不止一个时,相互之间应该用逗号隔开。
可以作为操作数的有:常数、寄存器、标号、变量和表达式等。
⑴常数常数就是指令中出现的哪些固定值,可以分为数值常数和字符串常数两类。
例如,立即数寻址时所有的立即数,直接寻址时所有的地址,ASCII字符串都是常数,常数是除了自身的值以外,没有其它属性的数值。
在源程序中,数值常数按其基数的不同,可有二进制数,八进制数,十进制数,十六进制数等几种不同表示形式。
汇编语言用不同的后缀加以区别。
还应指出,汇编语言中的数值常数的第一位必须是数字,否则汇编时将被看成是标识符,如常数B7H应写成0B7H,FFH应写成0FFH。
字符串常数是由单引号括起来的一串字符。
例如…ABCDEFG‟和…179‟。
单引号内的字符在汇编时都以ASCII的代码形式存放在存储单元中。
如上述两字符串的ASCII代码为41H,42H,43H,44H,…,48H和31H,37H,39H。
字符串最长允许有255个字符。
⑵寄存器8086/8088CPU的寄存器可以作为指令的操作数。
⑶标号由于标号代表一条指令的符号地址,因此可以作为转移(无条件转移或条件转移)、过程调用CALL以及循环控制LOOP指令的操作数。
⑷变量因为变量是存储器中某个数据区的名字,因此在指令中可以作为存储器操作数。
⑸表达式汇编语言语句中的表达式,按其性质可分为两种:数值表达式和地址表达式。
数值表达式产生一个数值结果,只有大小,没有属性。
地址表达式的结果不是一个单纯的数值,而是一个表示存储器地址的变量或标号,它有三种属性:段、偏移量和类型。
表达式中常用的运算符有以下几种:1) 算术运算符常用的算术运算符有:+(加),-(减),*(乘),/(除)和MOD(模除,即两个整数相除后取余数)等。
以上算术运算符可用于数值表达式,运算结果是一个数值。
在地址表达式中通常只使用其中的+和-(加和减)两种运算符。
2) 逻辑运算符逻辑运算符有:AND(逻辑“与”),OR(逻辑“或”)、XOR(逻辑“异或”)和NOT(逻辑“非”)。
逻辑运算符只用于数值表达式中对数值进行按位逻辑运算,并得到一个数值结果。
对地址进行逻辑运算是没有意义的。
3) 关系运算符关系运算符有:EQ(等于),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)等。
参与关系运算的必须是两个数值或同一段中的两个存储单元地址,但运算结果只可能是两个特定的数值之一:当关系不成立(假)时,结果为0(全0);当关系成立(真)时,结果为0FFFFH(全1)。
例如:MOV AX,4 EQ 3 ;关系不成立,故(AX)←0MOV AX,4 NE 3 ;关系成立,故(AX)←0FFFFH4) 分析运算符分析运算符用于分析一个存储器操作数的属性,如段值,偏移量和类型等,或取得它所定义的存储空间的大小。
分析运算符有SEG、OFFSET、TYPE、SIZE和LENGTH等。
① SEG运算符利用运算符SEG可以得到一个标号或变量所在段的段地址。
例如下面两条指令将变量ARRAY的段地址送DS寄存器。
MOV AX,SEG ARRAYMOV DS,AX② OFFSET运算符利用运算符OFFSET可以得到一个标号或变量的偏移地址,例如:MOV DI,OFFSET DA TA1③ TYPE运算符运算符TYPE的运算结果是一个数值,这个数值与存储器操作数类型属性的对应关系见表5.1。
下面是使用TYPE运算符的例子:V AR DW;变量V AR的类型为字ARRAY DD10 DUP(?);变量ARRAY的类型为双字STR DB'THIS IS TEST';变量STR的类型为字节…MOV AX,TYPE V AR;(AX)←2MOV BX,TYPE ARRAY;(BX)←4MOV CX,TYPE STR;(CX)←1…其中的DW、DD、DB等为伪指令定义符,这将在第三节中介绍。
表5.1TYPE返回值与类型的关系TYPE返回值存储器操作数的类型1 BYTE2 WORD4 DWORD6 FWORD8 QWORD10 TBYTE-1 NEAR-2 FAR④ LENGTH运算符如果一个变量已用重复操作符DUP说明其变量的个数,则利用LENGTH 运算符可得到这个变量的个数。