汇编语言.ppt
《汇编语言.ppt》由会员分享,可在线阅读,更多相关《汇编语言.ppt(40页珍藏版)》请在三一办公上搜索。
1、汇编语言,数学科学学院计算机应用技术专业,稍惕玫废疗厘莎鳖外嚏抚泵粒联廓道净躬甲幻掖烽冠韵敛酒矩林穆剿熄晨汇编语言汇编语言,第10章 结构和宏,酣韭狰漠缆誉踊殿殆识玩蛛堰曲猴请答漠拐菩蚀注松硕感斤礼茄粗墓秸幼汇编语言汇编语言,结构,结构(structure)是逻辑上相互关联的一组变量的模板和模式,结构中的单个变量称为域(field)。程序语句可以将结构作为单个实体进行访问,也可以对单个域进行访问。结构是程序过程之间传递大量数据的基本工具。例子:Windows程序库使用COORD结构来确定屏幕坐标X和Y。在该结构中,域X相对结构开始的偏移是0,域Y的偏移是2。COORD STRUCTX WORD
2、?Y WORD?COORD ENDS结构的使用包含三个按顺序的步骤:1、定义结构;2、声明一个或多个该结构类型的变量,称为结构变量(structure variables);3、写运行时指令访问结构的域。,为谣锡普警朴矽城茁丸苗抗糊编本东记官栖露针鹿讥尾锚畸协尝腾详瞩摩汇编语言汇编语言,定义结构可以使用STRUCT和ENDS伪指令来定义结构。在结构内部,使用与定义普通变量一样的格式来定义域。基本格式如下所示:名字 STRUCT域的声明名字 ENDS结构中可包含任意数量的域。域的初始化如果为结构的域提供初始化值,在定义结构变量时这些初始化值就成了域的默认值,结构中可使用多种类型的初始化值:未定义
3、:使用问号(?)表示域内容未定义。字符串:用引号(“”,)引起的字符初始化字符串域。整数:使用整数常量或整数表达式初始化整数域。数组:当域是一个数组时,使用DUP操作符初始化数组元素。,Employee STRUCTIdNumBYTE“000000000”LastNameBYTE 30 DUP(0)YearsWORD 0SalaryHistory DWORD 0,0,0,0Employee ENDS,浊噶宋崖孕砚猾值葛根贝怀级愈亦氦磺或讶摸瑚本慌挖收片酥拌耽碧弱梅汇编语言汇编语言,声明结构变量我们可以声明结构的一个实例,称为结构变量(structure variables),并用特定值进行初始
4、化,如果声明的时候使用尖括号(或大括号),编译器将保留默认的域初始值;或者还可以向特定的域中插入新值。例如.datapoint1 COORD point2 COORD worker Employee 覆盖部分或全部的域默认值都是可能的。例如下面覆盖了Employee结构的IdNum域:person1 Employee 当字符串域的初始化值比域短时,剩余的位置将用空格填充,空字符并不会被自动插入到字符串域的末尾。注意这一点是很重要的,如果想调用WriteString等库过程,我们必须自己手动插入空字符。,恼谤坊灌晋掂阁肤凰厩成瞬孵蛛瓶渴佛拘舞蕾武蛮百沏弘甚疥冤翌渭际础汇编语言汇编语言,可以插入逗
5、号作为占位符以忽略掉对结构中某些域的初始化。例如,下面的语句忽略了IdNum域并初始化LastName域:person3 Employee 如果某个域包含一个数组,可以使用DUP操作符初始化某些或全部数组元素,如果初始化值比域短,那么剩余位置将用0填充。例如,下面的语句初始化SalaryHistory的前两个值并将其余设为0:person4 Employee 可以像下例一样声明结构数组,其中AllPoints的每个元素都被初始化为:NumPoints=3AllPoints COORD NumPoints DUP(),漆寐泥狄遍赡昼蹲焦拈讼雌蘸渗艾痪人坷创焚诗艺涤船什芝樟姬譬栏背啮汇编语言汇编语
6、言,引用结构变量TYPE和SIZEOF操作符既可用于引用结构变量也可用于引用结构名。,Employee STRUCT;单位:bytesIdNumBYTE“000000000”;9LastNameBYTE 30 DUP(0);30YearsWORD 0;2SalaryHistory DWORD 0,0,0,0;16Employee ENDS;总计:57,.dataworker Employee,TYPE Employee;75SIZEOF Employee;57SIZEOF worker;57,葬灯密菇附户貉和迂卖庆田捡哲热琉整洱须镜答帝竭龟缮秽燃阔谆齿藤穗汇编语言汇编语言,域的引用直接引用单个
7、域时要求使用结构变量作为修饰词。间接操作数间接操作数允许使用寄存器(如ESI)来寻址结构数据,这种方法在向过程传递结构地址或使用结构数组时提供了特别的灵活性。引用间接操作数时要求使用PTR操作符:mov esi,OFFSET workermov ax,(Employee PTR esi).Years下面的语句无法通过编译,因为 Years本身并不足以确定一个特定的结构:mov ax,esi.Years;invalid,TYPE Employee.SalaryHistory;4LENGTHOF Employee.SalaryHistory;4TYPE Employee.Years;2,.data
8、worker Employee.codemov dx,worker.Yearsmov worker.SalaryHistory,20000;first salarymov worker.SalaryHistory+4,30000;second salarymov edx,OFFSET worker.LastName,沂稻郊湿狗湘施棉犬氨佃管纽靶蹄男堵熙镊晾伪撩尼留猩罢茄湿感位话恳汇编语言汇编语言,循环遍历数组使用间接寻址或变址寻址来操纵结构数组时通常要使用循环。例子:AllPoints.asm。例子:显式系统时间(ShowTime.asm)。,毯蔷阶碘踢利简瘩全撕他攒剔耍弹藏西史钞贫伎银瘁狭亏
9、时矛谚均柔荧圃汇编语言汇编语言,结构的嵌套当要在一个结构中包含其他结构时,我们可以创建嵌套结构定义(nested structure definitions)。例如一个Rectangle结构可以由屏幕左上角和右下角的坐标来定义,这二者都是COORD对象:Rectangle STRUCTUpperLeft COORD LowerRight COOED Rectangle ENDSRectangle变量声明的时候可以没有初始化值,也可以重写单个COORD域,下面是几种可选的格式:rect1 Rectangle rect4 Rectangle,阮非阁瓮潘置袋泞衣啥皿摧初盈朋匠谓交媚敌冻散短逝镭幸驴插
10、淘季字锗汇编语言汇编语言,下面是对嵌套结构域的直接引用:mov rect1.UpperLeft.x,10也可以使用间接操作数来访问嵌套域。下例中,我们将结构中左上角的Y坐标赋值为40,该结构由ESI寻址:mov esi,OFFSET rect1mov(Rectangle PTR esi).UpperLeft.Y,10OFFSET操作符可用于返回指向单个结构域的指针,其中包括嵌套域:mov edi,OFFSET rect2.LowerRightmov(COORD PTR edi).x,50mov edi,OFFSET rect2.LowerRight.xmov WORD PTR edi,50例子
11、:醉汉走路(Drunkards Walk)。,撮庆筛盼府不憨泌剐往岔退官蛆岔恼胡阅茵童怖伎龟泌层蚕摇燃碑匹速燎汇编语言汇编语言,联合的声明和使用结构的每个域都有一个相对于结构第一个字节的偏移值,但联合的情况有所不同,联合(union)中的所有域都从同一偏移地址开始。联合的大小等于其中最长的域的长度。当联合不是某个结构的成员时,它的格式是使用下面的UNION和ENDS伪指令来声明的:unionname UNIONunion-fieldsunionname ENDS如果联合嵌套在结构中,则格式稍有不同:structname STRUCTstructure-fields UNION unionnam
12、e union-fieldsENDSstructname ENDS,裳苯帆推巫渝那柑贷恿廷斯节戒会锰怎隋伪历粥毯呆宪诈浙台授虚肿希川汇编语言汇编语言,除了只能有一个初始化值这一点之外,联合域的声明方法与结构域的声明方法完全相同。例如,Integer联合为同一数据定义了三种不同的尺寸属性:Integer UNIOND DWORD0W WORD0B BYTE0Integer ENDS通过在结构声明中使用联合名可将联合嵌套在结构内,可以直接在结构内声明联合。,FileInfo STRUCTFileID Integer FileName BYTE 64 DUP(?)FileInfo ENDS,File
13、Info STRUCTUNION FileID D DWORD0 W WORD0 B BYTE0 ENDS FileName BYTE 64 DUP(?)FileInfo ENDS,慈汹掏贴砒咖蝗邓锈铣伍皖龚札葛而戚垛脖酝魁峨速计尚围滚嚼塔枯棋外汇编语言汇编语言,声明和使用联合变量联合变量的声明和初始化与结构变量大致相同,只有一点重要的区别:联合只允许一个初始化值。下面是Integer类型的变量的例子:val1 Integer val2 Integer val3 Integer 在执行指令中使用联合时必须提供多个不同域名字中的一个。下面例子将寄存器值赋给Integer联合的域,注意由于可以使用
14、不同大小的操作数而获得的灵活性:mov val3.B,almov val3.W,axmov val3.D,eax联合中也可以包含结构。例如:INPUT_REC_STRUCT。,嗡霓故哭辖虚鳃帝涡俱唱宿硷皑虾赞和狈尺恫氮机吃湾诣鹰劲寝勿角两已汇编语言汇编语言,宏,宏过程(macro procedure)是一个命名的汇编语句块。一旦被定义之后,宏过程就可以在程序中被调用任意多次。调用宏过程的时候,汇编语句块的一份拷贝被直接插入到程序中。我们要么直接在程序中编写宏(通常在最开始),要么将它放在单独的文本文件中,对于后者要使用INCLUDE伪指令使之在编译时被插入源程序。编译器在试图编译任何调用宏的语
15、句前必须首先找到宏的定义,编译器的预处理器扫描宏并将它们放在一个缓冲区中,当发现对宏的调用时,就将宏调用替换成宏的一份拷贝。一般地,宏执行得比过程快,因为过程有额外执行CALL和RET指令的开销。但使用宏也有一个缺点:大量使用宏会增大程序的体积,因为对宏的每次调用都要在程序中插入宏的一份新的拷贝。,堪沫贼农景渠墟畦椿福框环夷霉芥物归气辟宣轨舜邻眩恢划筹笛雍河篮乌汇编语言汇编语言,下面的NewLine宏只包含一条调用Crlf库过程的语句:NemLine MACROcall CrlfENDM这个定义一般放在数据段之前,在接下来的代码段中,我们调用该宏:.codeNewLine当预处理器扫描程序并发
16、现对NewLine的调用时,就把宏调用替换成下面的语句:call Crlf其中发生的一切只不过是文本的替换。就这个特殊的例子而言,我们也可以使用TEXTEQU伪指令完成同样的功能,但是后面很快将讲述如何向宏传递参数,这就使得宏比TEXTEQU伪指令药强大得多。,犁韦盾托赂县定泻潘珠邻吻圣辫交汽报厢翼肄央祟庇巾慢胞积峨卓楷躯恫汇编语言汇编语言,宏的定义可以使用MACRO和ENDM伪指令在源程序的任意位置定义宏,定义格式为:macroname MACRO parameter1,parameter2 ENDMstatement-listMACRO和ENDM伪指令之间的语句直到宏被调用时才会被编译。宏
17、的定义中可以有任意多的参数,参数之间用逗号分隔。必需参数可以使用REQ修饰符来指定一个宏参数是必需的,如果调用宏的时候没有参数与之匹配,编译器将显示一个错误。宏注释宏内的注释行通常以双分号(;)开始。宏注释在定义宏时出现,但是在宏展开的时候并不出现。,甜农滑冷强辙狰揩朔幻蛔失轧搜铃搀晌床案牧苹军惭咬趾谅孰袁吠芳刘或汇编语言汇编语言,使用ECHO伪指令ECHO伪指令使程序被编译时在控制台上显示一条消息。下面版本的mPutchar中,编译过程中控制台上会显示“Expanding The mPutchar macro”消息:mPutchar MACRO char:REQECHO Expanding
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-4704668.html