×

ARM汇编程序设计之汇编语言文件格式

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

分享资料个

 10.3.1 ARM汇编语言语句格式
  ARM(Thumb)汇编语法语句格式如下所示。
  {symbol}{instruction|directive|pseudo-instruction}{;comment}
  ① symbol
  程序符号。通常为地址标号(label)。在指令和伪指令中通常为标号;在一些伪操作中符号可能是变量或常数。详见ARM伪操作一节。
  在书写中,符号必须从一行的行头开始,前面不能包含空格或制表符tab。
  ② instruction
  ARM或Thumb指令。
  ③ directive
  伪操作。详见ARM伪操作一节。
  ④ pseudo-instruction
  ARM伪指令。详见ARM伪指令一节。
  ⑤ comment
  语句注释。注释以分号(;)开头,注释的结尾即为一行的结尾。为了程序清晰易读,注释也可以单独占用一行。汇编器在对程序进行汇编时忽略注释。
  在汇编语言程序设计中,每一条指令的助记符可以全部用大写或全部用小写,但不允许在一条指令中大、小写混用。
  同时,如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾用“\”表示下一行与本行为同一条语句。
  10.3.2 ARM汇编语言中的符号
  在汇编语言程序设计中,经常使用各种符号代替地址(addresses)、变量(variables)和常量(constants)等,以增加程序的灵活性和可读性。尽管符号的命名由编程者决定,但并不是任意的,必须遵循以下的约定。
  (1)符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。
  (2)符号在其作用范围内必须惟一。
  (3)自定义的符号名不能与系统的保留字相同。其中保留字包括系统内部变量
  (built in variable)和系统预定义(predefined symbol)的符号。
  (4)符号名不应与指令或伪指令同名。如果要使用和指令或伪指令同名的符号要用双斜杠“||”将其括起来,如“||ASSERT||”。
  注意虽然符号被双斜杠括起来,但双斜杠并非符号名的一部分。
  (5)局部标号以数字开头,其他的符号都不能以数字开头。
  1.变量(variable)
  程序中的变量是指其值在程序的运行过程中可以改变的量。ARM(Thumb)汇编程序所支持的变量有三种。
  · 数字变量(numeric)。
  · 逻辑变量(logical)。
  · 字符串变量(string)。
  数字变量用于在程序的运行中保存数字值,但注意数字值的大小不应超出数字变量所能表示的范围。
  逻辑变量用于在程序的运行中保存逻辑值,逻辑值只有两种取值情况:真({TURE})和假({FALSE})。
  字符串变量用于在程序的运行中保存一个字符串,注意字符串的长度不应超出字符串变量所能表示的范围。
  在ARM(Thumb)汇编语言程序设计中,可使用GBLA、GBLL、GBLS伪指令声明全局变量,使用LCLA、LCLL、LCLS伪指令声明局部变量,可使用SETA、SETL和SETS对其进行初始化。
  2.常量(constants)
  程序中的常量是指其值在程序的运行过程中不能被改变的量。ARM(Thumb)汇编程序所支持的常量有数字常量、逻辑常量和字符串常量。
  数字常量一般为32位的整数,当作为无符号数时,其取值范围为0~232−1,当作为有符号数时,其取值范围为−231~231−1。汇编器认为−n和232−n是相等的。对于关系操作,如比较两个数的大小,汇编器将其操作数看作无符号的数,也就是说“0》−1”,对汇编器来说取值为“假({FLASE})”。
  逻辑常量只有两种取值情况,真或假。
  字符串常量为一个固定的字符串,一般用于程序运行时的信息提示。
  3.程序中的变量代换
  汇编语言中的变量可以作为作为一整行出现在汇编程序中,也可以作为行的一部分使用。
  如果在数字变量前面有一个代换操作符“$”,编译器会将该数字变量的值转换为十六进制的字符串,并将该十六进制的字符串代换“$”后的数字变量。
  如果在逻辑变量前面有一个代换操作符“$”,编译器会将该逻辑变量代换为它的取值(真或假)。
  如果在字符串变量前面有一个代换操作符“$”,编译器会将该字符串变量的值代换“$”后的字符串变量。
  如果程序中需要字符“$”,则可以用“$$”来表示。汇编器将不进行变量替换,而是将“$$”作为“$”。
  下面的两个例子说明了变量替换的过程。
  ; 直接的变量替换
  GBLS add4ff
  ;
  add4ff SETS “ADD r4,r4,#0xFF” ;给变量add4ff赋值
  $add4ff.00 ;引用变量
  ; codes
  ADD r4,r4,#0xFF00
  ; 有特殊符号的变量替换
  GBLS s1
  GBLS s2
  GBLS fixup
  GBLA count
  ;
  count SETA 14
  s1 SETS “a$$b$count” ;s1 =a$b0000000E
  s2 SETS “abc”
  fixup SETS “|xy$s2.z|” ;fixup= |xyabcz|
  |C$$code| MOV r4,#16 ;label= C$$code
  4.程序标号(label)
  在ARM汇编中,标号代表一个地址,段内标号的地址在汇编时确定,而段外标号地址值在链接时确定。根据标号的生成方式,程序标号分为以下三种。
  · 程序相关标号(Program-relative labels)。
  · 寄存器相关标号(Register-relative labels)。
  · 绝对地址(Absolute address)。
  (1)程序相关标号
  程序相关标号指位于目标指令前的标号或程序中的数据定义伪操作前的标号。这种标号在汇编时将被处理成PC值加上或减去一个数字常量。它常用于表示跳转指令的目标地址或代码段中所嵌入的少量数据。
  (2)寄存器相关地址
  这种标号在汇编时将被处理成寄存器的值加上或减去一个数字常量。它常被用于访问数据段中的数据。这种基于寄存器的标号通常用MAP和FIELD伪操作定义,也可以用EQU伪操作定义。
  (3)绝对地址
  绝对地址是一个32位的数字量,使用它可以直接寻址整个内存空间。
  5.局部标号
  局部标号是一个0~99之间的十进制数字,可重复定义。局部标号后面可以紧接一个通常表示该局部变量作用范围的符号。局部变量的作用范围为当前段,也可以用伪操作ROUT来定义局部标号的作用范围。
  局部标号在子程序或程序循环中常被用到,也可以配合宏定义伪操作(MACRO和MEND)来使程序结构更加合理。
  在同一个段中,可以使用相同的数字命名不同的局部变量。默认情况下,汇编器会寻址最近的变量。也可以通过汇编器命令选项来改变搜索顺序。
  局部变量命名语法如下。
  n{routname}
  局部变量引用的语法格式如下。
  %{F|B}{A|T}n{routname}
  其中,routname为变量作用范围名称;%表示引用操作;F指示汇编器只向前搜索;B指示汇编器只向后搜索;A指示汇编器搜索所有宏的嵌套。T指示汇编器只搜索宏的当前层。
  如果在引用过程中,没有指定F和B,则汇编器先向后搜索,再向前搜索。
  如果A和T没有指定,汇编器搜索所有从当前层次到宏最高层次,比当前层次低的层次不再搜索。
  如果指定了routname,汇编器向前搜索最近的ROUT操作,若routname与该ROUT伪操作定义的名称不匹配,汇编器报告错误并结束汇编。
  10.3.3 汇编语言程序中的表达式和运算符
  在汇编语言程序设计中经常使用各种表达式,表达式一般由变量、常量、运算符和括号构成。常用的表达式有数字表达式、逻辑表达式和字符串表达式。
  下面分别介绍表达式中各元素。
  1.字符串表达式
  字符串表达式一般由字符串常量、字符串变量、运算符和括号构成。字符串由包含在双引号内的一系列字符组成。编译器所支持的字符串最大长度为512字节。
  当在字符串中包含“$”或引号时,可以用“$$”表示“$”,用两个双引号表示一个双引号。
  例如:
  abc SETS “one ”“ double quote”
  def SETS “one $$ dollar symbol”
  上面的例子分别将字符串abc和def赋值为“one “ double quote”和“one $ dollar symbol”。
  字符串可以通过SETA、SETL、SETS伪操作对其赋值。
  常用的与字符串表达式相关的运算符如下。
  · LEN:计算字符串长度运算符。
  · CHR:ASCII码转换运算符。
  · STR:字符串转换运算符。
  · LEFT:字符串取左运算符。
  · RIGHT:字符串取右运算符。
  · CC:字符串连接运算符。
  详见后面操作符一节。
  下面的例子说明了如何使用字符串操作符给字符串变量赋值。
  improb SETS ”literal“:CC:(strvar2:LEFT:4)
  这个例子将字符串赋值为“literalatrv”。
  2.整数表达式
  整数表达式一般由数字常量、数字变量、数字运算符和括号构成。
  整数表示式可以包含寄存器相关(register-relative)或程序相关(program-relative)表达式,这些表达式在编译时被汇编器翻译为地址无关数字常量。
  整数表达式一般被计算为32位的整数,当此整数被定义为无符号数时,其取值范围为0~232-1,当被定义为有符号数时,其取值范围为-231~231-1。汇编器认为-n和232-n是相等的。对于关系操作,如比较两个数的大小,汇编器将其操作数看作无符号的数,也就是说“0》-1”对汇编器来说取值为“假({FLASE})”。
  下面的例子说明了在程序中,如何对整数表达式进行操作。
  a SETA 256*256 ;将数字变量赋值为 256*256
  MOV r1,#(a*22) ;将数字表达式(a*22) 的值放入r1
  汇编语言中,整数数字量有以下几种形式。
  · 十进制数(decimal-digis)
  · “0x”+ 十六进制数(0xhexadecimal-digits)
  · “&”+ 十六进制数(&hexadecimal-digits)
  · n进制数(n_base-n-digits)
  · 字符(character)
  其中,十进制数(decimal-digis)可以是“0”到“9”数字的任意组合;十六进制数(hexadecimal-digits)可以是“0”到“9”数字和字母“A”到“F”的任意组合;“n_”可以取2到9,“base-n-digits”是在n进制下合法的任意数值;字符(character)可以是除单引号以外的所有字符。
  下面的例子说明了整数表达式的基本用法。
  a SETA 34906
  addr DCD 0xA10E
  LDR r4,=&1000000F
  DCD 2_11001010
  c3 SETA 8_74007
  DCQ 0x0123456789abcdef
  LDR r1,=‘A’ ;ARM伪指令将整数65(A的ASCII码)存入寄存器
  ADD r3,r2,#‘\’‘ ;将整数39(字符“/”的ASCII码)加到r2,结果存入r3
  3.浮点数字量表达式
  浮点数字量有以下几种形式。
  · {-}digitsE{-}digits。
  · {-}{digits}.digits{E{-}digits}。
  · 0xhexdigits。
  · &hexdigits。
  其中,digits为十进制数,要在其后加上字母E(大写或小写)来表示其指数;hexdigits为十六进制数。
  单精度浮点数的表示范围为1.17549435e−38~3.40282347e+38;双精度浮点数的表示范围为2.22507385850720138e-308~1.79769313486231571e+308。
  下面的例子说明了浮点数据量的基本用法。
  DCFD 1E308,-4E-100
  DCFS 1.0
  DCFD 3.725e15
  LDFS 0x7FC00000 ;
  LDFD &FFF0000000000000 ;
  4.逻辑表达式
  逻辑表达式一般由逻辑量、逻辑运算符和括号构成,其表达式的运算结果为真或假。与逻辑表达式相关的运算符有“=”、“》”、“《”、“》=”、“《= ”、“/=”、“ 《》” 运算符和“LAND”、“LOR”、“LNOT”及“LEOR”运算符。
  5.程序或寄存器相关表达式
  寄存器相关表达式的值等于指定寄存器的值加上或减去一个数字表达式。
  程序相关表达式的值等于程序计数器PC的值加上或减去一个数字表达式的值。此种表达式通常由程序中的标号与一个数字表达式组成。
  下面的例子说明了程序或寄存器相关表达式的基本使用方法。
  LDR r4,=data+4*n ;n 是汇编时取值变量
  ; code
  MOV pc,lr
  data DCD value0
  ; n-1 个DCD 伪操作
  DCD valuen ;data+4*n 指向此
  ;更多DCD伪操作
  6.汇编中的操作符
  (1)操作符的优先级
  在汇编语言程序设计中,表达式包含一个扩展的操作符集,这些操作符和高级语言中的运算符十分接近。其运算次序遵循如下的优先级。
  ① 优先级相同的双目运算符的运算顺序为从左到右。
  ② 相邻的单目运算符的运算顺序为从右到左,单目运算符的优先级高于其他运算符。
  ③ 括号运算符的优先级最高。
  汇编语法的操作符优先级和C语言中的不完全相同。例如在汇编中,下面的汇编语言
  (1+2∶SHR∶3)相当于(1+(2∶SHR∶3)),而在C语言中,运算则变为((1+2)》》3)=0。类似于这样的操作,在使用时要特别注意。
  注意为了保证表达式运算结果的正确,建议使用“()”来避免异义。

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

评论(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.lene-v.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.lene-v.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);