计算机组成原理与汇编语言程序设计.ppt
,计算机组成原理与汇编语言程序设计,第5章,慨队哺帽巡惊痹诣罐隙叠抓峻襟薛颈太牙施瑶丢感设集厢额煽狡丢定再疥计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,重点章节 1掌握:常用汇编语言语句、伪指令、源程序的一般结构,顺序程序设计,分支程序设计,简单循环程序设计,子程序设计;能够读写常用汇编语句编写的程序段。2理解:宏操作伪指令,系统功能调用。3了解:汇编语言程序的开发方法。,沼池破卵乾被晾杂身梦烃靳闺构孟扑置为园牢郭贾腥影压瘟垒寅矾鹃冻皑计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,汇编语言程序是符号化的机器语言,汇编语言必须经过“汇编”(即 翻译)转换成机器语言指令代码,再由计算机识别并执行。汇编语言源程序 目标程序汇编语言源程序的基本组成单位是语句。源程序中使用的语句有三种:指令语句、伪指令语句和宏指令语句(或称宏调用语句)5.1概述5.2汇编语言语句一、指令语句格式 指令语句的一般格式如下:标号:指令助记符 操作数;注释1标号:标号是机器指令语句存放地址的符号表示,代表该指令目标代码的第一个字节地址,后面必须紧跟冒号“:”,在指令语句中,是任选字段。2指令助记符:指令助记符为语句的核心成分,表示了该语句的操作类型。,汇编程序,操作数的有无、有几个,取决于指令助记符,翻译后,没有对应的目标代码,曝涧琼韧俐龟赎错鸳练偷本捻蚤熊鸡苑岸愁洽杉涨括蝗庇药侮嚼泞畦责赎计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,3操作数:操作数表示指令助记符的操作对象。4注释:注释均以分号开始,它可占一行或多行,一般放在一条语句的后面。例:一项是含有4个字段的一条指令语句:LOP:MOV AX,0000H;将AX清零 标号 指令助记符 操作数 注释 例:以下是含有4个字段的一条指令语句 INC CX二、伪指令语句格式如下:符号名 伪指令符 操作数;注释1符号名:符号名是伪指令语句的一个可选项。允许是常量名、变量名、过程名或段名。注意符号名后无冒号。2伪指令符:伪指令符指定汇编程序要完成的具体操作,如数据定义伪指令DB、DW、DD,段定义伪指令SEGMENT,假定伪指令ASSUME等。此字段必不可少。,缄协遭膏掩命塞铸申汁青坦蹈较颊援佐捌傣着哉俏鹰吟卧率肃齿秤斑俱净计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,3操作数:伪指令后面的操作数可以是常数、字符串、变量、表达式等,其个数由具体的伪指令决定,各个操作数之间必须以“逗号”分隔。4注释:伪指令的注释必须以“;”开始,其作用同指令语句中的注释部分。伪指令语句是指示汇编程序如何汇编源程序的命令语句,在汇编时,它不产生目标代码,由汇编程序解释他的意义逼供能立即完成相应的操作。例:以下是一条伪指令语句:VAR1 OB 12H;给VAR1分配一个字节单元,初值为12H 三、标识符 标识符是指令语句中标号和伪指令语句中的符号名和统称,其组成规则如下:(1)字符个数131;(2)第一个字符开始,可以是字母或特殊字符,特殊字符有5个:?_$.;(3)第二个字符开始,可以是字母、数字或特殊字符;(4)标识符不能与系统专用保留字(伪/指令助记符)相同,汤纵赵愉险福扯鲸狼烷惩陆颐秸跃驳方沃北状淑森楼起拂胡自贩意炎缚形计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,例如:标识符:?ABC、_VAR、.234、A2 非标识符:1ABC、VAR、ADD、256 总结:伪指令和指令的通用格式:1311.名字字段(Name Field)名字字段的三个注意事项:开头2.操作符字段(Operator Field)保留字3.操作数字段(Operand Field)4.注释字段(Comment Field)5.3汇编语言数据5.3.1符号定义语句1、等值伪指令指令格式:符号 EQU 表达式/符号EQU伪指令的左移是将表达式的值或表达式赋给EQU左边的符号例:用符号标识常数、数值表达式 NUM EQU 10H COUN EQU 1234+34-67 VAR DB NUM MOV AX,NUM,符号定义后可在表达式中使用,摹殃蚂倍列蠢欣鸯形魁豹观从寺狡卓瞻忍搁磕婴耐埋烙遥捂疹疗蔚树脆婴计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,例:用字符代表地址表达式、变量名和标号 ADR EQU ES:BXSI VB EQU DATA_BYTE+1 L1 EQU FAR PTR SUB1 MOV ADR,AL ADD BL,VB JMP L1例:用符号代表寄存器、指令助记符 AREG EQU AX M EQU MOV MOV AREG,1234H M CX,BX 等值伪指令语句仅在汇编源程序时,作为替代符号用,不产生任何目标代码,也不分配存储单元。在同一源程序中,同一符号不能用EQU伪指令重新定义。例如:,瞬疑熙通萌鞘惠陨盼突蔚划余帅侯挫莎痰格森须壤扶滨喘谷衬疤愉农皋羞计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,M EQU MOV M EQU MUL第二条语句在汇编时,会产生符号重新定义的语法错误。2、等号伪指令格式:符号表达式这种伪指令的含义和作用与EQU等值伪指令相同。但有如下差异:(1)等号伪指令可以重新定义符号。例如:CONT10 M100 CONTCONT10 M30(2)等号伪指令不可以重新定义汇编指令,EQU可以,年哭膛扦场场氰豆窗目晒楷偷恕刺淮锻轴妈烟龄声蜕小睬轩氛扛抗晕俗哲计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,5.3.2数据定义语句数据定义伪指令语句格式如下:DB变量名 DW 表达式1,表达式2,DD DB:为定义的变量分配字节单元DW:为定义的变量分配字单元DD:为定义的变量分配4个字节单元/双字单元数据定义语句必须出现在某个逻辑段中例:在DATA1数据段中定义了3个变量:DATA1 SEGMENT VAR1 DB 10H VAR2 DW 1234H VAR3 DD 12345678H经过定义后的每个变量都有3个属性:,标识符条件,伪指令符,腕勋咸下饯喻忍拷泪浙世壁充即牙务息葛氢纲仁犬饰慎役病啥峙逊抱敦宁计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,(1)段属性(SEG)表示变量存放在哪一个逻辑段中,它是用变量所在段的段基值来表示的。例如上面的DATA1数据段定义的VAR1、VAR2、VAR3 3个变量段属性就是DATA1段的段基值。(2)偏移量属性(OFFSET)该属性表示变量在逻辑段中相距段起始地址(段基址)的字节数。例如:VAR1的偏移量为0,VAR1的偏移量为1,VAR1的偏移量为2上述段和偏移量2个属性就构成了变量的逻辑地址。(3)类型属性(TYPE)该属性表示变量所占存储单元的字节个数:字节数据、字数据、双字数据。DB将变量定义为字节型(1个字节),DW将变量定义为字型(2个字节),DD将变量定义为双字型(4个字节)。数据定义语句按照伪指令DB,DW和DD所确定的数据大小来给变量(或 存储单元)分配相应数量的存储单元,同时给这些存储单元预置由表达式 确定的初值。它们通常有以下几种形式:1、数值表达式 例如:DATA数据段定义了字节、字、双字变量,氦地乖啼吕车汪召撑降洪刚鳖奥十拢再榆渐士月啪电甥簧族航拖兄迫怕笨计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,DATA SEGMENTVARB1 DB 10HVARB2 DB 10,11,12 DB 0FFH,0VARW DW 1234H,5678HVARD DD 12345678HDATA END,VARB1,10H,VARB2,0AH,0BH,0CH,FFH,00H,34H,12H,78H,56H,78H,56H,34H,12H,VARW,VARD,字,字,双字,缨画敖海獭减辊良伐捕夺污遗嘘酶显嫉璃滦筑符卜钻壶倒瓜柬冻秽黑猛盘计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,2、字符串表达式例如:以下是3个字符串变量的定义DATA_S SEGMENTSTRING1 DB ABCDSTRING2 DW AB,CD,ASTRING3 DD ABDATA_S ENDA、用DW伪指令定义字符串时,每一个字符串只能由12个字符组成,并分配2个字节存储单元。如果是两个字符组成,则前一个字符的ASCII码放在高字节单元中,后一个放在低字节单元。B、DD定义字符串时,每一个字符串只能由12个字符组成,并分配4个字节存储单元。其中12个字符的ASCII码存储在两个低字节(顺序和DW伪指令相同)中,两个高字节放00H。C、DB伪指令定义字符串时,每个字符串中字符个数不得超过256个。,搁恰旅堰厂渤捎嗓刁啥凹瓜捕侮沽勉霖暗垢玛林蓝吸畦倍泌呀柳弄址铅伶计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,3、地址表达式(只适用DW和DD两个伪指令)4、?表达式5、带DUP的表达式 DB变量名 DW 表达式1 DUP(表达式2)DD DUP操作符允许嵌套使用,即表达式2又可以是一个带DUP的表达式,STRING1,41H,STRING2,42H,43H,44H,42H,41H,44H,43H,41H,00H,42H,41H,00H,00H,STRING3,字,字,双字,字,评韦娜象礼鲜印通盛汀音蝇旦水欢纺掂噬赣观临伏摹惭倔谱既亦螺由娃遣计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,例如:BUF DB 100 DUP(0)以上语句定义了以BUF为首址,大小为100个字节,初值为0的数据存储单元。5.3.3数据一、常数1、数值常量,嗜淮浇蝇为枪琐拳卑先授插淆种深娱薄花甜鼎兹械掩籽拌恐盈纽局烂骄鸣计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,2、字符串常量字符串常量是用单引号或双引号引起来的一个或多个字符。字符串常量是以各字符的ASC码表示的。如A用41H 表示,字符串A1B2用41H,31H,42H,32H表示。3、常数的使用(1)在指令语句的源操作数中作立即数。如:ADD AL,0F5H;常数作源操作数 MOV AX,AB;字符串作源操作数 MOV CX,12;字符串作源操作数(2)在指令语句中,常数可作为存储器操作数寻址方式中的位移量。如:MOV AX,DS:1000H;直接寻址方式 ADD 10HDI,CX;变址寻址方式 MOV AL,0ABHBX;基址寻址方式 SUB DX,1234HBPSI;基址变址寻址方式(3)在数据定义伪指令中,可作为分配单元的初值。如:DW 1234H;定义一个字数据 DB ABCD;定义4个字符的字符常量,胳光扔啦奏来巷硬叭鹏晾域路坍另提烛挨考瘴酱瓢涂阂硕决钨捏月鼓谢筒计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,二、变量1、变量(1)段属性(2)偏移地址属性(3)类型属性2、变量的使用在一个逻辑段中,用数据定义语句定义并预置数据初值后,变量名就作为存储单元的符号地址,代表了存放在存储单元的数据。引用变量名就是使用变量。其他语句中,使用分为两种情况:(1)在指令语句中 一个地址表达式的值表示了存放操作数的存储单元偏移量。a、直接引用变量名对变量进行存取操作 例如:VAR1 DB 0FFH VAR2 DB?STRING DB ABCD MOV AL,VAR1;直接寻址方式 MOV VAR2,AL;直接寻址方式 MOV BL,STRING+1;放B字符的ASCII码放到BL中,庐哮噪殴惧致札枫缸晒黄世树光埃嘲在钨雕书灼扛趟戮盛九纲抚锰骸祁估计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,b、位移量部分使用变量名 例:VAR3 DB 10H DUP(1)VAR4 DW 10H DUP(?)MOV AL,VAR3SI;变址寻址,用VAR3的偏移量 作为源操作数的位移量 MOV VAR4BXDI,DX;基址变址寻址,用VAR4的偏 移量作为目的操作数的位移量(2)在用DW或DD的数据定义伪指令中分配的存储单元中,将预置被引用变量的地址部分段基值和偏移量。如使用DW,则仅有被引用变量的偏移量;如使用DD,则前两个字节存放偏移量,后两个字节存放段基值。在这种情况下,不能在DB数据定义语句中引用变量名。例:VAR1 DB 10H DUP(0)VAR2 DW 10H DUP(AB)ADR1 DW VAR2 ADR2 DD VAR2,呻粱缸坡则或叭却瘤薄抒湛棱瘁青府伐洒辈揣立昧剂抱薛戚戏束血友卖畏计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,上述示例中,变量ADR1的内容(即字存储单元内容)是变量VAR2的偏移量,而ADR2双字存储单元的内容是变量VAR2的偏移量和段基值。三、标号指令语句的名字字段上的名字叫标号,它是一条指令的符号地址。标号是一条指令语句的符号地址。在汇编源程序中,只有在需要转向一条指令语句时,才为该指令语句设置标号,以便在转移类指令(含子程序调用指令)中直接引用这个标号。因此,标号可作为转移类指令的操作数,即转移地址。例:符号地址表示。NEXT:MOV AL,SI;带标号NEXT的指令 DEC CX JNE NEXT;标号NEXT作转移指令的操作数,租锅佯秀莽频捂诞殖麓另悦经耽苍圣屡二忱损擂棱奔窗辅儡延捅畜沏剃声计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,和变量一样,每个标号也有3个属性:(1)段属性(SEG)段属性表示标号所在指令在哪个逻辑段,用这个逻辑段的段基值表示。(2)偏移量属性(OFFSET)偏移量属性表示标号所在指令离段起始单元之间的字节数(准确地讲,是指这条指令目标代码的首字节单元与段起始单元之间相距的字节数)同样,上述两个属性就构成了这条指令的逻辑地址。(3)类型属性(TYPE)类型属性表明了它的转移特性,即是作为段内转移还是段间转移的目标地址。标号的类型属性有2中:NEAR(近):段内转移。本标号只能作为标号所在段转移类指令的目标地址。FAR(远):段间转移。本标号可作为其他段(不是标号 所在段)转移类指令的目标地址,苇冠著挨缎水纠璃蓑拣臂牙芥刹贡脓命臣悬峻剥仓段骋辐费翟江货旱活旋计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,标号的类型属性可以用下面两个方法来设置:1、隐含方式,某一指令选定一标号后,隐含为NEAR属性。例如:NEXT:MOV AX,1234H这时,标号NEXT就具有NEAR的类型属性。隐含方式不能设置FAR属性2、用标识伪指令LABEL设置类型属性。LABEL伪指令语句格式:名字 LABEL 类型 LABEL伪指令的意义是:指定名字(如标号、变量名)的类型属性。通常与指令语句、数据定义语句配合使用,补充设置类型属性。其使用分2中情况:A、LABEL语句与指令语句连用 SUB1_FAR LABEL FAR SUB1:MOV AX,789H,佬文漂曹馁想康鸡胞旋担给升烦牺递巴挥喷颧瓣刀往腺菩随总心伙套竹已计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,SUB1_FAR和SUB1有相同的段和偏移量属性的标号,但属性类型不同,SUB1_FAR是FAR,SUB1是NEAR。如果这一指令是某程序段的入口,则段内转移时可用SUB1作为入口,而其他段转移到此程序段时,就要用SUB1_FAR作入口。B、LABEL语句与数据定义语句连用 例:DA_B1 LABEL BYTE DA_W1 DW 10H DUP(1234H)上述变量DA_W1的数据类型是字,因此每次对它的存取是按字(两个字节)进行。如:“MOV AX,DA_W14”指令就是把DA_W1起始的第5,6个字节组成的3个字节送AX。欲想取出第5个字节的内容,这时可用“MOV AL,DA_B1+4”。5.3.4表达式与运算符1算术运算符2逻辑运算符3关系运算符4属性与分离字节运算5数值返回运算符,虱它锈饭旋戚肛唉师延粗均踞谗钾日垢吮狮寒壹鸯耍坦愁仪倍穿午谦裙值计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,1算术运算符算术运算符包括:(加)、(减)、*(乘)、(除)、MOD(求模)、(下标运算)、SHL(左移)、SHR(右移)几种,它既可 以用于数值表达式又可用于地址表达式。【例3.4】用算术运算符进行数值表达式运算。NUM1 EQU 25*4 50;NUM1=50 NUM2 EQU NUM1/7;NUM2=7 NUM3 DB NUM1 MOD 7;NUM3=1 VAR1 DB 1,2,3,4,5 VAR2 DB 12345 NUM4 EQU VAR2-VAR1;NUM4=5 NUM5 EQU 0FH MOVAL,NUM5 SHL 4;(AL)=11110000B MOVBL,NUM5 SHR 4;(BL)=00000000B,峻奎语乐厢暑椭毫组淹痛蘑蹿丽卯内节玲慑靖兰嚷平匠酶淀镣冒媚壹老齿计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,移位运算符与移位指令是完全不同的。移位运算符是对某一具体数(常数)在汇编时完成移位的,而移位指令是对一个寄存器操作数或存 储器操作数,在程序允许时完成的。下标运算符 只用于地址表达式,它表示地址相加,常用于存取数组 元素。如:下面两条指令语句是等价的。MOV AX,ARRAY3 MOV AX,ARRAY+32逻辑运算符逻辑运算符包括:逻辑乘(AND)、逻辑加(OR)、按位加(XOR)、逻辑非(NOT)四种运算。由于逻辑运算是按位操作,且在汇编过程中完成,因而运算的结果仍为整数常量。【例】用逻辑运算符进行运算。MOVAL,34H AND 0FH;04HAL MOVBL,05H OR 30H;35HBL,顶矛底坦伦采钳令旱蓝颁否垂犯咬痒伏费卸馋朋攫捆抢眨贝瞅伤役罪刻颗计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,MOVCX,NOT 00FFH;0FF00HCX MOVDX,789AH XOR 000FH;7895HDX3关系运算符关系运算符包括:相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。对2个表达式比较要求2个表达式表示方法/性质相同,例同为数值表达式或地址表达式。当关系成立时,结果为全1;不成立时,为全0。【例】用关系运算符进行数值表达式运算。NUM1DB 10 LT 5;NUM1=0NUM2DB 0AAAAH GT 7FFFH;NUM2=0FFFFHMOVAX,A EQ 41H;0FFFFHAXMOVBX,NUM2 LT NUM1;0BX,鬃膳汞广每肖苹恶涩谆注争生镑坍坛阀钦雁护宋表探啤推前研作算渭悼傲计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,4.数值返回运算符(1)SEG 运算符(2)OFFSET运算符(3)TYPE运算符(4)LENGTH运算符(5)SIZE运算符,(1)SEG 运算符格式:SEG 变量或标号功能:分离出其后变量或标号所在段的段首址。例如:MOVAX,SEGARR MOVDS,AX(2)OFFSET运算符格式:OFFSET 变量或标号功能:分离出其后变量或标号的偏移地址。例如:MOV BX,OFFSET BUF,溶严速傍邀认撰缚傀督圃锯驰迎筑勇冕珐篓籍哭津有滓蒙辕垛惜函困挑诛计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,例:设DATA数据段是从物理地址20000H开始,其定义如下:DATA SEGMENT VAR1 DB 10,15,20 VAR2 DW 0FFFFH,100H DATA ENDS MOV AX,SEG VAR1 MOV SI,OFFSET VAR1 MOV BX,SEG VAR2 MOV DI,SEG VAR2上述4条指令汇编后就分别是:MOV AX,2000H MOV SI,0 MOV BX,2000H MOV DI,3,补敖窄揖剩憎赶兄删室冲戈袁呀使老讼熊绵闪曝矛像议金榔顾屠捕漓恢汕计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,(3)TYPE运算符格式:TYPE 变量或标号功能:分离出其后变量或标号的类型。如果是变量,将返回该变 量的类型对应字节数;如果是标号,则返回代表标号类型的数 值。它们之间的关系见表3.2所示。,壬逛吮颤私中龚哎骇猪癣憾瓮坪猴猖炸牧犬脖嗡眺梅除嘎哦阮秦盯值褥笋计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,例如:VAR1 DB 12H,13H VAR2 DW 10H,DUP(0)VAR3 DD VAR1 MOV AL,TYPE VAR1;AL1 MOV CX,TYPE VAR2;CX2 MOV BL,TYPE VAR3;BL4(4)LENGTH运算符和SIZE运算符格式:LENGTH 变量功能:取出变量所含的数据存储单元个数。格式:SIZE 变量功能:取出变量所含的数据存储区大小。其返回值为:LENGTH 变量*TYPE 变量,狐票妻垃祖迸剂脱控摈碱楷螟汾否汽悟恃索乐涨诡喜豁菏癣侮粕鞘受马债计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,LENGTH和SIZE运算符的具体运算规则是:如果变量是用重复操作符 DUP定义的,那么运算符LENGTH的运算结果是外层DUP的给定值(即外层重复次数),如果没有用DUP定义的变量,运算结果总是1。而运算符SIZE是LENGTH和TYPE两个运算结果的乘积。【例】取出变量占存储单元个数。DATASEGMENT A DBABCDEF BDW10DUP(1,2DUP(2)CDB3,20DUP(0)DATAENDS MOVAX,LENGTH A;1AX MOVBX,LENGTHB;10BX MOVCX,LENGTHC;1CX,辅墒硕烟段尊钦骄赡芥霸更级辗闺超陋肉岂担饶液羞尧绰专鲁缔疫邓回该计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,SIZE A=LENGTH A*TYPE A=1 SIZE B=LENGTH B*TYPE B=20 SIZE C=LENGTH C*TYPE C=1SIZE只能加在变量前面,对于一维数组,正好是数则所占的存储单元的字节数。5、属性与分离字节运算1、属性运算符 这种运算符的运算对象只能是变量、标号或存储器地址。其功能是在汇编过程中,为存储器操作数指定一个新的类型属性。格式:类型 PTR 地址表达式 其中,类型可以为BYTE、WORD、DWORD、NEAR和FAR,地址 表达式是指要修改类型属性的变量、标号或存储器操作数。这种类型 属性的设定只在含有这运算符的语句内有效。PTR与EQU连用,可定义与PTR右边地址表达式类型不同的新变量名或新标号,但不另分配存储单元。例如:,框牢哲侮咕弟所遁况掉息驶蛀阳袜廷段御鼓程却询蚕著猛才晾泼腑凝序仓计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,VRW1 DW 1234H VRB1 EQU BYTE PTR VRW1 MOV AX,VRW1 MOV BL,VRB1;不会为VRB1重新分配新的存储单元,VRB1和VRW1具有相同的段属性和偏移量。即逻辑地址相同。在指令中也可使用PTR,临时修改变量或标号属性仅在此指令中存放,其他指令无效。例如:VB DB 10H DUP(0)VW DW 20H DUP(0)MOV AX,WORD PTR VB6 ADD BYTE PTR VW1,0FH INC WORD PTR SI JMP FAR PTR SUB1,AX是16位,临时修改按字访问,0FH是8位,临时修改按字节访问,谦麓捕俊燕回断竿遵扛攘骑匝瞳要舒逗弃拌雍厂崎昌镐裕遵渺址泡挥幕靛计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,2、分离字节运算符字节分离运算符包括:HIGH和LOW。格式:HIGH 常量或地址表达式 LOW 常量或地址表达式功能:HIGH 用来分离出其后16位常量或地址表达式的偏移量的高字节;LOW用来分离出其后16位常量或地址表达式偏移量的低字节。运算符优先级:见课本P187表5-55.4伪指令语句5.4.1段定义语句编制一个8086/8088汇编语言程序,段是基础。一是必须按照段来构 造程序,二是程序的执行,根据DS、ES、CS、SS分别访问不同段对 应的单元。一、段定义伪指令SEGMENT/END二、段寻址伪指令ASSUME三、段寄存器的装入,坝刘蘸路艾队响哮饥凤磋毫祭琅铝坞疹涡平限奇勇缮络颐赶臣裙哗秦咬相计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,一、段定义伪指令SEGMENT/END定义段名、起始边界其语句格式为:段名 SEGMENT 定位类型 组合类型 类别名(段内的语句序列)段名 ENDS 1段名2定位方式3类别4组合方式1、段名段名是为该段起的名字,用来指出汇编程序为该段分配的存储区起始位置。由用户自定,且必须满足标识符的条件。如 STACK、CODE、DATA,灸躯焙竣赣耗姻舔愚莫祷塑赶固坛闲执案严素壮赫狈棵夸檀培浓他驮宾迹计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,2定位类型定位类型是一个选项,它表示对段起始边界的要求,可以有4种选择:(1)PAGE(页):表示本段要从一个页的边界开始,即能被256整除的地址处开始存放,即起始地址的最低八位必须是0。(2)PARA(节):表示本段必须从一个节的边界开始,即必须从能被16整除的地址处开始存放,即段起始地址最低四位必须是0。如果未选择定位类型,则隐含PARA。(3)WORD(字):表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。(4)BYTE(字节):表示本段起始地址可以从任一地址处开始存放。3、组合类型 组合类型也是一个可选项,它表示本段是否与其它段进行连接,有六种 类型可供选择。(1)NONE“不选择”(2)PUBLIC(3)STACK(4)COMMON(5)MEMORY(6)AT表达式,烷肋运迸著戴碍赛瘩除秘只树企彤浓苑泄唁瞒丝冠栖舱娟敛丫暖鞋褒影身计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,(1)NONE 这是隐含选择,表示本段与其他段在逻辑上无连接关系,本段有自己的段基址。(2)PUBLIC 在满足定位类型的条件下,将本段与其他段名相同的段邻接在一起形成一个段,共用一个段基址,并相对这个段基址调整段内变量的偏移量。(3)COMMON 当连接多个程序模块时,为各模块中段名相同且用COMMON说明的段指定相同 的段起始地址,并产生一个覆盖段。该段的长度取决于最长的COMMON段的长 度。(4)STACK 将同段名的段连接成一个连续段,并且自动初始化堆栈寄存器SS和堆栈指针 SP,SS中为这个段的段基值,SP中为该段的字节长度。(5)MEMORY表示本段连接在其它所以段的后面,即分配在存储器的高址址端。(6)AT表达式表示本段的起始地址由表达式的值指定。表达式的值只能为16位二进制数。如“AT 1001H”表示本段从主存地址10010H开始。(表示本段可定位在表达式所指示的小节边界上),浚伴剂蹬堪话嚼蹋尧柠堂关诉零掏币噬乖杉耿丧线澳型例刁舍矗先草由索计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,4、类别名用(单引号)引起来,通常同类型的段可用相同的类别名。当链接程序对这些 段进行连接的时候,将它们临接放在一起。例下面是一个源程序的分段结构:DATA1 SEGMENT PARA DATA DATA1 ENDS STACK1 SEGMENT PARA STACKD STACK1 ENDS DATA2 SEGMENT BYTE DATA DATA2 ENDS STACK2 SEGMENT PARA STACKD STACK2 ENDS CODE SEGMENT PARA MEMORY ASSUME CS:CODE,DS:DATA1,SS:SI START:.CODE ENDS END START,组合类型NONE,数据段类别名,组合类型NONE相同,与第一个段临接的放在一起,组合类型STACK相同,两个段临接的放在一起,甸明窗空涡捷亲凭尹诲蒋育即未纲创抉鸥郁靖钦串咎脸谚削碟泣有撒啦奖计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,DATA1和DATA2在内存中装在一起,但是有各自不同的逻辑地址,逻辑上不相关。DATA2的定位类型是BYTE,所以与DATA1无间隔。STACK1从一个节的边界开始的,STACK2与前一个STACK1有相同的类别名。由于STACK2使用节边界,所以可能与STACK1有间隔。CODE段放在所以段的后面,起始边界是节边界,所以可能与前面的有间隔。,主存,DATA1,DATA2,STACK1,STACK2,CODE,FFFFFH,00000H,通过汇编连接在内存中的情况,楷诲笨傈去店叉绅沃咎写踩恢九惶雅给味枫堆届缉须辕予碉阳颈柴镣郑摊计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,通常练习用的程序,通常只需分三个段,其结构如下:DATA SEGMENT DATA ENDS STACK1 SEGMENT PARA STACK STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START:CODE ENDS END START DATA无定位类型和组合类型,表明其它定位类型为节边界。组合类型为NONE;STACK1,节边界,组合类型STACK;CODE,代码段,无定位类型、组合类型。,哥片制师礼础狱认蚀难饥评秦独横啪窗鹰胳肺川傈瘟哗郭虚牟殉范排妇襄计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,二、段寻址伪指令ASSUME格式:ASSUME 段寄存器:段名,段寄存器:段名功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。【例3.21】用ASSUME伪指令建立代码段、堆栈段与CS和SS的对应关系。DATA1SEGMENTDA1 DB?DATA1ENDSDATA2SGEMENTDB2DB?DATA2ENDSCODESEGMENT ASSUME CS:CODE,DS:DATA1,ES:DATA2START:DA3 DB?MOVDS,AX;DATA1DS MOVAX,DATA3 MOVES,AX;DATA3ESCODEENDS ENDSTART,检藻痴厚挨婪秦贫绩晨议削解隐弘弘会竖琳班墅臀腺蓉示抄柑矣褒琅嘶嵌计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,变量所在的段是由哪个段寄存器指定的。DA1所在段DATA1由DS段寄存器提供,DA2所在段DATA2是由ES段寄存器提供,DA3所在CODE段是由CS提供。在汇编程序在汇编每条指令时,如有需要访问存储器的操作,就要进行逻辑地址到物理地址的转换,这时应该知道使用哪个段寄存器。ASSUME只指明段和段寄存器之间的关系,而不产生任何目标代码。三、段寄存器的装入 4个段寄存器的装入方法有所不同,下面分别介绍:1、DS和ES的加载在程序中,必须使用MOV指令才能将对应段的段基值装入。因为在程序中,引 用段名就是以立即数形式获取该段的段基值,而立即数又不能直接传送给段寄 存器,所以要借助通用寄存器传送段基值给DS、ES。例如:DADS SEGMENT VAR1 DB 10H DADS ENDS DAES SEGMENT VAR2 DB 20H,猿任撂邻跺尤挽吗麦履塌妮了椭糜波揣踏奴休现狐规丁窟锄睬颤它饼舔蹿计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,DAES ENDS CODE SEGMENT ASSUME CS:CODE,DS:DADS STRAT:MOV AX,DADS MOV DS,AX MOV AX,DAES MOV ES,AX INC VAR1 DEC ES:VAR2 CODE ENDS END START 2、SS的加载SS是堆栈段寄存器,对它加载就是设置堆栈。2种方法:(1)自动加载在段定义伪指令时,SEGMENT语句中的组合类选择“STACK”,表明这个段是堆栈段。,DADS的段基值是立即数,因立即数不能直接送段寄存器,故通过AX送入DS,馅睁遮湘橙述本靛澈靳态祁鞋仗囤酌狙瘫殊胜帕搽宣拟燕蝗辙霓鲍踌示峭计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,当含有这个段的目标代码装入存储器后,SS就自动设置STACK1段的段基值,同时堆栈指针SP自动初始化为这个段最大地址1单元的偏移量。(2)执行程序的方法加载3、CS的加载当源程序经过汇编,连接后,由DOS系统将其装入存储器中,同时将程序要执行的第一条指令地址装入CS,IP中,然后从这条指令开始执行。对CS和IP的设置、修改通常有两个途径:(1)由结束伪指令END加载程序的起始地址。END伪指令的语句格式:END 地址表达式 地址表达式是一个已定义的标号或一个标号加减一个常数。地址表达 式是这个程序执行的第一条指令语句的地址。例:CODE SEGMENT ASSUME CS:CODE,STRAT MOV AX,DATA MOV DS,AX,凉判塞财燃烂碴榜雀任颊裸抓翟闰镜呜秸馈臭弱休汞枪扯啡太遏叙恼岩湘计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,CODE ENDS END STRAT 结束伪指令END有2个作用:(1)源程序到此结束,后面的任何语句均被略去。(2)将地址表达式所确认的存储单元的段基值和偏移量分别自动装入CS和IP中。(2)在程序允许期间,如执行程序转移类指令,实现从一个段转移到另一个段时,它的指令功能就是修改CS和IP。5.4.2过程定义语句 使用格式:过程名PROCNEAR/FARRET.过程名ENDP RET:子程序返回指令,熟歼橙悸岔仟艘棱兼奉莲般扮菊拆征罗既廖扎炬庸宣化坡他始墩匈世叉坏计算机组成原理与汇编语言程序设计计算机组成原理与汇编语言程序设计,五、汇编语言程序设计,5.4.3定位语句和位置计数器符号“$”代表位置计数器的现行值。定位伪指令ORG就是对位置计数器的现行值进行修改与设置。定位伪指令语句格式如下:ORG 表达式语句功能:把表达式的值赋给位置计数器。在这语句下面的目标代码(指令代码或数据)以表达式给定值作为起始偏移量。5.4.4偶地址控制语句偶地址伪指令EVEN也是对位置计数器的一个控制指令,他把位置计数器调整为偶数。EVEN伪指令格式如下:EVEN 对存储器字单元(16位)进行存取时,如是偶地址,速度较快(例如8086CPU)。所以EVEN伪指令主要应用于定义字数据前,用以调整位置计数器为偶数。5.4.5程序标题语句 标题伪指令TITLE的格式是:TITLE 文本 TITLE伪指令是指定一个标题,以便在列表文件中每一页的第一行都显示这个标题。可以是用户任选的名字或字符串,字符个数60个。,余桑羹喉蟹裸告鹰脸般尔