newlined 发表于 2024-9-9 11:03:19

学习32G的地址分配记录贴

本帖最后由 newlined 于 2024-9-11 10:11 编辑

对32G手册的第10章(存储器)一直没有学的透彻,在这里开一学习笔记贴,边学边记。我一直以为单片机,地址非常重要。如果有理解不对的地方,还请大家指出,谢谢。


1:32G 系列单片机提供 24 位寻址空间,最多能够访问 16M 的存储器(8M 数据存储器+8M 程序存储器),    地址从00:0000H到7F:FFFFH是数据存储区,占用8M;80:0000H到FF:FFFFH是程序存储区,占用8M。
2: 其中数据存储区又分为2部分,edata占用00:0000H-00:FFFF 共64K,xdata占用01:0000H-7F:FFFFH 共8M-64K

3:edata区域在C语言代码中使用“edata”关键字声明变量, xdata区域在C语言代码中使用“xdata”关键字声明变量。

   在汇编语言中:edata区域

                           edata区域可以分为00H-1FH:寄存器组(R0~R7),可以通过RS0,RS1选择
                           20H~7FH:      直接寻址(也可以间接访问)(都可以位寻址)
                           80H~FFH:    间接寻址,例如要访问80H 通过以下语句    MOV R0,#80H;MOV A,@R0 ;那么80H的内容就到了A
                                                直接寻址,例如要访问80H 通过以下语句    MOV R0,EDATA 80H
                           100H~0FFFH间接访问, MOV   WR0, #WORD0 100H;MOV   R11,@WR0
                                                               MOVDPTR ,#100H; MOV A @DPTR;
                                                               MOV WR0,@WR4(目标操作数为字寄存器)
                           100H~0FFFH直接访问, MOV R0,EDATA 100H;(目标操作数为字节寄存器);
                                                堆栈访问,就是把堆栈设定在100H~0FFFH时 比如 STACKEQU   100H;MOV SPX,#STACK;
                                                                                                                        PUSHSPX ;POPSPX
                           xdata区域:
                           
                           以上办法中比较难的部分由liuzongguang老师和zxcv1973老师提供,非常感谢
希望大家集思广益,看看有多少种访问edata和xdata区域的方法。                        






newlined 发表于 2024-9-9 17:08:21

问题来了{:smile:}
edata区域可以分为00H-1FH:寄存器组(R0~R7),可以通过RS0,RS1选择
                           20H~7FH:直接寻址(都可以位寻址)
                            80H~FFH:间接寻址 例如要访问80H 通过一下语句:MOV R0,#80H
                                                                                                      MOV A,@R0 ;那么80H的内容就到了A
                            100H~0FFFH 应该也是间接访问,如果要访问100H,是不是要这样:MOV   WR0, #WORD0 100H
                                                                                                                              MOV   R11,@WR0;100H的内容就到了A

不知道我说的对不对,我没有把握,如不对,请指出,谢谢大家。

newlined 发表于 2024-9-9 17:09:15

或者还有其他办法,也请指出。

21cnsound 发表于 2024-9-9 18:08:22

8位8051用汇编有的玩,32位8051感觉真心没必要用汇编了:一是32位8051比8位的寄存器和指令复杂太多,二是32位的资源和性能提升很大而没必要汇编。

liuzonggong 发表于 2024-9-9 20:18:02

newlined 发表于 2024-9-9 17:08
问题来了
edata区域可以分为00H-1FH:寄存器组(R0~R7),可以通过RS0,RS1选择
                           ...

MOVDPTR ,#100H;
MOV A @DPTR;

newlined 发表于 2024-9-10 07:59:43

21cnsound 发表于 2024-9-9 18:08
8位8051用汇编有的玩,32位8051感觉真心没必要用汇编了:一是32位8051比8位的寄存器和指令复杂太多,二是32 ...

是这样我这里有一个20几年的汇编程序,一直没有机会改成C.我也知道有C跟汇编混用的,但我没有用过。

liuzonggong 发表于 2024-9-10 08:27:25

newlined 发表于 2024-9-10 07:59
是这样我这里有一个20几年的汇编程序,一直没有机会改成C.我也知道有C跟汇编混用的,但我没有用过。 ...

20年前我也是写汇编,当时用南京伟福。改成c后不愿意再写汇编了。写汇编得准备一个本子,随时记得那个内存用过了。自己管理堆栈,每个调用都要数数堆栈看看是否越界。汇编有一个好处,就是实实在在的知道你的程序是怎样在片内跑的。

newlined 发表于 2024-9-10 08:43:49

liuzonggong 发表于 2024-9-10 08:27
20年前我也是写汇编,当时用南京伟福。改成c后不愿意再写汇编了。写汇编得准备一个本子,随时记得那个内 ...

我现在维护的这个程序,老板也一直没有安排改为C,所以一直是修修补补{:smile:}

科学妞妞 发表于 2024-9-10 08:52:40

看,你们说的很开心,但是,没说明白,stc元老院,怎么说解释手册啊操作的例程也不多,

newlined 发表于 2024-9-10 09:22:34

科学妞妞 发表于 2024-9-10 08:52
看,你们说的很开心,但是,没说明白,stc元老院,怎么说解释手册啊操作的例程也不多, ...

单片机毕竟是本来就是跑机器语言的,如果能彻底搞懂,也不错。
页: [1] 2 3
查看完整版本: 学习32G的地址分配记录贴