S3C2440 汇编之地址跳转

2015-2-11

自己写了个IRQ的跳转处理,但是却发现BL指令编译通不过,BLX也不行。

后来才知道,S3C2440还是ARMv4的汇编指令体系结构,不支持BLX,而BL只支持跳转到常量地址。

形如BL R0的写法是不行的,而BX是可以的,BX是带模式切换的,不过模式不需要切换也一样可以用,但BX不能把下一个地址保存到LR中,

只有BL和BLX才可以,所以这里就需要自己保存下一个地址到LR中,这个倒不难。

MOV LR,PC就可以了,不过注意ARMv4虽然是三级流水线,在执行MOV LR,PC时,PC已经指向下两个地址,但也可能不是。

具体要看芯片实现,不过好的是,MOV LR,PC 在具体芯片上偏移多少是固定好了的,所以只要事先测试下知道是多少就好处理了。

这个知识点可以参考杜春雷的《ARM体系结构与编程》,也给出了测试代码,不过因为我手上有仿真器,加断点到MOV LR,PC这一条上,看看PC是多少就知道了,不用写测试代码了。

汇编代码如下:

IRQ_Handler
		STMFD   SP!, {R0-R4, LR}
		LDR R1,=INTOFFSET
		LDR R0,[R1]
		LDR R2,=IRQHandle
                LDR R3,[R2,R0,LSL #2]
                MOV LR,PC
		BX R3
;		BL	StartHandle
		LDMFD   SP!, {R0-R4, LR}
		SUBS    PC,  LR,  #4

跳转到C函数中,用下标查表的方法也可以,思想和汇编代码一样,只是用C写更简单更容易理解,不过这样效率稍稍低了点。

下面是C函数下的反汇编代码:

;;;7      extern void StartHandle(void)
000000  e92d4010          PUSH     {r4,lr}
;;;8      {
;;;9      	(IRQHandle[S3C_VIC -> INTOFFSET])();
000004  e3a0144a          MOV      r1,#0x4a000000
000008  e5911014          LDR      r1,[r1,#0x14]
00000c  e59f2048          LDR      r2,|L1.92|
000010  e7920101          LDR      r0,[r2,r1,LSL #2]
000014  e1a0e00f          MOV      lr,pc
000018  e12fff10          BX       r0
;;;10     }
00001c  e8bd4010          POP      {r4,lr}
000020  e12fff1e          BX       lr
;;;11
                          ENDP
时间: 2024-10-21 14:13:50

S3C2440 汇编之地址跳转的相关文章

汇编中的跳转指令

能修改CS以及IP的指令都是转移指令.它分为段内转移,段间转移. 段内转移:只修改IP的值 段间转移:同时修改CS以及IP的值 段内转移根据转移的距离远近分为:短转移,近转移 短转移:转移范围为-128 – 127 近转移:转移范围为-32768 –32767 根据转移情况又分为: 无条件转移指令 条件转移指令 循环指令 过程 中断 <1> jmp short xxx(行号) 这个是短转移指令,实现段内的转移,在翻译成机器码的时候,码内并没有目标地址,有的只是转移位移,这样做的好处就是防止目标

根据Email地址跳转到相应的邮箱登录页面 (转)

//跳转到指定的邮箱登录页面 $(".btn_actemail").click(function () { var uurl = $(".hide_email").val(); uurl = gotoEmail(uurl); if (uurl != "") { $(".toopen").attr("href", "http://"+uurl); $(".toopen"

php根据IP地址跳转对应的城市,淘宝REST api调用地址直接使用

<?php // 定义一个函数getIP() function getIP(){ global $ip; if (getenv("HTTP_CLIENT_IP")) { $ip = getenv("HTTP_CLIENT_IP"); }else if(getenv("HTTP_X_FORWARDED_FOR")) { $ip = getenv("HTTP_X_FORWARDED_FOR"); }else if(geten

关于js的地址跳转

一.基本的地址跳转 解说: window.open 弹出新窗口的命令:     page.html' 弹出窗口的文件名:    'newwindow' 弹出窗口的名字(不是文件名),非必须,可用空'代替: height=100 窗口高度: width=500 窗口宽度: top=0 窗口距离屏幕上方的象素值: left=0 窗口距离屏幕左侧的象素值. window.location.href = "页面地址"; //当前页跳转 相当于 <a href="baidu.co

想让两个地址跳转的页面一样

问题:项目首页登录:如想让(A)10.118.66.20:8080/ABX/ 与(B)10.118.66.20:8080/ABX/index.do,链接跳转的页面一样 web.xml中配置如下: <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> (1)可在index.jsp页面中处理 <%@ page language="java&q

地址跳转问题

进行页面跳转时注意,地址页面必须包含解决方案的名字并且前面必须加"/",负责会报错404无法找到资源!

Shiro整合SSH开发3:配置Shiro认证后页面地址跳转问题(和详述不配置需要注意的问题)

在视频教程中讲请求认证成功后跳转页面的问题是一笔带过的,但是我觉得有必要单独写一篇对应的文章进行叙述. 我用了SSH来整合Shiro,在开发后验证的过程中,每次登陆后Shiro都会跳转到一个不知名js中,但是重点是我上一次访问的地址是: Edit http://localhost:8080/shiro_05/user/login.action 认证之后应该跳转到上一个请求的地址,但是Shiro却跳转到了: http://localhost:8080/shiro_05/user/js/eqmt.j

生成二维码并指定地址跳转

/* * 功能:生成二维码 * @param string $qr_data 手机扫描后要跳转的网址 * @param string $qr_level 默认纠错比例 分为L.M.Q.H四个等级,H代表最高纠错能力 * @param string $qr_size 二维码图大小,1-10可选,数字越大图片尺寸越大 * @param string $save_path 图片存储路径 * @param string $save_prefix 图片名称前缀 */ function createQRco

关于地址跳转的参数

//http://www.huistd.com/?id=99&ttt=3&haha=33 // GetQueryString("haha") //获取地址栏参数 function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.subst