c - for, if 在汇编语言中(冒泡排序)

标签 c sorting assembly arm

我用C写了一个冒泡排序程序,检查了它的汇编列表文件。但是我无法找到 for 循环的位置。你能告诉我 for 循环和 if 语句在哪里吗?

 #include<stdio.h>

int main()
{
    int arr[5]={2,4,5,6,1};

    int i,j,tmp;

    for(i=0;i<5;i++) 
    {
        for(j=0;j<4;j++)
        {
            if(arr[j]>arr[j+1])
            {
                tmp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=tmp;
            }
        }
    }

    for(i=0;i<5;i++){
         printf("  %d",arr[i]);
    }
    printf("\n");

    return 0;   
}

这里是汇编列表文件。

; generated by ARM C Compiler, ADS1.2 [Build 848]

; commandline [-O1 -browseinfo "0xff
" -S   -g+ -fk -J:cw:]
        CODE32

        AREA ||.text||, CODE, READONLY

main PROC

|L1.0|

        STMFD    sp!,{r4,lr}

        SUB      sp,sp,#0x18

        MOV      r2,#0x14

        LDR      r1,|L1.148|

        ADD      r0,sp,#4

        BL       __rt_memcpy_w

        MOV      r12,#0

|L1.28|

        MOV      r0,#0

|L1.32|

        ADD      r1,sp,#4

        ADD      r2,sp,#4

        ADD      r3,r2,r0,LSL #2

        LDR      r1,[r1,r0,LSL #2]

        LDR      r2,[r3,#4]

        CMP      r1,r2

        BLE      |L1.72|

        ADD      lr,sp,#4

        STR      r2,[lr,r0,LSL #2]

        STR      r1,[r3,#4]

|L1.72|

        ADD      r0,r0,#1

        CMP      r0,#4

        BLT      |L1.32|

        ADD      r12,r12,#1

        CMP      r12,#5

        BLT      |L1.28|

        MOV      r4,#0

|L1.100|

        ADD      r0,sp,#4

        LDR      r1,[r0,r4,LSL #2]

        ADR      r0,|L1.152|

        BL       _printf

        ADD      r4,r4,#1

        CMP      r4,#5

        BLT      |L1.100|

        ADR      r0,|L1.160|

        BL       _printf

        MOV      r0,#0

        ADD      sp,sp,#0x18

        LDMFD    sp!,{r4,pc}

|L1.148|

        DCD      ||.constdata$1||

|L1.152|

        DCB      "  %d"

        DCB      "\0\0\0\0"

|L1.160|

        DCB      "\n\0\0\0"

        ENDP



        AREA ||.constdata||, DATA, READONLY, ALIGN=2

||.constdata$1||
        DCD      0x00000002
        DCD      0x00000004
        DCD      0x00000005
        DCD      0x00000006
        DCD      0x00000001


        EXPORT main

        IMPORT _main
        IMPORT __main
        IMPORT _printf
        IMPORT __rt_memcpy_w
        IMPORT ||Lib$$Request$$armlib||, WEAK

        KEEP 

最佳答案

给你。如果您只是查找 CMP 和常量,您应该能够找到它们:

    LDR      r1,[r1,r0,LSL #2] ; r1 = arr[j]
    LDR      r2,[r3,#4]        ; r2 = arr[j+1]
    CMP      r1,r2             ; arr[j] <= arr[j+1]
    BLE      |L1.72|           ; jump if yes
    ADD      lr,sp,#4          ; arr
    STR      r2,[lr,r0,LSL #2] ; arr[j] = arr[j+1]
    STR      r1,[r3,#4]        ; arr[j+1] = arr[j]
|L1.72|
    ADD      r0,r0,#1          ; j++
    CMP      r0,#4             ; j < 4
    BLT      |L1.32|           ; jump to inner loop if yes
    ADD      r12,r12,#1        ; i++
    CMP      r12,#5            ; i < 5
    BLT      |L1.28|           ; jump to outer loop if yes

关于c - for, if 在汇编语言中(冒泡排序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32998696/

相关文章:

assembly - x86 上顺序一致的原子负载

gcc - 用 "long NOPs"填充可执行部分的原因是什么?

c++ - "call"看似跳入自身的指令

c - 在每个组件后打印格式

c - 让 fgetc 工作时遇到问题

php - 按数组的一列从数据库查询中对数组进行排序

java - 在没有数组的情况下对四个数字进行排序

c - 程序是查看所有代码然后运行,还是逐行运行?

数据指针和函数指针的指针大小可以不同吗?

c - 按 2 个字段对结构体数组进行插入排序