韦东山Linux嵌入式课程社区
直播中

李秀兰

7年用户 1428经验值
私信 关注

汇编语言r0和r1之间有什么区别?

ARM裸机第一期,第13课 代码重定位  ;  源码在目录     005_ARM裸机1期加强版源码文档图片源码12_relocate09

老师的汇编代码:
        /* 重定位text, rodata, data段整个程序 */
        mov r0, #0
        ldr r1, =_start             /* 第1条指令运行时的地址 */
        ldr r2, =__bss_start    /* bss段的起始地址 */
        sub r2, r2, r1
        bl copy2sdram  /* src, dest, len */


老师的C语言代码:
void copy2sdram(volatile unsigned int *src, volatile unsigned int *dest, unsigned int len)  /* src, dest, len */
{
        unsigned int i = 0;
        while (i < len)
        {
                *dest++ = *src++;
                i += 4;
        }
}

此时串口输出字符正常!
===================================================================

我把汇编代码中r0换成了r1,r1换成r2,r2换成了r3,如下:
        /* 重定位text, rodata, data段整个程序 */
        mov r1, #0
        ldr r2, =_start             /* 第1条指令运行时的地址 */
        ldr r3, =__bss_start    /* bss段的起始地址 */
        sub r3, r3, r2
        bl copy2sdram  /* src, dest, len */

C语言编码不动;

此时串口无字符输出?
================================================
这是为什么啊?
看了下dis文件:所有的dis目录下,唯一的区别就是以下四条:
正确的源代码dis(30000000 <_start>:中):
30000060:        e3a00000         mov        r0, #0        ; 0x0
30000064:        e59f102c         ldr        r1, [pc, #44]        ; 30000098 <.text+0x98>
30000068:        e59f202c         ldr        r2, [pc, #44]        ; 3000009c <.text+0x9c>
3000006c:        e0422001         sub        r2, r2, r1


有问题的源代码dis 在(30000000 <_start>:中):
30000060:        e3a01000         mov        r1, #0        ; 0x0
30000064:        e59f202c         ldr        r2, [pc, #44]        ; 30000098 <.text+0x98>
30000068:        e59f302c         ldr        r3, [pc, #44]        ; 3000009c <.text+0x9c>
3000006c:        e0433002         sub        r3, r3, r2


为什么会有这样的问题,希望大神解答下,谢谢!!!!

回帖(2)

罗宗保

2019-8-30 08:52:41
  r0 r1 r2 是给c语言的参数啊,r0代表第一个参数
你换成 r1 r2 r3岂不是错位了
举报

赵晶晶

2019-8-30 09:07:28
哦,明白了,多谢老师指点1
举报

更多回帖

发帖
×
20
完善资料,
赚取积分