×

ARM汇编器所支持的伪操作

消耗积分:1 | 格式:rar | 大小:0.4 MB | 2017-10-17

分享资料个

ARM源程序文件(即源文件)有特定的文件格式和语法规则,可以使用任意文本编辑器编写程序代码。一般地,ARM源程序文件名的后缀如表10.1所示。
  表10.1 ARM源程序文件名后缀
  程 序文 件 名
  汇编*.S
  引入文件*.INC
  C程序*.C
  头文件*.H
  在一个项目中,至少要有一个汇编源文件,可以有多个汇编源文件或多个C程序,或者C程序文件和汇编文件两者的组合。
  ARM汇编语言语句格式如下所示。
  {label}{instruction/directive/pseudo-instruction}{;comment}
  注意所有指令均不能顶格写,要用空格(space)或TAB开头。
  其中instruction即ARM指令集中的汇编指令。Directive为ARM汇编器所支持的伪操作。pseudo-instruction为ARM汇编器所支持的伪操作。下面章节分别介绍伪操作和伪指令。
  10.1 ARM汇编器所支持的伪操作
  在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪操作标识符(directive),它们所完成的操作称为伪操作。伪操作在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪操作仅在汇编过程中起作用,一旦汇编结束,伪操作的使命就完成。
  在ARM的汇编程序中,伪操作主要有符号定义伪操作、数据定义伪操作、汇编控制伪操作、宏指令等。
  10.1.1 符号定义(Symbol Definition)伪操作
  符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种。
  · 用于定义全局变量的GBLA、GBLL和GBLS。
  · 用于定义局部变量的LCLA、LCLL和LCLS。
  · 用于对变量赋值的SETA、SETL、SETS。
  · 为通用寄存器列表定义名称的RLIST。
  · 为协处理器寄存器定义别名的CN。
  · 为协处理器定义别名的CP。
  · 为VFP寄存器定义名称的DN和SN。
  · 为FPA浮点指针寄存器定义名称的FPA。
  1.全局变量定义伪操作GBLA、GBLL和GBLS
  (1)语法格式
  GBLA、GBLL和GBLS伪操作用于定义一个ARM程序中的全局变量并将其初始化。其中:
  GBLA伪操作用于定义一个全局的数字变量并初始化为0。
  GBLL伪操作用于定义一个全局的逻辑变量并初始化为F(假)。
  GBLS伪操作用于定义一个全局的字符串变量并初始化为空。
  由于以上3条伪指令用于定义全局变量,因此在整个程序范围内变量名必须惟一。
  语法格式如下。
  《gblx》 《variable》
  ① 《gblx》
  取值为GBLA、GBLL、GBLS之一。
  ② 《variable》
  定义的全局变量名,在其作用范围内必须惟一。全局变量的作用范围为包含该变量的源程序。
  (2)使用说明
  如果用这些伪操作重新声明已经声明过的变量,变量的值将被初始化成后一次声明语句中的值。
  (3)示例
  ① 使用伪操作声明全局变量。
  GBLA Test1 ;定义一个全局的数字变量,变量名为Test1
  Test1 SETA 0xaa ;将该变量赋值为0xaa
  GBLL Test2 ;定义一个全局的逻辑变量,变量名为Test2
  Test2 SETL {TRUE} ;将该变量赋值为真
  GBLS Test3 ;定义一个全局的字符串变量,变量名为Test3
  Test3 SETS “Testing” ;将该变量赋值为“Testing”
  ② 声明变量objectsize并设置其值为0xff,为“SPACE”操作做准备。
  GBLA objectsize
  Objectsize SETA oxff
  SPACE objectsize
  ③ 下面的例子显示如何使用汇编命令设置变量的值。具体做法是使用“-pd”选项。
  Armasm -pd “objectsize SETA oxff” -o objectfile sourcefile
  2.局部变量定义伪操作LCLA、LCLL和LCLS
  (1)语法格式
  LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量并将其初始化。其中:
  LCLA伪操作用于定义一个局部的数字变量并初始化为0。
  LCLL伪操作用于定义一个局部的逻辑变量并初始化为F(假)。
  LCLS伪操作用于定义一个局部的字符串变量并初始化为空。
  以上三条伪操作用于声明局部变量,在其作用范围内变量名必须惟一。
  语法格式如下。
  《lclx》 《variable》
  ① 《gblx》
  取值为LCLA、LCLL、LCLS之一。
  ② 《variable》
  所定义的局部变量名,在其作用范围内必须惟一。局部变量作用范围为包含该局部变量的宏。
  (2)使用说明
  如果用这些伪操作重新声明已经声明过的变量,则变量的值将被初始化成后一次声明语句中的值。
  (3)示例
  ① 使用伪操作声明局部变量。
  LCLA Test4 ;声明一个局部的数字变量,变量名为Test4
  Test3 SETA 0xaa ;将该变量赋值为0xaa
  LCLL Test5 ;声明一个局部的逻辑变量,变量名为Test5
  Test4 SETL {TRUE} ;将该变量赋值为真
  LCLS Test6 ;定义一个局部的字符串变量,变量名为Test6
  Test6 SETS “Testing” ;将该变量赋值为“Testing”
  ② 下面的例子定义一个宏,显示了局部变量的作用范围。
  MACRO ;声明一个宏
  $label message $a ;宏原型
  LCLS err ;声明局部字符串变量
  $label
  INFO 0,“err”:CC::STR:$a
  MEND ;宏结束,局部变量不再起作用
  3.变量赋值伪操作SETA、SETL和SETS
  (1)语法格式
  伪指令SETA、SETL和SETS用于给一个已经定义的全局变量或局部变量赋值。
  SETA伪操作用于给一个数学变量赋值;
  SETL伪操作用于给一个逻辑变量赋值;
  SETS伪操作用于给一个字符串变量赋值;
  语法格式如下。
  Variable 《setx》 expr
  ① Variable
  变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。
  ② 《setx》
  取值为SETA、SETL、SETS之一。
  ③ expr
  数学、逻辑或字符串表达式,也就是将要赋予变量的值。
  (2)使用说明
  在向变量赋值前必须先声明变量。
  也可以在汇编指令中预定义变量,如:
  “Armasm --pd ”objectsize SETA oxff“ --o objectfile sourcefile”
  (3)示例
  ① 为预先定义的变量赋值。
  LCLA Test3 ;声明一个局部的数字变量,变量名为Test3
  Test3 SETA 0xaa ;将该变量赋值为0xaa
  LCLL Test4 ;声明一个局部的逻辑变量,变量名为Test4
  Test4 SETL {TRUE} ;将该变量赋值为真
  LCLS Test6 ;定义一个局部的字符串变量,变量名为Test6
  Test6 SETS “Testing” ;将该变量赋值为“Testing”
  ② 使用变量赋值伪操作,定义一些程序相关内容。
  GBLA versionNumber
  VersionNumber SETA 21
  GBLL Debug
  Debug SETL {TRUE}
  GBLS versionString
  VersionString SETS “version 1.0”
  4.通用寄存器列表定义伪操作RLIST
  (1)语法格式
  RLIST伪操作可用于对一个通用寄存器列表定义名称,使用该伪操作定义的名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序根据寄存器的编号由低到高,与列表中的寄存器排列次序无关。
  语法格式如下。
  Name RLIST {list-of-registers}
  ① Name
  寄存器列表的名称。
  注意该名称不能和已经定义寄存器或协处理器名称相同。
  ② list-of-registers
  通用寄存器列表。列表中的寄存器用“,”隔开,如果是编号连续的通用寄存器可以用“-”指定寄存器范围。具体用法参见程序示例。
  (2)使用说明
  在使用ARM汇编编译器编译源文件时,可以使用“-checkreg”选项来指定汇编器进行寄存器检查。如果汇编器检测到寄存器列表中的寄存器编号非升序排列,将给出编译警告。
  (3)示例
  ① 将寄存器列表名称定义为RegList,可在ARM指令LDM/STM中通过该名称访问寄存器列表。
  RegList RLIST {R0-R5,R8,R10} ;
  ② 使用“-”在寄存器列表中,指定寄存器范围。
  Context RLIST {r0-r6,r8,r10-r12,r15} ;
  5.协处理器寄存器名称定义伪操作CN
  (1)语法格式
  CN伪操作为协处理器寄存器定义名称。
  语法格式如下。
  Name CN expr
  ① Name
  定义的协处理器寄存器的名称。
  注意该名称不能和已经定义寄存器或协处理器名称相同。
  ② expr
  协处理器寄存器编号。
  (2)使用说明
  协处理器寄存器编号的数值范围为0~15。避免使用不同的名称定义同一物理寄存器。
  注意协处理器寄存器的名称不能被定义为c0~c15,这些名称已经被汇编器预定义。
  (3)示例
  将协处理器寄存器6命名为Power。
  Power CN 6
  6.协处理器名称定义伪操作CP
  (1)语法格式
  CP伪操作为指定的协处理器定义名称。
  语法格式如下。
  Name CP expr
  ① Name
  定义的协处理器名称。
  注意该名称不能和已经定义寄存器或其他协处理器名称相同。
  ② expr
  协处理器编号。
  (2)使用说明
  协处理器编号范围为0~15。
  使用CP伪操作为协处理器定义一个方便记忆的名称,可以使程序员更高效地编写代码。
  注意协处理器寄存器的称不能被定义为p0~p15,这些名称已经被汇编器预定义。
  (3)示例
  将协处理器6命名为Dmu。
  Dmu CP 6
  7.VFP寄存器名称定义伪操作DN/SN
  (1)语法格式
  DN伪操作为双精度(double-precision)VFP寄存器定义名称。D0~D15是汇编器预先定义的,用户不能使用。
  SN伪操作为单精度(single-precision)VFP寄存器定义名称。S0~S31是汇编器预先定义的,用户不能使用。
  语法格式如下。
  Name DN expr
  Name SN expr
  ① Name
  指定的VFP寄存器的名称。
  注意该名称不能和已经定义寄存器或其他协处理器名称相同。
  ② expr
  指定VFP寄存器编号。对于双精度寄存器编号范围为0~15;对于单精度寄存器编号范围为0~31。
  (2)示例
  ① 将VFP双精度寄存器6定义为energy。
  energy DN 6
  ② 将VFP单精度寄存器16定义为mass。
  mass SN 16
  8.浮点寄存器名称定义伪操作FN
  (1)语法格式
  FN为一个FPA浮点寄存器定义名称。F0~F7是汇编器预先定义的,用户不能使用。
  注意FPA的使用在ARM公司新发布的编译器RVCT中已不再支持。
  语法格式如下。
  Name FN expr
  ① Name
  指定的浮点寄存器的名称。
  注意该名称不能和已经定义寄存器或其他协处理器名称相同。
  ② expr
  指定浮点寄存器编号。编号范围为0~7。
  (2)示例
  为浮点寄存器6指定名称为Energy。
  Energy FN 6
 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'ARM汇编器所支持的伪操作',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);