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である。
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/