Programming with 64-Bit ARM Assembly Language: Single Board Computer Development for Raspberry Pi and Mobile Devices

Chapter 2: Loading and Adding


2021.07.29: updated by

MOV/MOVK/MOVN

MOV 命令と ADD 命令の説明。 負の整数は2の補数で表現する。 ARM プロセッサはBI Endian である。すなわち、Big Endian も Little Endian もどちらも使える。

MOV命令のフォーマット

MOVK  XD, #imm16{, LSL #shift}
MOV   XD, #imm16{, LSL #shift}
MOV   XD, XS
MOV   XD, operand2
MOVN  XD, operand2
LSLは0, 16, 32, 48 が指定できる。64bitレジスタの任意の16bitに値を設定できる。 レジスタで Xがつくと64bit, Wがつくと32bitを意味する。 上記の例でDはDestination, SはSourceを表している。 MOVK命令 (MOVe Keep) は64bitレジスタにデータをloadするために存在する。 指定された16bitにデータ値を設定するが、他の48bitの値は変更しない。 MOVZ命令は、64bitレジスタの指定された16bitにデータ値を設定し、さらにの48bitを0に設定する。 MOV命令は MOVZ命令と同じである。
(例) レジスタ X2 に 0x0123456789ABCDEF (64bitのデータ)を設定する。
  MOV   X2, #0xCDEF
  MOVK  X2, #0x89AB, LSL # 16
  MOVK  X2, #0x4567, LSL # 32
  MOVK  X2, #0x0123, LSL # 48
(例) レジスタ X2 の値をレジスタ X1 にコピーする。
  MOV   X1, X2   // X1 <-- X2
operand2 は3種類。
A register and a shift
A register and an extension operation
A small number and a shift
(例)
  MOV  X1, X2, LSR  #1   // Logical Shift Right
  MOV  X1, X2, ASR  #1   // Arithmetic Shift Right
  MOV  X1, X2, ROR  #1   // Rotate Right

  LSL  X1, X2, #1   // Logical Shift Left
  LSR  X1, X2, #1   // Logical Shift Right
  ASR  X1, X2, #1   // Arithmetic Shift Right
  ROR  X1, X2, #1   // Rotate Right
extension operation は2番目のレジスタから byte, half-word, word を引き出す。 0 extend, 符号extend, 0-4ビットの左シフトを指定できる。
(例) extension operation
Extension Operator    Description
---------------------------------
uxtb                  unsigned extend byte
uxth                  unsigned extend halfword
uxtw                  unsigned extend word
sxtb                  sign-extend byte
sxth                  sign-extend halfword
sxtw                  sign-extend word
MOVN命令 (MOVe Not) は1と0を反転するMOVである。
movexamps.s


ADD/ADC

1.  ADD{S}  Xd,  Xs,  Operand2
2.  ADC{S}  Xd,  Xs,  Operand2
// X2 = X1 + 4000
ADD  X2, X1, #4000

// X2 = X1 + 0x20000
ADD  X2,  X1,  #0x20,  LSL 12

// X2 = X1 + X0
ADD  X2,  X1,  X0

// X2 = X1 + (X0 * 4)
ADD  X2,  X1,  X0,  LSL 2

// X2 = Xx1 +  signed extended byte (X0)
ADD  X2,  X1,  X0,  SXTB

// X2 = X1 + zero extended halfward(X0) * 4
ADD  X2,  X1,,,  X0,  UXTH 2

SUB/SUBC

1.  SUB{S}  Xd,  Xs,  Operand2
2.  SBC{S}  Xd,  Xs,  Operand2


http://nw.tsuda.ac.jp/