汇编语言嵌套循环调用函数问题

问题描述 投票:0回答:1

调用函数像素的循环不起作用。它调用该函数一次并停止循环。这是我的代码:
.语法统一 .cpu 皮质-m4 .equ DISPLAY, 0xD0000000 //内存:像素范围

    .text

    .global     pixel
    .thumb_func
    .align

// Draws the pixel word passed in R2 to the pixel location given by the column in R0 and the row in R1
pixel:
                    //r0 = col (10-19) (input)  //#0xD0000000
                    //r1 = row 75 (input)      //i
                    //r2 = color_red    (input)
                    //r3 = #240
    mov r3, #240
    mul r1, r3      //row * 240 
    add r1, r0      //i = (row * 240) + col

    ldr r0, =DISPLAY        //load the memmory address of #0xD0000000 into r0

    str r2, [r0, r1, lsl #2]  //store value in r2 (color red) into memory address specified by r0 + r1 * 4

    //dont need to loop and increment memory adress (index) i because the function only suppose to print 1 pixel at a time

    bx      lr  //print 1 [color] pixel at i 

    .global     rect
    .thumb_func
    .align

// Fills in a rectangle with the pixel word passed in R0.
// The rectangle fills all pixels between (column,row) coordinates of (50,150) to (149,249), inclusive.
rect:
    mov r3, r0
                    //r0 = color_?  j
                    //r1 = i        i
                    //r2 = j        color_?
                    //r3 = 
                    //r12 = 

    mov r1, #150                     //r1 = i (row)
loopi:
    mov r2, #50                      //r2 = j (col)
loopj:
        // Body of nested loop is here

    push {r4-r11, lr} // preserve registers

    mov r4, r1  //move col into r4
    mov r5, r2  //move row into r5
    mov r6, r3  //move color into r6
    mov r2, r6                       // r2 = color
    mov r0, r5                       // r0 = col
    mov r1, r4                       // r1 = row
    bl pixel                         // call pixel function
    mov r2, r0
    pop {r4-r11, pc} // restore registers and return


    add r2, #1   // increment col    
    cmp r2, #150
    blo loopj

    add r1, #1   // increment row
    cmp r1, #250
    blo loopi

    bx      lr
.end

我尝试了不同的寄存器或在循环之外的其他地方调用 push pop。然而,无论我做什么,循环都不起作用。

loops assembly while-loop arm do-while
1个回答
0
投票
    .syntax     unified
    .cpu        cortex-m4
    .equ DISPLAY,             0xD0000000 //memory: range of pixels

    .text

    .global     pixel
    .thumb_func
    .align

// Draws the pixel word passed in R2 to the pixel location given by the column in R0 and the row in R1
pixel:
                    //r0 = col (10-19) (input)  //#0xD0000000
                    //r1 = row 75 (input)      //i
                    //r2 = color_red    (input)
                    //r3 = #240
    mov r3, #240
    mul r1, r3      //row * 240 
    add r1, r0      //i = (row * 240) + col

    ldr r0, =DISPLAY        //load the memmory address of #0xD0000000 into r0

    str r2, [r0, r1, lsl #2]  //store value in r2 (color red) into memory address specified by r0 + r1 * 4

    //dont need to loop and increment memory adress (index) i because the function only suppose to print 1 pixel at a time

    bx      lr  //print 1 [color] pixel at i 

    .global     rect
    .thumb_func
    .align

// Fills in a rectangle with the pixel word passed in R0.
// The rectangle fills all pixels between (column,row) coordinates of (50,150) to (149,249), inclusive.
rect:
                    //r0 = color_?  j
                    //r1 = i        i
                    //r2 = j        color_?
                    //r3 = 
                    //r12 = 

    push {r4-r11, lr} // preserve registers
    mov r6, r0

    mov r4, #150                     //r4 = i (row)
loopi:
    mov r5, #50                      //r5 = j (col)
loopj:
        // Body of nested loop is here


    
    mov r2, r6                       // r2 = color
    mov r0, r5                       // r0 = col
    mov r1, r4                       // r1 = row
    bl pixel                         // call pixel function


    add r5, #1   // increment col    
    cmp r5, #150
    blo loopj

    add r4, #1   // increment row
    cmp r4, #250
    blo loopi

    pop {r4-r11, pc} // restore registers and return
.end
© www.soinside.com 2019 - 2024. All rights reserved.