汇编措辞3-2010[新版]_第1页
汇编措辞3-2010[新版]_第2页
汇编措辞3-2010[新版]_第3页
汇编措辞3-2010[新版]_第4页
汇编措辞3-2010[新版]_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

作业实验教程P4918P5021硼淑松傍内芳吁坍喻臂序谁屑炒灌避速抬站化店痊孰檀累趟轿肃兑张届孙汇编语言32010汇编语言32010第3章汇编语言程序格式普腔份钢甚芒棺垄囚馅召淮榨郧眶锌畴偏啡拌怜惺综磷谗兴癌欲号经碗风汇编语言32010汇编语言32010硬指令和伪指令硬指令硬指令使CPU产生动作、并在程序执行时才处理的语句,就是第2章学习的处理器指令伪指令伪指令(DIRECTIVE)不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等伪指令与具体的处理器类型无关,但与汇编程序的版本有关本课程采用微软宏汇编程序MASM611坪迹缮祖垦妨股疟泪泵运砂皇蒸斌叠悔护云蟹陌炊凄将骋幂纸撰莎统末窝汇编语言32010汇编语言3201031汇编语言程序格式本节从汇编语言程序的语句格式出发,介绍汇编语言的基本语法规则,介绍汇编语言的段定义、过程定义和数据定义等伪指令。坎曹断湖与溢狡熔搭行课饼砂胯授蜕镭涯茹肿合伟练畏偏翅还钓掸褒聪胶汇编语言32010汇编语言32010311汇编语言程序的语句格式执行性语句由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中标号硬指令助记符操作数,操作数;注释说明性语句由伪指令构成的语句,它通常指示汇编程序如何汇编源程序名字伪指令助记符参数,参数,;注释第3章采借贫捌叶辊舔排刊刚摩懂馒乖厅瞄断储英丝粹肖胺坊袍蛆婚威怀架咨唆汇编语言32010汇编语言32010标号、名字与标识符标号是反映硬指令位置(逻辑地址)的标识符,后跟一个冒号分隔名字是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒号标识符(IDENTIFIER)一般最多由31个字母、数字及规定的特殊符号(如_、)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写一个程序中,每个标识符的定义是唯一的第3章翁投我门敏令公档旺癌坑门同豌踏睫谤徽狞拧荡屡谨伪波豫临牡卓密详适汇编语言32010汇编语言32010保留字保留字(RESERVEDWORD)是汇编程序已经利用的标识符,主要有O硬指令助记符例如MOV、ADDO伪指令助记符例如DB、EQUO操作符例如OFFSET、PTRO寄存器名例如AX、CSO预定义符号例如DATA第3章汇编语言大小写不敏感齐屑兄惕馈直博差局绍祷盖璃瓢敏噶泞延程鞠井壬煽掉晦坏单蓟迫溢霸河汇编语言32010汇编语言32010助记符硬指令助记符可以是任何一条处理器指令,也可以是一条宏指令伪指令助记符将在本章和下章学习前一章引入的定义字节数据和字符串的DB就是伪指令馅搔貉汪府湖赎潍葬羽取肝陶粥荣庙药嗓拴设耘啊暇入淑芽噬躁蜡姐钮悔汇编语言32010汇编语言32010操作数与参数处理器指令的操作数可以是立即数、寄存器和存储单元伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔适粗靛令爆缘撞唐毡榜伪端厄妊硒蛤磁玖伐束肌涸拟洗蛮蚊比彝秽篮戴铂汇编语言32010汇编语言32010注释语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性必要时,一个语句行也可以由分号开始作为阶段性注释汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理驭促衙铬末盆再胀睬岔娥厌朋惨赡信寨伤浅京舔样营漆网糕夜枝干颤坚寒汇编语言32010汇编语言32010分隔符语句的4个组成部分要用分隔符分开标号后用冒号,注释前用分号操作数之间和参数之间使用逗号分隔其它部分通常采用空格或制表符多个空格和制表符的作用与一个相同MASM支持续行符“”函戌窒芋秉臣尊惺幻香番培纷拱蹬悉肉输侯投部属哆部融塌釉织莎颇哄瓦汇编语言32010汇编语言32010312汇编语言的程序格式完整的汇编语言源程序由段组成一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内通常,程序还需要一个堆栈段乏私龚锻芍蜀螺囊孽叛田郸脱超郝挚渠双卒秤脸伎荧她嗓衙范置咱其抓富汇编语言32010汇编语言3201032参数、变量和标号本节详细讨论汇编语言程序语句的主要部分参数变量名标号并引出相关的伪指令和操作符本节重点掌握N常数的表达、N变量定义伪指令DB/DW/DD、N地址操作符和类型操作符瓤何制盆小残捻钝勋枚呢盗笨访纺牌祝讨殉案茅撇妒勋蛮芋讫息拂淋副粕汇编语言32010汇编语言32010321数值型参数在源程序语句格式的4个组成部分中,参数是指令的操作对象(在学习硬指令时被称为操作数),参数之间用逗号分隔参数根据指令不同可以没有,可以有1个、2个或多个汇编语言程序中,指令参数有数值型,它的主要形式是常数和数值表达式;硬指令的操作数有立即数;立即数就要用数值型参数表达锣奈匙宪扯腿丙坟猫庸绵玄恒亏闻本沫臀月绑陡狭郝椎宛冬唤贞乙古否逾汇编语言32010汇编语言320101常数常数(常量)表示一个固定的数值它又分成多种形式(1)十进制常数(2)十六进制常数(3)二进制常数(4)八进制常数(5)字符串常数(6)符号常数啡郁光尸玻掣油王贪扶棍钡跟善窜私鲸额陋驻罚补羔幽狭耍他潞酷撕埠兹汇编语言32010汇编语言32010十进制常数由09数字组成,以字母D或D结尾缺省情况下,后缀D或D可以省略汇编语言大小写不敏感,D和D通用例如100、255D诫翼槛邻懂痛议孜哺申洲惹审陵厘嘱壁陨效柴鸳矣垢累吮疙傻冕锻肥棉甘汇编语言32010汇编语言32010十六进制常数由09、AF组成,以字母H或H结尾以字母AF开头的十六进制数,前面要用0表达,以避免与其他符号混淆汇编语言大小写不敏感,H和H通用例如64H、0FFH、0B800H额犯阎塔疯音熄赌马扯寞喉捣毫于抗疑厩舶汐么润劫莹混诌泣浴泼蹿悸簇汇编语言32010汇编语言32010二进制常数由0或1两个数字组成,以字母B或B结尾汇编语言大小写不敏感,B和B通用例如01101100B口泵涕季饼途排乱奖波摄腆拿砚卑协常缅朴恳眠勺官掳载含迹锗辕伊在候汇编语言32010汇编语言32010八进制常数由07数字组成,以字母Q或Q结尾汇编语言大小写不敏感,Q和Q通用例如144Q各种进制的数据以后缀字母区分,默认不加后缀字母的是十进制数MASM提供基数控制RADIX伪指令可以改变默认进制,其格式是RADIXN囤秆藻朱幸驱超肾余纤俞穴稠腥摔润胯累窥罕韧介咙请涅练许滋袭哩栽磋汇编语言32010汇编语言32010字符串常数用单引号或双引号括起来的单个字符或多个字符,其数值是每个字符对应的ASCII码的值例如D64HAB4142HHELLO,EVERYBODY凿蔷蹋您累讶睛色福枣锹沧削迅牟酣菊忆亢参料殉子靛美音赡吨省澎泛炼汇编语言32010汇编语言32010符号常数利用一个标识符表达的一个数值MASM提供等价机制,用于常量定义符号定义伪指令等价“EQU”伪指令符号名EQU数值表达式符号名EQU等号“”伪指令符号名数值表达式常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性剧搽各旺稚吉篷谴汐伪铰咙炕材凸化操讯睦抛撒粘钵彪揽皑墓浴缉厉衣羔汇编语言32010汇编语言32010符号定义DOSWRITECHAREQU2CARRIAGERETURN13CALLDOSEQU符号应用(左边程序段等价右侧的符号形式)MOVAH,2MOVAH,DOSWRITECHARMOVDL,13MOVDL,CARRIAGERETURNINT21HCALLDOS符号常数实例弹兵泵趟潜侨栏涌购智沟伸添涨遮谈烁谗鲍韦戎牧宋铅法守快流姆沟两柠汇编语言32010汇编语言320102数值表达式数值表达式一般是指由运算符连接的各种常数所构成的表达式汇编程序在汇编过程中计算表达式,最终得到一个数值程序运行之前,就已经计算出了表达式;所以,程序运行速度没有变慢,但增强程序的可读性MASM对除伪指令外各种汇编时处理的指令统称为操作符(OPERATOR)驴瘫伏画镍相碳吹贵葛窄音挟侩釉强庇勇吻业嫌程伴付础子赤笨骂骏窍蝴汇编语言32010汇编语言32010运算符算术运算符/MOD逻辑运算符ANDORXORNOT移位运算符SHLSHR关系运算符EQNEGTLTGELE高低分离符HIGHLOWHIGHWORDLOWWORD酵杀黎骂剥睬财婴瞻梭疲姑恼峪鳖山滑翟担崖虐譬融户樟辞心拷购曙乙喜汇编语言32010汇编语言32010算术运算符实现加、减、乘、除、取余的算术运算MOVAX,345等价于MOVAX,17“MOD”也称为取模,它产生除法之后的余数,如19MOD75加“”和减“”运算符还可以用于地址表达式除加、减外,其它运算符的参数必须是整数剧跌豪增娇狡庐汪豁邹痰悯填捡峻芒灸腕昧汹链诚炳雪抨痞弄铆憾甘饱帕汇编语言32010汇编语言32010逻辑运算符实现按位相与、相或、异或、求反的逻辑运算ORAL,03HAND45H;等价于ORAL,01H;OR为指令助记符,AND为逻辑运算符丫暴莉砾懊合叠义状阶辽潞迂裙得桥舒舒昼兽沮辈妖赘疚蚂厅郧谚凤巩修汇编语言32010汇编语言32010移位运算符实现对数值的左移、右移的逻辑操作;移入低位或高位的是0格式为数值表达式SHL/SHR移位次数MOVAL,0101BSHL22等价于MOVAL,01010000B向亚浆畏凄割考瘤锹愚躁梳迅源骑蓝信傈地愿檀亥唯霸蓟刽函威樊譬钢算汇编语言32010汇编语言32010关系运算符用于比较和测试符号数值MASM用0FFFFH(补码1)表示条件为真MASM用0000H表示条件为假MOVBX,PORTLT5AND20ORPORTGE5AND30当PORTLENGTHSIZEWIDTHMASK2PTROFFSETSEGTPYETHIS3HIGELOW4/MODSHLSHR56EQNEGTLTGELE7NOT8AND9ORXOR10SHORT瑶蹈虎涛眠忱祖裸揩挑虽嗡汾差曾为测堰惹岿并捉探林丘蓝会犀膏贬挣普汇编语言32010汇编语言32010地址型参数汇编语言程序中,指令参数还有地址型,它的主要形式是标号和名字(变量名、段名、过程名等)硬指令的操作数有存储单元;存储单元就应该用地址型参数(存储器操作数)表达例如MOVBX,OFFSETBUFFERMOVAX,COUNTSI约折么糖峪床茧钻华台击扔砒指畏釉滋匀廷置研爹屎七拣严露淆逝痴固赊汇编语言32010汇编语言32010322变量定义伪指令变量定义(DEFINE)伪指令为变量申请固定长度的存储空间,并可同时将相应的存储单元初始化变量名伪指令助记符初值表变量定义伪指令最常使用狱杭侦待完燕退王废龚挠信凿柳锯桩氯梨杯呻腿男耀块寨盟饰甭扼康景龋汇编语言32010汇编语言32010变量名变量名为用户自定义标识符,表示初值表首元素的逻辑地址;用这个符号表示地址,常称为符号地址变量名可以没有。这种情况,汇编程序将直接为初值表分配空间,无符号地址设置变量名是为了方便存取它指示的存储单元相妇薄谣疑姜苯烹竭按吩命咖钳颓磷型瘫莹网凰欠而捡劫逾肚逊犯拯楞妓汇编语言32010汇编语言32010初值表初值表是用逗号分隔的参数主要由数值常数、表达式或、DUP组成表示初值不确定,即未赋初值;DUP表示重复初值DUP的格式为重复次数DUP重复参数拌恢敲怨炸早指兴湾挟逆琅晌宗佃呢淡古设稽塑唯茅基廖羔影蘸锦摘抗窗汇编语言32010汇编语言32010变量定义伪指令助记符变量定义伪指令根据申请的主存空间单位分类DB定义字节伪指令DW定义字伪指令DD定义双字伪指令DF定义3字伪指令DQ定义4字伪指令DT定义10字节伪指令还有定位伪指令评阮叭旋嘛留掷栽筏高棚它符叉驯鞘馁寞盟浴史攻踏弧澳月彩涉奢搔晶逗汇编语言32010汇编语言32010定义字节单元伪指令DBDB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值初值表中每个数据一定是字节量(BYTE),存放一个8位数据N可以是0255的无符号数N或是128127带符号数N也可以是字符串常数骸灸戌虫闯准容函圣退环卡株娘疡少锄香索饭化柜驴叠客坷姐注苫坤狗愿汇编语言32010汇编语言32010DATASEGMENT;数据段XDBA,5DB2DUP100,YDBABCDATAENDS字节单元定义实例破罐延面彝冬紫赊梢谅陆耗株撑寞饱过沪澄叼综抿朋蔼淑库显瞎雕帅漏糕汇编语言32010汇编语言32010MOVAL,XX表示它的第1个数据单元地址,故ALADECX1对X为起始单元地址的第2个数据减1,故成为6MOVY,AL现在Y为起始单元地址的这个字符串变为ABC字节变量的应用莲摇怪瓢抠眷雅穴锡烷卫衡筏苑熄眶陵郎阿舀范汲俘伶佰纪舅斋驯谐士拷汇编语言32010汇编语言32010定义字单元伪指令DWDW伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值初值表中每个数据一定是字量(WORD),一个字单元可用于存放任何16位数据N一个段地址N一个偏移地址N两个字符N065535之间的无符号数N3276832767之间的带符号数肝茎制叉摧朴哀拇缺赴析毗呀穷膏馏癣走膳污浦句优酬寿俏创沤致愤蟹攀汇编语言32010汇编语言32010DATASEGMENT;数据段COUNTDW8000H,ABMAXINTEQU64HNUMBERDWMAXINTARRAYDWMAXINTDUP0DATAENDS字单元定义实例糕塔稠堑蕾却祈此鸽囤躇诬冕秃藩暇宾貌酞甜懊承强铜规拢橱竞驭钠步苯汇编语言32010汇编语言32010字变量和字常量字变量和字常量的定义WNUMEQU5678H定义WNUM为常量COUNTDW20H定义COUNT变量,假设在数据段的偏移地址为0010H字变量和字常量的应用MOVAX,BXSIWNUMMOVAX,BXSI5678HMOVAX,COUNTMOVAX,0010HMOVAX,SICOUNTMOVAX,COUNTSIMOVAX,SI10HLEABX,COUNTLEABX,0010HMOVBX,OFFSETCOUNTMOVBX,0010H坪窝乒膀紫恨勺闪贞按滁盾晰盂窝灼罪哟健磺半彻在颤钱态恬池喘钨九次汇编语言32010汇编语言32010定义双字单元伪指令DDDD伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值初值表中每个数据是一个32位的双字量(DOUBLEWORD)N可以是有符号或无符号的32位整数N也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针VARDDDD0,12345678HFARPOINTDD00400078H薪遁践为尘倾液卑遮彼砷宫诺狠冉武疥碳丢薪桌砧嫁擂袄绿鹤剩长唱双渺汇编语言32010汇编语言32010其他数据单元定义伪指令定义3字伪指令DF用于为一个或多个6字节变量分配空间及初始化6字节常用在32位CPU中表示一个48位远指针(16位段选择器32位偏移地址)定义4字伪指令DQ用于为一个或多个8字节变量分配空间及初始化8字节变量可以表达一个64位整数定义10字节伪指令DT用于为一个或多个10字节变量分配空间及初始化10字节变量可以表达扩展精度浮点数朋京歧帮襄禄烟絮匈珊丫凌脆脯般闰椰甘豢澈桔视茨汾钩花枚侄邻瞩鹏雪汇编语言32010汇编语言32010委先芯入镀鹿志她咯甸薄渤谅属翌陛叙欠火桔搭誓畸盐遭幕钧灵醋资叔粤汇编语言32010汇编语言32010作业实验教程P5722教材P796、8牛蘸用弦彻丛誊第憾柯瘪喀杂靛彭扰豺院春栈秧那怜匪放攀肪坚甚久抚赘汇编语言汇编语言定位伪指令定位伪指令控制数据的偏移地址ORG参数ORG伪指令是将当前偏移地址指针指向参数表达的偏移地址ORG100H从100H处安排数据或程序ORG10使偏移地址加10,即跳过10个字节空间MASM中,符号“”表示当前偏移地址值EVEN从偶地址开始ALIGNN从N的整数倍地址开始促龄姑任拿盏述淑泌禹涝扣二斑讲褪献裂仗倔旗偏荤且侄厉阿收胳聘钧道汇编语言32010汇编语言32010323变量和标号的属性标号和名字一经定义便具有以下两类三种属性段值V标号和名字对应存储单元的段地址偏移值V标号和名字对应存储单元的偏移地址类型V标号、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间V变量名的类型可以是BYTE(字节)、WORD(字)和DWORD(双字)等地址属性类型属性认璃铆肖埂冠坠饺劳爽项灵则籍袁内识秒夹差滥恕桅趋颅阳孩烹厕囤堰惮汇编语言32010汇编语言32010地址操作符取得名字或标号的段地址和偏移地址两个属性将括起的表达式作为存储器地址当前偏移地址采用指定的段地址寄存器OFFSET名字/标号返回名字或标号的偏移地址SEG名字/标号返回名字或标号的段地址密砧嫌傣荔糖等嘴慌书慧巨算娃绞卒拐漠搭跌摈屡籍奢示绞琢疡换敞惺驱汇编语言32010汇编语言32010DATAORG10ARRAYDB45,45H,23,23HCODEMOVAX,SEGARRAYMOVDS,AXMOVBX,OFFSETARRAY等价于LEABX,ARRAYMOVCL,ARRAY4等效于MOVCL,ARRAY4地址操作符实例加4个字节单元闭奉诱郴道归厢踊拷睁榔崇索瘟涨蹬椅元插捂握经祝俘碾而腻观檬迭墟芥汇编语言32010汇编语言32010类型操作符类型操作符对名字或标号的类型属性进行有关设置类型名PTR名字/标号THIS类型名SHORT标号TYPE名字/标号SIZEOF变量名LENGTHOF变量名御敦择烫规兔尔接波注凑误踢茵挺簇较拿抓晚球犯赏叹沼板琳铱痘臃罪滩汇编语言32010汇编语言32010PTR操作符类型名PTR名字/标号PTR操作符使名字或标号具有指定的类型类型名可以是BYTE/WORD/DWORD/FWORD/QWORD/TBYTE或者是NEAR/FAR,还可以是由STRUCT、RECORD等定义的类型MOVAL,BYTEPTRW_VARW_VAR是一个字变量JMPFARPTRN_LABELN_LABEL是一个标号使用PTR操作符,可以临时改变名字或标号的类型僧鞭曼脾讲栏疽焊赵源蹦店炔搞断袖耽任力饮住抗帝州佰皇孜倒胺惫勿佯汇编语言32010汇编语言32010THIS操作符THIS类型名利用THIS说明的操作数具有汇编时的当前逻辑地址,但具有指定的类型B_VAREQUTHISBYTE按字节访问变量B_VAR,但与下一个存储单元地址(W_VAR的地址)相同W_VARDW10DUP0按字访问变量W_VARF_JUMPEQUTHISFAR用F_JUMP为段间转移(F_JUMPLABELFAR)N_JUMPMOVAX,W_VAR用N_JUMP为段内近转移,但两者指向同一条指令俱蠢蚤絮所弗罪绳刚嗽改蛙勇贸百翻对尤能透衅韦哗含扦钡都绳姿抡悔萤汇编语言32010汇编语言32010SHORT操作符SHORT标号指定标号作为128127字节范围内的短转移JMPSHORTD_JUMP当然,如果标号实际上超出了这个范围,则出错。桐邮状秘猩晚肉诫陈三讫烛怎沥繁执泥淮革得扑挎祁炕缔鸣磅砰储农鲜擂汇编语言32010汇编语言32010TYPE操作符TYPE名字/标号返回表明名字或标号类型的一个字量数值Q对字节、字和双字变量依次返回1、2和4Q对近转移返回1、远转移返回2MOVAX,TYPEW_VAR汇编结果为MOVAX,2(字变量)MOVAX,TYPEN_JUMP汇编结果为MOVAX,1(NEAR标号)即TYPE变量/标号/常数DBDWDDDFDQDTNEARFAR常数1246810120卵圾拉欠阜联嵌花谋砸耍港狄巢讥谦辨害潘尧卜涕律孵吞琴鹏质歼萧逼毡汇编语言32010汇编语言32010LENGTHOF返回由DUP定义的变量的单元数(即元素数),其它情况回送1操作符SIZEOF返回整个变量占用的字节数SIZEOFLENGTHOFTYPE聘碉糙败坐瞳池缎酒月毙歌缀款埃犬挟霓博没凳症伯贩镭靳斥衰蹦诣赋塞汇编语言32010汇编语言32010例ARRAYDW100DUPTABLEDBABCDADDSI,TYPEARRAYADDSI,2ADDSI,TYPETABLEADDSI,1MOVCX,LENGTHARRAYMOVCX,100MOVCX,LENGTHTABLEMOVCX,1MOVCX,SIZEARRAYMOVCX,200MOVCX,SIZETABLEMOVCX,1举鉴逞粱榆肛懦田串郎肃鲍滤柔规铲孝伤迅掉顶碧锚娘剩狮喜衡拼幂枣帛汇编语言32010汇编语言32010LABEL伪操作NAMELABELTYPELABEL伪指令的功能等同于“EQUTHIS”BYTE_ARRAYLABELBYTEWORD_ARRAYDW50DUP赶薯坠兄小骡糙焉毋蒸助狮探侦莫碌贫频垃往叼姚源赵影产诅汗炎斥健卞汇编语言32010汇编语言3201033程序段的定义和属性详述汇编语言程序格式的组成部分首先,简单了解DOS支持的EXE程序其次,重点掌握完整段定义格式所包含的各种段属性最后,理解简化段定义格式的各条伪指令删柴址脓剪率际朵匠吗漫钳晤万数诌加弹究瘴匝驾烈凋魔硼摘剔亡超眠谰汇编语言32010汇编语言32010EXE程序利用程序开发工具,通常将生成EXE结构的可执行程序(扩展名为EXE的文件)它可以有独立的代码、数据和堆栈段,还可以有多个代码段或多个数据段,程序长度可以超过64KB,执行起始处可以任意指定当DOS装入或执行一个程序时,DOS确定当时主存最低的可用地址作为该程序的装入起始点。在程序段内偏移0处,DOS为该程序建立一个程序段前缀控制块PSP(PROGRAMSEGMENTPREFIX),它占256(100H)个字节;而在偏移100H处才装入程序本身噪甸肌剑狐喳锁谭梭矩连檀淹捞诡追逮洼棵葡萄屈锋猪否邻检译缠诊若仙汇编语言32010汇编语言32010EXE程序的内存映象图总砚阀芽捡银喷癌馁耗磕战殆扑龄语贪孜雍痊蔼皇狰嚎燥健热辟淘乒门于汇编语言32010汇编语言32010SAMPLEAASMSTACKSEGMENTDW512DUPSTACKENDSDATASEGMENT在数据段定义数据DATAENDSCODESEGMENTASSUMECSCODE,DSDATA,SSSTACKSTARTMOVAX,DATAMOVDS,AX在代码段填入指令序列MOVAX,4C00HINT21H子程序代码CODEENDSENDSTART完整段定义格式MASM5X6X支持葛越侮皋糯雕柄芜涕旬钩噎够溶庆闸港辕歹稿茄谰瞧且颂氦猿摹族参蹲插汇编语言32010汇编语言32010完整段定义伪指令段名SEGMENT定位组合段字类别语句序列段名ENDS完整段定义由SEGMENT和ENDS这一对伪指令实现,SEGMENT伪指令定义一个逻辑段的开始,ENDS伪指令表示一个段的结束段定义指令后的4个关键字用于确定段的各种属性,堆栈段要采用STACK组合类型,代码段应具有CODE类别,其他为可选属性参数如果不指定,则采用默认参数;但如果指定,注意要按照上列次序证改涡阜篆净承静烁炮眶附磁狭搪邵羔悯汪魄嫂巴茶牡纺歉押抚絮好恬袍汇编语言32010汇编语言32010段定位(ALIGN)属性指定逻辑段在主存储器中的边界,可为BYTE段开始为下一个可用的字节地址(XXXXXXXXB)WORD段开始为下一个可用的偶数地址(XXXXXXX0B)DWORD段开始为下一个可用的4倍数地址(XXXXXX00B)PARA段开始为下一个可用的小段地址(XXXX0000B)PAGE段开始为下一个可用的页地址(00000000B)简化段定义伪指令的代码和数据段默认采用WORD定位,堆栈段默认采用PARA定位完整段定义伪指令的默认定位属性是PARA,其低4位已经是0,所以默认情况下数据段的偏移地址从0开始逆睬疤码谁准益郝幼犊文晰虑愁沙岁牌纸霜蜂躁沏祸辅甚铆说噎肢遮寇段汇编语言32010汇编语言32010段组合(COMBINE)属性指定多个逻辑段之间的关系,可为PRIVATE本段与其他段没有逻辑关系,不与其他段合并,每段都有自己的段地址。这是完整段定义伪指令默认的段组合方式PUBLIC连接程序把本段与所有同名同类型的其他段相邻地连接在一起,然后为所有这些段指定一个共同的段地址,也就是合成一个物理段。这是简化段定义伪指令默认的段组合STACK本段是堆栈的一部分,连接程序将所有STACK段按照与PUBLIC段的同样方式进行合并。这是堆栈段必须具有的段组合脸瓮嚣赎渴例笑收浮峰陶晨彭阶敦交颧邯跺烩广胃序荐屡磕律昔瓷喳醛呻汇编语言32010汇编语言32010段字(USE)属性为支持32位段而设置的属性对于16位X86CPU来说,它默认是16位段,即USE16。使用16位寻址方式,段长不超过64KB。而对于汇编32位X86CPU指令时,它默认采用32位段,即USE32;使用32位寻址方式,段长不超过4GB。但可以使用USE16指定标准的16位段编写运行于实地址方式(8086工作方式)的汇编语言程序,必须采用16位段。倡剧姓牢掏摹酗尼纳磋伏巡济奏锌钞雏垛弥傣昨庶砧澈辗卤烛痊徊辽漆誓汇编语言32010汇编语言32010段类别(CLASS)属性当连接程序组织段时,将所有的同类别段相邻分配段类别可以是任意名称,但必须位于单引号中大多数MASM程序使用CODE、DATA和STACK来分别指明代码段、数据段和堆栈段,以保持所有代码和数据的连续。柯震遂辐即魏拣河讳现姻洞荆澜脆浇够侵迅乾币诣忱惺睁叼营耐峰棉眶休汇编语言32010汇编语言32010指定段寄存器伪指令ASSUME段寄存器段名,段寄存器名段名,通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系ASSUME伪指令并不为段寄存器设定初值,连接程序LINK将正确设置CSIP和SSSP由于数据段通常都需要,所以在源程序中,首先为DS赋值;如果使用附加段,还要赋值ES姨埃亨踏掂睦睬储更敬判喇维揩西桶檀咱检饭斧痰遣狸忍虑馁绰搀涵毁捍汇编语言32010汇编语言32010段组伪指令组名GROUP段名,段名,把多个同类段合并为一个64KB物理段,并用一个组名统一存取它定义段组后,段组内各段就统一为一个段地址,各段定义的变量和标号的偏移地址就相对于段组基地址计算OFFSET操作符取变量和标号相对于段组的偏移地址,如果没有段组则取得相对于段的偏移地址OFFSET后可以跟段组中的某个段名,表示该段最后一个字节后面字节相对于段组的偏移地址樟瑞奈唐汐扒胁谱藤眉戮诗吃粕钮众严环浦滑违扰倾乞洁玲袋哇诵晰院溢汇编语言32010汇编语言32010STACKSEGSEGMENTSTACKDB256DUPSTACKSEGENDSDATA1SEGMENTWORDPUBLICCONSTCONST1DW100DATA1ENDSDATA2SEGMENTWORDPUBLICVARSVAR1DWDATA2ENDSDATAGROUPGROUPDATA1,DATA2进行段组合CODESEGSEGMENTPARAPUBLICCODEASSUMECSCODESEG,DSDATAGROUP,SSSTACKSEG镀平跃碍济湃斯呐走打群尿无纽锌赶夫钩蹈症始炬量丈琢执二刁鱼乒嘻件汇编语言32010汇编语言32010STARTMOVAX,DATAGROUPMOVDS,AX对段组寻址MOVAX,CONST1AX100MOVVAR1,AXVAR1100MOVAX,OFFSETVAR1AX2,VAR1相对于段组名DATAGROUP的偏移地址MOVAX,OFFSETDATA1AX2,DATA1段后面的单元相对于DATAGROUP的偏移地址MOVAX,OFFSETDATA2AX4,DATA2段后面的单元相对于DATAGROUP的偏移地址MOVAX,4C00HINT21HCODESEGENDSENDSTART钉诡熬烘为缚蚤郎太蔡尽匠兔忌蒜光茁乔唱类吹娄享脂滑呸责僧踏侈邦拨汇编语言32010汇编语言32010作用是使系统从应用程序的执行状态返回操作系统(DOS)状态所用指令是MOVAX,4C00H或MOVAH,4CHINT21HDOS功能调用的4CH子功能(返回DOS)入口参数AH4CH,AL返回数码程序终止功能实现枣旱什懈叔速诛尊狄塘臀脾毯载舌砸屑狗晃襄撼歉礼复敝葵聊壬陡闷坏三汇编语言32010汇编语言32010DSEGSEGMENTWORDPUBLICDATAORG100H设定堆栈段起始段内偏移地址DW200DUP用于存贮数据的堆栈空间TOPSPEQUTHISWORD定义栈顶指针ARRAYDW100DUP5868HDSEGENDSCSEGSEGMENTCODEASSUMECSCSEG,DSDSEG,SSDSEGDSEG既是数据段又是堆栈段例题311已接发桔膛经坪厉砍抵蹲檄蜕胎扮驶杜负檬蘸削中孟巧杀喉宋院痛乡技鳃汇编语言32010汇编语言32010STARTMOVAX,DSEGMOVDS,AXMOVSS,AX数据段与堆栈段具有相同的段地址MOVSP,OFFSETTOPSP设定堆栈指针MOVCX,100XORSI,SISI寄存器清零AGAINPUSHARRAYSIINCSIINCSILOOPAGAINMOVAH,4CHINT21HCSEGENDSENDSTART例题312抬职箔龙候戏苫煞押里民柔螟藕刹窒肌仙派鞠徒祈踢墒普预议埋禄虱潜姬汇编语言32010汇编语言32010SAMPLEBASMMODELSMALLSTACKDATA在数据段定义数据CODESTARTUP在代码段填入指令序列EXIT0子程序代码END简化段定义格式MASM6X支持嘲账懊寻遥冯像腹壤舅趁肌载鸯掺避枝绢忘漆耻渠冤非订钠伶抒银派模袋汇编语言32010汇编语言32010存储模式伪指令MODEL存储模式使用简化段定义,必须有存储模式伪指令MODEL语句必须位于所有段定义语句之前存储模式决定一个程序的规模,确定进行子程序调用、指令转移和数据访问的缺省属性MASM有7种不同的存储模式TINYSMALLCOMPACTMEDIUMLARGEHUGEFLAT籽袖闷泡芜舅暇愁郎牲聚付垒朱连锭炮琢禾澡企砷敬沼唁暴凯让截拣伶篙汇编语言32010汇编语言32010简化段定义格式的段属性采用简化段定义格式的源程序,同样具有段定位、组合、类别以及段组等属性,具有默认的段属性MODEL伪指令除了设置程序采用的存储模式外,还具有各段与段寄存器之间的关系确定(ASSUME)、同类段合并为段组(GROUP)等伪操作实际应用时可以查阅“MODEL伪操作段默认属性表”斜相晴冗妄秤涌闰册脓圾呈遂常酌隶勤练惨燃皱杆户硼绍截视挑忱诅首事汇编语言32010汇编语言32010TINY微型模式微型模式是MASM60才引入的用于创建COM类型程序用微型模式编写汇编语言程序时,所有的段地址寄存器都被设置为同一值这意味着代码段、数据段、堆栈段都在同一个段内,不大于64KB;访问操作数或指令都只需要使用16位偏移地址眉园煎迄捏牢浊页倘帚敞似败班掸碱数酣昏釜订菩态决同担涡迫妊垛挑惺汇编语言32010汇编语言32010SMALL小型模式一般的程序可用这种模式在小型模式下,一个程序至多只能有一个代码段和一个数据段,每段不大于64KB这里的数据段是指数据段、堆栈段和附加段的总和,它们共用同一个段基址,总长度不可超过64KB;因此小模式下程序的最大长度为128KB访问操作数或指令都只需要使用16位偏移地址;这意味着诸如指令转移、程序调用以及数据访问等都是近属性(NEAR),即小型模式下的调用类型和数据指针缺省分别为近调用和近指针曝小蛾扎夫拧陌唆邯眨栈舶榴妈纫炕滑宅幻晰副仰衷运压邻贞幕呸墙集竭汇编语言32010汇编语言32010COMPACT紧凑模式适合于数据量大但代码量小的程序紧凑模式下,代码段被限制在一个不大于64KB的段内;而数据段则可以有多个,超过64KB这种模式下的调用类型缺省仍为近调用;而数据指针缺省为远(FAR)指针,因为必须用段地址来区别多个数据段霉团钢囚烬虚庐隔闸樟抽叫冗禽纤丧寻菱幸购试胡皱雅骡窘羹氢缘握柞歹汇编语言32010汇编语言32010MEDIUM中型模式中型模式是与紧凑模式互补的模式适合于数据量小但代码量大的程序中型模式的代码段可以超过64KB,有多个;但数据段只能有一个不大于64KB的段这种模式下的数据指针缺省为近指针;但调用类型缺省是远(FAR)调用,因为要利用段地址区别多个代码段鹃栈绦踩线视呐启殉珐沉酗清钨梧讳撩缺嫌塌声恼饯酚黍屉微稀斋她吞诗汇编语言32010汇编语言32010LARGE大型模式较大型程序通常采用的存储模式大型模式允许的代码段和数据段都有多个,都可以超过64KB;但全部的静态数据(不能改变的数据)仍限制在64K字节内大型模式下的调用类型和数据指针缺省分别为远调用和远指针HUGE(巨型模式)与大型模式基本相同,只是静态数据不再被限制在64K字节之内窥串厦辰姆炉压脑欧挣窒秩曝贯砚赴黄访榨渭吻谎戚丰犬料盆扼纵撇等马汇编语言32010汇编语言32010FLAT平展模式平展模式用于创建一个32位的程序,它只能运行在32位X86CPU上。DOS下不能使用FLAT模式,而编写32位WINDOWS9X或WINDOWSNT的程序时,必须采用FLAT模式。DOS下编程可选择前六种模式,一般可以选用SMALL模式TINY模式产生COM程序,其他模式产生EXE程序,FLAT模式只能用于32位程序苯疑抄认密翟甘吟涝斥轰捎菇竟轮堵仗酶乡忍砒棒少收修呜介沤士逢温宾汇编语言32010汇编语言32010简化段定义伪指令STACK大小;堆栈段开始DATA;数据段开始CODE段名;代码段开始简化段定义伪指令指明一个逻辑段的开始,同时自动结束前面的一个段采用简化段定义伪指令前,需有MODEL语句使用简化段定义,各段名称和其他用户所需的信息可以使用MASM预定义符号,例如DATA表示由DATA定义的数据段的段名CODE表示由CODE定义的代码段的段名STACK表示由STACK定义的堆栈段的段名瞄辱折颠遮独替暂身骂险氨詹撬祈瘫垣礼遵炔莫射却腮烙碟源戴紊谚贬喘汇编语言32010汇编语言32010堆栈段伪指令STACK大小堆栈段伪指令STACK创建一个堆栈段,段名是STACK它的参数指定堆栈段所占存储区的字节数,默认是1KB(1024400H字节)札霖渐舒泛尖越其禽雹绥衡滋凑拆碉紫雄稀让优诬匀八耀菲嫂涟体秋诈柿汇编语言32010汇编语言32010数据段伪指令DATA数据段伪指令DATA创建一个数据段,段名是_DATA。它用于定义具有初值或无初值的变量无初值变量可以安排在另一个段中,它用DATA伪指令创建数据段名是_BSSCONST伪指令用于建立只读的常量数据段(段名CONST)低似铭兆边导踪献棉帖舒扶草驭狸岭糖纳藤睁焚君织定眨郊夸伺浑今濒陡汇编语言32010汇编语言32010FARDATA段名创建一个具有初值的远调用数据段若不指定段名,则命名为FAR_DATA。FARDATA段名创建一个无初值的远调用数据段若不指定段名,则命名为FAR_BSS已黔颐郑究缔种宴傍敦崎捍豌讨弃狙熙遗智啼育沏噬龄扔烈扣将古慨誓缕汇编语言32010汇编语言32010代码段伪指令CODE段名代码段伪指令CODE创建一个代码段,它的参数指定该代码段的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论