回归博文,记录工作点滴

好久没有写博文了, 请原谅我的懒惰。

最近工作参与到一个armArch组件, 该组件是要操作底层寄存器的,也就是要用到汇编语句。

最近在解决程序中出现的fail问题。 挺有意思的。 我听说这个程序改了几次都出现fail情况。 下面我说说我知道的他们的解决思路和我的解决思路吧 。

首先我联系了作者, 我对汇编不是很理解。 他一来就是一顿骚操作,我感觉就不是解决问题的思路,不知道的以为是个大佬。 首先他把输入参数改了, 然后他把处理过程的程序代码改了。 最后运行还是fail,我截图给他提醒他处理,下班了,他也没有回复这个事情估计他也不想解决了。

从他的修改我大概知道他的流程,经过调试对比,我解决了该fail。 他改代码的原因是他在检测标志位的时候出错了,由于NZCV标志位的Z位没有设置0, 因此他在检测前面做了一个相同值的不同变量的减法,将z标志位设置为0, 程序正常运行。 然而,当编译环境修改后, 运行程序再次出错,他以为程序里没有把z标志位设置为0,然后他又将减变量的嵌套汇编进行重新编写。 然后,还是达不到他的要求。 最后他把函数传参的输入值进行修改,想利用输入值来匹配结果,但是还是没有成功。

我看了程序,这个程序是很简单的, 先备份寄存器的状态,然后再设置自己的预期值,然后再恢复预期值。 就这么个简单的程序为什么不能达到呢?

我通过调试,当写入进去的时候寄存器中的值确实是变了。 然而在验证的时候调用了其他函数,造成NZCV的标志位变化了。 造成再次确认标志位时不能验证通过。 通过挪用代码位置,fail就消除了。

我用的simic调试,这个玩意最大的优点是能看寄存器的值,很方便。 这个软件可能是个商业软件,但是gdb也好用的。

从上面的分析,可以知道调试是重要的,分析过程是重要的,解决问题要知道原因所在不是瞎改。

以后我每周周末都总结一次所学的知识点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值