设置SFR半字节的优雅方式

时间:2015-10-27 19:30:35

标签: assembly bit-manipulation 8051 nibble

我想把一个半字节从累加器移到P1的高位半字节。

现在,我一点一点地设置半字节

MOV C, ACC.3
MOV P1.7, C
MOV C, ACC.2
MOV P1.6, C
MOV C, ACC.1
MOV P1.5, C
MOV C, ACC.0
MOV P1.4, C

这对我来说似乎很糟糕:它需要12个指令周期且代码很长。我希望SWAPXCHD能够解决问题,但间接寻址在SFR内存区似乎不起作用。

是否有更快或更短(不一定是两种)的编码方式?我想不要接触P1的下半部分。

2 个答案:

答案 0 :(得分:1)

我不熟悉那个CPU,但你可以用1 AND,1 SHL和1 OR对字节进行操作。

在英特尔8086+上,al代表8位 - ACCbl代表8位 - P1,它会是这样的:

and bl, 0x0f    # clear high nybble
ror al, 8       # or shl 8 if accumulator can be discarded
or  bl, al

答案 1 :(得分:1)

如果您使用P1的低4位作为输入,您希望将它们设置为<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:background="@color/colorPrimaryDark" android:layout_height="match_parent"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:background="@android:color/transparent" android:weightSum="3" android:gravity="center_vertical" android:layout_height="?attr/actionBarSize"> <ImageView android:layout_weight="1" android:layout_width="0dp" android:layout_gravity="left" android:layout_height="match_parent" android:src="@drawable/ic_list" android:id="@+id/tab1" android:padding="12dp" /> <ImageView android:layout_weight="1" android:layout_width="0dp" android:layout_gravity="left" android:layout_height="match_parent" android:src="@drawable/ic_connect" android:id="@+id/tab2" android:padding="12dp" /> <ImageView android:layout_weight="1" android:layout_width="0dp" android:layout_gravity="left" android:layout_height="match_parent" android:src="@drawable/ic_chat" android:id="@+id/tab3" android:padding="12dp" /> </LinearLayout> <FrameLayout android:id="@+id/pager" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> ,并且很容易将其组合到您的代码中。

1

如果您将它们用作输出,则可以使用read-modify-write,例如:

swap A
orl A, #15
mov P1, A

注意,这将暂时将引脚3-7归零。如果这是不可接受的,则必须在寄存器中计算新值。