【发布时间】:2021-12-07 12:53:09
【问题描述】:
这是对整个有符号单词(int32_t)进行排序的第一个代码:
sort: SUB R1,R1,#1 //--n void StupidSort(int a[], int n)
ADD R12,R0,#4 //нач.адрес+4 {
ADD R1,R0,R1,LSL#2 //краен адрес int tmp, i = 0;
L1: LDR R3,[R0] //*a do {
LDR R2,[R0,#4]! //*++a ___ if (a[i] > a[i+1]) {
CMP R3,R2 // \ tmp = a[i+1];
BLE L2 // \ a[i+1] = a[i];
STMDA R0,{R2,R3} // \ a[i] = tmp;
CMP R0,R12 // \ if (i) i--;
SUBHI R0,R0,#8 // \___ } else i++;
L2: CMP R0,R1 // } while (i < n - 1);
BLT L1 // }
BX LR
这是我到目前为止所做的:
sort: SUB R1,R1,#1 //--n void StupidSort(int a[], int n)
ADD R12,R0,#2 //нач.адрес+4 {
ADD R1,R0,R1,LSL#1 //краен адрес int tmp, i = 0;
L1: LDRH R3,[R0] //*a do {
LDRH R2,[R0,#2]! //*++a ___ if (a[i] > a[i+1]) {
CMP R3,R2 // \ tmp = a[i+1];
BLE L2 // \ a[i+1] = a[i];
STRH R2,[R0,#2]
STRH R3,[R0] // \ a[i] = tmp;
CMP R0,R12 // \ if (i) i--;
SUBHI R0,R0,#4 // \___ } else i++;
L2: CMP R0,R1 // } while (i < n - 1);
BLT L1 // }
BX LR
我尝试将其更改为对 uint16_t 无符号半字进行排序。我快完成了,但有些事情是 代码中缺失。问题是排序,架构是ARM(在ARM模式下,不是 拇指);另外我不知道标志是什么!在 LDRH 功能后面我也认为 ldrd r3 和 r2 应该轮换他们的位置。
【问题讨论】:
-
@AlexF 我的意思是缺少一些东西,因为当我编译然后运行它时,它显示了 10 个完全相同的数字
-
@AlexF 并且在第二个 ldrh 的末尾还有!我不知道它是做什么用的
-
请不要做傻事。代码聪明。但
!代表预索引。ldrh r2,[r0, #2]!在内存访问之前更新r0 = r0 + 2。ldrh r2, [r0], #2会更新后,顺便说一句。 -
与Insertion Sort of uint16_t halfwords? 非常相似的问题,尽管那里的 32 位排序使用条件谓词存储,而不是使用分支来跳过
stm。 (并且使用ldm进行负载;有趣的事实:您不能使用both LDM 和STM 进行有效交换,因为没有办法让寄存器列表以不同的顺序排列;这是一个位图。) -
@AkiSuihkonen 你认为我应该改变 ldrh 中 r3 和 r2 的位置