BGE指令ARM

时间:2018-11-28 13:45:07

标签: assembly arm branch instruction-set

此测试要求在“ BGE”条件下分支到标签。存储在要比较的寄存器中的值是:

std::cout << A::b << std::endl

我希望它分支,但是0X8F不大于0X3。在Keil上模拟我的代码证明了这一点。

我想知道是否有人知道它为什么不分支以及如何将0X8F读取为大于0X3!

非常感谢<3

2 个答案:

答案 0 :(得分:2)

请记住,BGE是一个带符号的比较,因此在您的示例中,鉴于第一个操作数(r0)不大于或等于第二个操作数({{ 1}})。

r1

出于完整性的考虑,并且正如Michael所建议的那样,更普遍(或建议)使用LDR r0,=0X3 ; load 0X00000003 LDR r1,=0X8F ; load 0x0000008F CMP r0,r1 ; (r0 - r1) and sets the condition register BGE a_label ; Conditional branch which checks if it was greater or equal (False) SUBS r1,r1, #0XC9 而不是MOV r0,#0X00000003来加载常量(很可能生成的文件恰好是相同)See this

答案 1 :(得分:2)

我认为您误解了const dateArray = ['2018-12-15', '2018-11-20', '2018-12-20'] const prices = [{ _id: '5bf454d9c4a8bc6e246afd05',date: '2018-12-15',time: '9:00 - 10:00',status: 'available',price: 35 },{ _id: '5bf455adf678f76f7ffb9144',date: '2018-11-20',time: '15:00 - 16:00',status: 'available',price: 55 },{ _id: '5bf455caf678f76f7ffb914b',date: '2018-11-20',time: '12:00 - 13:00',status: 'available',price: 45 },{ _id: '5bfec692d25d720f29eb49e1',date: '2018-12-20',time: '9:00 - 10:00',status: 'available',price: 33 }] let obj = dateArray.reduce((obj, date) => { if (!obj[date]) obj[date] = {date, timePrice:[]} // get prices for specific date let pr = prices.filter(item => item.date === date) // for each price push just the time and price values as a new object obj[date].timePrice.push(pr.map(({time, price}) => ({time, price}))) return obj }, {} ) // Object.values(obj) will be your array console.log(Object.values(obj))与条件代码的“比较”变体一起工作的方式。当您阅读CMP后跟一条条件指令时,请先将条件代码移至CMP的两个参数之间。因此

CMP

表示“如果CMP r0, r1 BGE label 大于或等于r0等于或等于r1,则分支。在您的情况下,r0是3,而r1是0x8F(143),因此显然分支不会发生。