当前位置:  技术问答>linux和unix

ARM栈操作问题?

    来源: 互联网  发布时间:2017-04-23

    本文导语:  ;*********************************************************************** ; 软中断处理 ;***********************************************************************  IMPORT do_led_on IMPORT do_led_off HandleSWI STMFD SP!, {R0-R12,  LR} ; 保存程序执行现场 LDR R4, ...

;***********************************************************************
; 软中断处理
;*********************************************************************** 
IMPORT do_led_on
IMPORT do_led_off
HandleSWI
STMFD SP!, {R0-R12,  LR} ; 保存程序执行现场
LDR R4, [LR, #-4] ; LR - 4 为指令" swi xxx" 的地址,低24位是软件中断号
BIC R4, R4, #0xFF000000 ; 取得ARM指令24位立即数

CMP R4, #1 ; 判断24位立即数,如果为1,调用do_led_on系统调用
LDREQ LR, =swi_return ; 软中断处理返回地址
LDREQ PC, = do_led_on ; 软中断号1对应系统调用处理

CMP R4, #2 ; 判断24位立即数,如果为2,调用do_led_off系统调用
LDREQ LR, =swi_return ; 软中断处理返回地址
LDREQ PC, = do_led_off ; 软中断号2对应系统调用处理

MOVNE R0, #-1 ; 没有该软中断号对应函数,出错返回-1
swi_return 
LDMIA SP!, {R0-R12, PC}^ ; 中断返回, ^表示将spsr的值复制到cpsr


想问下高手们,LDR R4, [LR, #-4] 这里的R4的改变 会不会影响栈里面的R4,如果是MOVNE R0, #-1 我就懂了, 如果不是 那么这里怎么解释MOVNE R0, #-1, R0改变了么?  我确实有些糊涂了 关于ARM的栈的操作  劳烦老师们,同仁帮帮忙,   

|



明白你说的了,你是想在调用软中断后希望返回出错码是吗?
LDMIA SP!, {R0-R12, PC}^,确实会把事先放入R0中的-1这个出错码覆盖掉。
那么建议就用一个全局静态变量来保存这个出错码,从软中断返回后,去读这个全局静态变量,来使用可以解决这个问题。

或者LDMIA SP!, {R0-R12, PC}^改一下,LDMIA SP!, {R1-R12, PC}^,但是返回后,SP就有个偏移量了,这个可以调用一个修正SP的汇编方式编写的函数,不过有隐患(如果在修正SP之前,中断来了就会导致SP和栈中数据错乱),不推荐。

希望像调用函数获取返回值的方式来得到软中断的出错码本身就不是很好,毕竟函数流程确实还是和软中断流程有差异的。

|
LDR R4, [LR, #-4] 这里的R4的改变不会影响栈里面的R4,STMFD SP!, {R0-R12,  LR}这条指令已经把R4中的值保存到栈中了,现在只是暂时用一下R4,以后在需要用到原来R4中的值时,弹栈即可。

在立即数中判断软中号的方式我是知道的,但是具体的代码没去弄过,一般物品都是用的R0来传递软中号。你这里使用的立即数方式传递软中号,我也不知道对不对。看了注释感觉像是对的。
用立即数方式传递软中号,只能是低24位。

LDR R4, [LR, #-4] 把触发当前软中断的指令取出到R4中。
BIC R4, R4, #0xFF000000 把高位清零,剩下的就是软中断号了。

剩下的不解释了,注释已经很清楚了,如果是因为对指令本身不熟悉,那么自己上网查查相关的指令吧,这几个指令很常见也很简单。

最后LDMIA SP!, {R0-R12, PC}^是和之前STMFD SP!, {R0-R12,  LR}相对的弹栈指令,这里注意带了个^,表示把SPSR同时恢复到CPSR中,这也就是回到软中断之前的那个状态了。

你问的栈操作是哪里不明白呢?

    
 
 

您可能感兴趣的文章:

  • ARM系列开发板是不是一定要用LINUX操作系统。windows操作系统可以吗?
  • 求教,linux操作系统 2410 arm9开发板 io 操作
  • 关于arm linux下硬盘操作的问题
  • 为什么ARM下linux移植那么多,但是手机却没有用linux操作系统?
  • 关于买ARM9或ARM11的开发板的问题~~~
  • 疑惑softfloat的问题,并求arm-linux-gcc和arm-linux-softfloat-gcc4.1.1
  • 关于arm 2440 选择arm-linux-gcc编译器版本的问题
  • 一个很菜的问题,关ARM与linux内核裁剪的问题!
  • arm linux 2.6.29 下载初级问题,大家指教
  • arm-elf-gcc问题
  • 基于ARM的linux问题------------------
  • ARM linux学习的问题
  • arm debian5交叉编译 环境问题(急)
  • arm-linux vi的问题
  • 在arm上加载模块时出现问题
  • arm-linux-gcc编译JM的问题求教
  • 求教 arm chip这三个不同颜色的型号问题
  • make: arm-linux-: Command not found的奇怪问题
  • 关于ARM平台移植的问题
  • 请教linux 2.6内核移植到arm上最大线程数量的问题。
  • 100分请教高手一个Linux内核ARM汇编的问题
  • 关于ARM寻址的问题
  • 关于linux-arm内核编译的问题
  • arm-linux-gcc交叉编译问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • arm-elf-gcc 和 arm-linux-gcc有什么区别?arm-elf-gcc里的elf代表什么?
  • arm-unknown-linux-gnu-gcc與arm-linux 的compiler有不同嗎
  • make ARCH=arm CROSS_COMPILE=arm-linu-错误
  • 请问哪有 arm-linux-nm, arm-linux-addr2line等等这些工具的使用说明~~~
  • 使用eclipse 加入arm-elf-gcc 或arm-linux-gcc 编译器为什么不好使
  • 现在是ARM9还是ARM11比较流行啊?我想买开发板什么牌子的比较好啊,我是大学生。
  • ARM ping不通虚拟机,虚拟机可以ping通ARM
  • 新手请教 移植2.6内核到arm9,芯片:arm926ejs,Flash: NOR
  • 请教:make ARCH=arm CROSS_COMPILE=arm-linu- menuconfig出错
  • arm-linux-gcc 交叉编译poco-1.3.5-all 报错stlport_arm_linux_gcc库找不到
  • 字节对齐 ARM VS Not ARM,经验人士请指点!!
  • ARM开发怎么实现域名解析呢,ARM板能ping通IP,不能ping通域名?
  • 关于ARM的几个基本概念
  • 关于ARM内核编译
  • 从x86到arm只需要改Makefile吗?
  • arm-linux-gcc编译XML错误
  • 编译linux->ARM平台?100分
  • 论坛 iis7站长之家
  • Processor ARM926这是个什么概念啊?
  • GNU ARM 工具链


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,