【方辉专栏】Armv7 M 架构简介(四) --寄存器常见操作
发布时间:2022-10-14

摘要: 本文主要对Armv7-M架构中指令集对寄存器中的值的操作行介绍。

关键字:Armv7-M架构、按位逻辑运算、移位、加法、减法、乘法、伪代码描述


指令集对寄存器中的值提供如下操作。包括按位逻辑运算、移位操作、加法、减法和乘法、这些操作的描述,在Arm7-M架构手册中都是用伪代码形式来描述的。

在指令中会用到如下类型的位移和循环操作:


逻辑左移(LSL)

将寄存器中每一位向左移动指定位数,右端用零补齐。除非最后移除的一位被当做输出,否则移除的位被丢弃。

相应伪代码如下:

//需要输出最后一位

//LSL_C()

(bits(N), bit) LSL_C(bits(N) x, integer shift)

assert shift > 0;

extended_x = x : Zeros(shift);

result = extended_x<N-1:0>;

carry_out = extended_x<N>;

return (result, carry_out);


//不需要输出最后一位

//LSL()

(bits(N) LSL(bits(N) x, integer shift)

assert shift >= 0;

if shift == 0 then

result = x;

else

(result, -) = LSL_C(x, shift);

return result;


逻辑右移(LSR)

将寄存器中每一位向右移动指定位数,左端用零补齐。除非最后一位被当做输出,否则移除的位被丢弃。

相应伪代码如下:

//需要最后一位输出

//LSR_C()


(bits(N), bit) LSR_C(bits(N) x, integer shift)

assert shift > 0;

extended_x = ZeroExtend(x, shift+N);

result = extended_x<shift+N-1:shift>;

carry_out = extended_x<shift-1>;

return (result, carry_out);


//不需要输出最后一位

//LSR()

(bits(N) LSR(bits(N) x, integer shift)

assert shift >= 0;

if shift == 0 then

result = x;

else

(result, -) = LSR_C(x, shift);

return result;


算术右移(ASR)

将将寄存器中每一位向右移动指定位数,左端用零补齐。除非最后一位被当做输出,否则移除的位被丢弃。

相应伪代码如下:

//需要最后一位输出

//ASR_C()

(bits(N), bit) ASR_C(bits(N) x, integer shift)

assert shift > 0;

extended_x = SignExtend(x, shift+N);

result = extended_x<shift+N-1:shift>;

carry_out = extended_x<shift-1>;

return (result, carry_out);


//不需要最后一位输出

//ASR()

(bits(N) ASR(bits(N) x, integer shift)

assert shift >= 0;

if shift == 0 then

result = x;

else

(result, -) = ASR_C(x, shift);

return result;


循环右移(ROR)

将将寄存器中每一位向右移动指定位数,从右端移除的每个位在左端重新引入,最后输出的一位可以作为输出。

相应伪代码如下:

//需要最后一位输出

//ROR_C()

(bits(N), bit) ROR_C(bits(N) x, integer shift)

assert shift != 0;

m = shift MOD N;

result = LSR(x,m) OR LSL(x,N-m);

carry_out = result<N-1>;

return (result, carry_out);


//不需要最后一位输出

//ROR()

(bits(N) ROR(bits(N) x, integer shift)

if shift == 0 then

result = x;

else

(result, -) = ROR_C(x, shift);

return result;


带扩展位循环右移(RRX)

将将寄存器中每一位向右移动一位,进位输入到左端。移除的右端可以作为输出。

相应伪代码如下:

//需要最后一位输出

//RRX_C()

(bits(N), bit) RRX_C(bits(N) x, bit carry_in)

result = carry_in : x<N-1:1>;

carry_out = x<0>;

return (result, carry_out);


//不需要最后一位输出

//RRX()

(bits(N) RRX(bits(N) x, bit carry_in)

(result, -) = RRX_C(x, carry_in);

return result;


来源:《Armv7-M Architecture Reference Manual 》


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


关于九游会J9电子

九游会J9电子技术有限公司(英文名称:Emdoor Electronics Technology Co.,Ltd)是国内资深的研发工具软件提供商,公司成立于 2002 年,面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。

20 年来,先后与 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家中国本土客户,为客户提供从芯片级开发工具、EDA 设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式 GUI 工具等等。九游会J9电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。

欢迎关注“九游会J9电子”公众号

了解更多研发工具软件知识