[ZLG-ARM] GNU ARM 汇编快速入门续2

[复制链接]
2488|1
 楼主| miclinux 发表于 2009-6-1 11:56 | 显示全部楼层 |阅读模式
.&nbsp;mov&nbsp;pc&nbsp;#0x&nbsp;&nbsp;&nbsp;指令可用来实现代码跳转,跳转时的立即数可以是32位的,但必须是一个8位的数移位偶数次的结果。<br />2.&nbsp;在代码中使用.word定义变量时,一定要保证该地址不会被指令执行到,或者把变量的定义专门放到一个数据段里面。<br />3.&nbsp;比较时使用cmp指令,后跟bne、bge、bgt、blt、ble跳转指令<br />4.&nbsp;可以使用.word把标识符作为常量使用<br />例如:<br />&nbsp;&nbsp;Start:<br />&nbsp;&nbsp;valueOfStart:<br />&nbsp;&nbsp;&nbsp;.word&nbsp;Start<br />这样程序的开头Start便被存入了内存变量valueOfStart中。<br />5.&nbsp;adr&nbsp;RN&nbsp;0&nbsp;;表示adr以后可用来代替R0使用<br />6.&nbsp;关于标签,标签存在于编译过程中,标签本身对应的值是绝对地址,例如:<br />.word&nbsp;label<br />定义的数值是label标签对应的绝对地址。<br />有些编译语句在使用时把它转变为绝对地址,例如:<br />ldr&nbsp;r0,&nbsp;label&nbsp;<br />相当于是ldr&nbsp;r0,&nbsp;[label-pc]<br />ldr和adr的区别:<br />adr仅取标签的相对地址,取得的是label的相对地址,该代码可以在和标签相对位置不变的情况下移动;ldr&nbsp;r0,&nbsp;=_start取得的是_start的绝对地址,该代码可以在_start标签的绝对位置不变的情况下移动;而ldr&nbsp;r0,&nbsp;_start是根据_start对当前PC的相对位置读取其所在地址的值,故是一句位置无关代码,可以在和_start标签的相对位置不变的情况下移动。<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;_start<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;_start<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;=_start<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;lr<br />_start:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />编译的时候设置&nbsp;RO&nbsp;为&nbsp;0x0c008000<br />↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓<br />0c008000&nbsp;&lt_start-0x14&gt:<br />c008000:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e59f000c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;[pc,&nbsp;#12]&nbsp;&nbsp;&nbsp;;&nbsp;c008014&nbsp;&lt_start&gt<br />c008004:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e28f0008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;pc,&nbsp;#8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;0x8<br />c008008:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e59f0008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;[pc,&nbsp;#8]&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;c008018&nbsp;&lt_start+0x4&gt<br />c00800c:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e1a00000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(mov&nbsp;r0,r0)<br />c008010:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e1a0f00e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;lr<br />0c008014&nbsp;&lt_start&gt:<br />c008014:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e1a00000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(mov&nbsp;r0,r0)<br />c008018:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0c008014&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stceq&nbsp;&nbsp;&nbsp;0,&nbsp;cr8,&nbsp;[r0],&nbsp;-#80<br />分析:<br />ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;_start<br />从内存地址&nbsp;_start&nbsp;的地方把值读入。执行这个后,r0&nbsp;=&nbsp;0xe1a00000<br />adr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;_start<br />取得&nbsp;_start&nbsp;的地址到&nbsp;r0,但是请看反编译的结果,它是与位置无关的。其实取得的时相对的位置。例如这段代码在&nbsp;0x0c008000&nbsp;运行,那么&nbsp;adr&nbsp;r0,&nbsp;_start&nbsp;得到&nbsp;r0&nbsp;=&nbsp;0x0c008014;如果在地址&nbsp;0&nbsp;运行,就是&nbsp;0x00000014&nbsp;了。<br />ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;=_start<br />这个取得标号&nbsp;_start&nbsp;的绝对地址。这个绝对地址是在&nbsp;link&nbsp;的时候确定的。看上去这只是一个指令,但是它要占用&nbsp;2&nbsp;个&nbsp;32bit&nbsp;的空间,一条是指令,另一条是&nbsp;_start&nbsp;的数据(因为在编译的时候不能确定&nbsp;_start&nbsp;的值,而且也不能用&nbsp;mov&nbsp;指令来给&nbsp;r0&nbsp;赋一个&nbsp;32bit&nbsp;的常量,所以需要多出一个空间存放&nbsp;_start&nbsp;的真正数据,在这里就是&nbsp;0x0c008014)。<br />因此可以看出,这个是绝对的寻址,不管这段代码在什么地方运行,它的结果都是&nbsp;r0&nbsp;=&nbsp;0x0c008014<br /><br /><br />&nbsp;<br /> &nbsp;&nbsp;<br />
arminfo 发表于 2009-6-1 13:10 | 显示全部楼层

好帖,跟一个

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

64

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部