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/

相关文章:

sorting - Grails 对多个字段进行映射排序::Groovy 对多个映射条目进行排序

python 自定义排序列表 1/2/3/../9/10

c - 汇编代码转C代码(添加指令问题)

c - 如何检查数组是否有回车

c - 操作长字符串时内存损坏

c - 使用 libavfilter 过滤视频时出现巨大的内存泄漏

assembly - 快速的寄存器内字节排序?

assembly - 如何增加 assembly 图形中的文字大小?

c++ - 处理器多久检查一次 while 循环条件?

c - 如何使用预处理器删除全局数组?