找回密码
 立即注册
查看: 397|回复: 0

STCx51虚拟单片机(3):STC 80351指令集的寄存器组与等级指令集系统

[复制链接]

该用户从未签到

63

主题

696

回帖

1万

积分

荣誉版主

积分
10880
发表于 2024-1-8 22:14:41 | 显示全部楼层 |阅读模式
本帖最后由 杨为民 于 2024-2-19 12:45 编辑

一、STC 80351指令集的完整寄存器组
(1)STC 80351指令集寄存器组是像80x86那样的分层次寄存器组。,下层次的寄存器组成上层次的,最高层次为32位寄存器。
下图给出了STC 80351指令集的完整寄存器组的映射图:
STC 80351指令集8位、16位和32位寄存器的地址映射表
Fig_01_80351寄存器.jpg
其中:寄存器按高端定义,左边的字节是高位字节。

STC 80351指令集寄存器在设计时就考虑了与Intel 80251指令集的兼容性,它们之间的对应关系如下表。
Fig_02_80251寄存器.jpg
从上表中可以看到,二者是一一对应的。由于STC80351指令集有一个80251指令全子集,因此在80351的汇编语言中,当你使用那些80251指令时,也可以直接使用80251寄存器名,在同一地址的不同名寄存器存取的内容是一样的。
(2)在C51/C251里面,函数调用(Z=F(X,Y)的基本规范是第一个参数的寄存器是X=R7(8位变量)、X=R6R7(16位变量)和X=R4R5R6R7(32位变量),第二个参数的寄存器是Y=R3(8位变量)、Y=R2R3(16位变量)和Y=R0R1R2R3(32位变量),函数的返回值的寄存器是Z=R7(8位变量)、Z=R6R7(16位变量)和Z=R4R5R6R7(32位变量)。
在80x86汇编语言中,不对称指令(比如乘法)的结果通常在AX中,因此在STC80351的寄存器名称中,AX对应了R6R7而不是R2R3.
(3)80351指令集有两个32位的通用指针寄存器“EFP”和“EGP”,用于C语言的指针和数组运算,有两个32位的专用指针寄存器“EBP”和“EVP”,前者用于RTOS的可重入函数堆栈指针,后者用于DOS的任务内存动态分配和回收。
(4)STC80351 32位指令集的寄存器组结构和命名与金水明80451 64位指令集相同,只是少了64位的寄存器组合“QAX”和“QCX”以及系统堆栈段寄存器“SS”。
二、STC 80351指令集指令的等级结构
(5)STC 80351指令集指令采用等级式指令集系统,这样做的目的是为将STC两类传统意义的单片机:STC8H系列单片机与STC32G/F系列单片机,通过软件扩展32位指令集和硬件扩展32位DPU升级为新的两类32位单片机:STC51 H8系列单片机和STC51 G32/F32系列单片机。
(6)STC 80351-L0指令集。这个L0等级的指令集就是Intel 8051指令集全集。L0指令集只包含8位的运算指令,通用寄存器只能使用前面“STC 80351指令集的完整寄存器组”中的“R0~R7”这8个8位寄存器。
传统的STC8H系列单片机只能使用STC 80351-L0指令集。Keil的C51编译器只支持L0指令集。
(7)STC 80351-L1指令集。这个L1等级的指令集主要是DPU32的运算指令以及依赖这些指令其他指令。L1指令集是一个RISC的不对称的完整指令集,包含了8位、16位和32位的运算指令和内存存取指令。L1指令集的通用寄存器只能使用前面“STC 80351指令集的完整寄存器组”中的“EAX”和“EBX”这2个32位通用寄存器(以及组成它们的8位、16位寄存器)和“BP”、“VP”这两个函数重入16位指针寄存器。
新的的STC51 H8系列单片机既可以使用STC 80351-L0指令集,也可以使用STC 80351-L1指令集。Keil的C51编译器不直接支持L1指令集,但可以用替换库函数的方法支持DPU32的一些运算指令。
(8)STC 80351-L2指令集。这个L2等级的指令集就是Intel 80251指令集全集。L2指令集可以使用前面“STC 80351指令集的完整寄存器组”中的全部寄存器,只是这些寄存器的名称要使用80251的寄存器名。由于80251指令集包含了完整的8051指令集,因此L2等级指令集包含了L0等级的全部指令。
目前的STC32G/F系列单片机支持使用STC 80351-L2指令集。Keil的C251编译器只支持L2指令集。
(9)STC 80351-L3指令集。这个L3等级的指令集主要是DPU32的运算指令以及依赖这些指令其他指令。L3指令集是一个RISC的不对称的完整指令集,包含了8位、16位和32位的运算指令和内存存取指令。L3指令集能够使用前面“STC 80351指令集的完整寄存器组”。按照设计L3等级指令集包含了L1等级的全部指令。
新的的STC51G32/F32系列单片机既可以使用STC 80351-L2指令集(含L0指令集),也可以使用STC 80351-L3指令集。Keil的C251编译器不直接支持L3指令集,但可以用替换库函数的方法支持DPU32的一些运算指令。
三、STC 80351指令集的L1等级与L3等级的差别
虽然L1等级与L3等级的指令集的共同特点是都能够支持STC单片机的32位运算,但是其使用的硬件、使用的方法和使用的目的还是有很大的差别的。
(10)STC 80351-L1指令集只适合使用8051内核做存储管理的STC8单片机系列,比如现在的STC8Hxxxx、STC8Axxx等STC8系列单片机和未来的STC51 H8xxxx系列单片机。
STC 80351-L3指令集只适合使用80251内核做存储管理的STC32G/F单片机系列,比如现在的STC32Gxxxx、STC32Fxxx等STC32系列单片机和未来的STC51 G32/F32系列单片机。
(11)由于L1指令集只使用了EAXEBX两个32位通用寄存器,因此在执行硬件中断和RTOS任务切换时,只需要保存R0~R7这8个8位通用寄存器就可以了。
而L3指令集使用了80251的全部通用寄存器,因此在执行硬件中断和RTOS任务切换时,需要保存80251的全部通用寄存器。

(12)Keil的C51编译器只支持用L0和L1等级指令编程,Keil的C251编译器只支持用L2和L3等级指令编程。


1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-12 10:59 , Processed in 0.055439 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表