我有一个非常简单的问题,但它让我爬上墙,你能帮我吗?
这是一个问题:如何在ARM汇编中比较两个带符号的字节值?这就是我试过的:
ldrsb r1, [r0], #1
ldrsb r2, [r0]
cmp r1, r2
r0加载了一个字节值列表的地址,如10,-1,123。加载负数时,ldrsb不应该延伸sig吗?我迷路了
修改
我们应该编写一个程序,对一组有符号字节值进行排序(使用bubblesort)。我可以弄清楚如何做到这一点,只是我不理解实际比较(或其结果)。到目前为止,这是我的代码:
.global main
.section .data
myNumbers: .byte 183, 374, -113, -1, 10, 101, -3, -54, 9, 7
myNumbersEnd:
.section .text
main:
loop:
mov r4, #0
ldr r0, =myNumbers
ldr r3, =myNumbersEnd
inner_loop:
ldrsb r1, [r0], #1
ldrsb r2, [r0]
cmp r1, r2
strgtb r1, [r0]
strgtb r2, [r0, #-1]
movgt r4, #1 @ r4 = swapped = true
cmp r0, r3
bne inner_loop
cmp r4, #1
beq loop @ keep going
exit:
b exit
.end
也许我应该补充一点,我不是在实际的ARM硬件上运行此代码,而是在ARMSim#上运行,这是ARM7TDMI处理器的模拟器:http://armsim.cs.uvic.ca/index.html
答案 0 :(得分:3)
好的,我会尝试打破它。
r4
包含“我们交换了什么吗?” r0
和r3
包含输入数据的开头和结尾
loop:
mov r4, #0
ldr r0, =myNumbers
ldr r3, =myNumbersEnd
使用r1
指向的字节加载和转发r0
,将r0
更新为r0+1
r2
r0
比较两个值,这基本上是r1-r2
,具体取决于结果标志的更新。
inner_loop:
ldrsb r1, [r0], #1
ldrsb r2, [r0]
cmp r1, r2
如果r1大于r2,则以交换顺序存储值
同时设置交换标志(r4)
strgtb r1, [r0]
strgtb r2, [r0, #-1]
movgt r4, #1 @ r4 = swapped = true
将r0
中的当前指针与r3
除非它们相等,否则执行下一个字节
cmp r0, r3
bne inner_loop
检查我们是否换了任何东西,如果我们做了就重新开始。
cmp r4, #1
beq loop @ keep going
这里的关键点是比较。如前所述,cmp执行op1-op2抛出结果,但根据结果设置标志,这些标志是: N = tempresult [31](表示MSB已设置,对于有符号值,表示结果已签名。 Z = tempresult == 0(当两个值相等时将为1) C = tempresult [31]!= op1 [31](用于无符号比较,表示op1< op2) V = op1 [31]!= op2 [31]&& op1 [31]!= tempresult [31](像携带有符号值的东西)
接下来你的strgtb首先使用标志来查看它是否真的需要执行,条件为gt
,转换为:
Z == 0 && N == V
如果条件为真,则执行该指令,对于接下来的两条指令也是如此。
仅供参考,您的数据集包含无效数据
myNumbers: .byte 183, 374, -113, -1, 10, 101, -3, -54, 9, 7
183和374可能会引起混淆。有效的SIGNED 8位值介于-128和127之间。您的代码将183评估为有符号值。
答案 1 :(得分:1)
是的,ldrsb
符号扩展正在加载的字节。你遇到的实际问题是什么?什么对你所尝试的不起作用?