Shift Left: LSL
Shift Right: LSR
Bit-by-bit AND: AND, ANDI
Bit-by-bit OR: ORR, ORRI
Bit-by-bit NOT: EOR, EORI
CBZ: Compare and branch if zero.
CBNZ: Compare and branch if not zero.
B: Branch to Label.
ADDS, ADDIS, ANDS...
-> 값을 저장하고 프로그램 상태 레지스터에 값을 업데이트
N: negative
Z: zero
V: overflow
C: carry
overflow: 연산 결과값이 나타낼 수 있는 범위 초과
carry: MSB비트에서 그 자리 위로 올림 발생
1+127 = 0b00000001 + 0b01111111 = 0b10000000 = -128
(overflow만 발생)
1-1 = 0b00000001 + 0b11111111 = 0b00000000 = 0
(carry만 발생)
if (i==j) f = g + h;
else f = g - h; //f,g,h,i,j in X19, X20, X21, X22, X23
SUB X9, X22, X23
CBNZ ELSE
ADD X19, X20, X21
B EXIT
ELSE: SUB X19, X20, X21
EXIT: ...
while (save[i] == k) i += 1; //i, k, save in X22, X24, X25
LOOP: LSL X10, X22 #3
ADD X10, X10, X25
LDUR X9, [X10, #0]
SUB X11, X9, X24
CBNZ X11 EXIT:
ADD X22, X22, #1
B LOOP
EXIT:
long long int leaf_example (long long int g, long long int h, long long int i, long long int j) {
long long int f;
f = (g + h) - (i + j);
return f;
}
//g,...,j in X0,...,X3
//f in X19
//임시로 X9, X10을 사용하고 지역 변수인 f을 저장하기 위해 X19를 사용한다. 따라서 3개의 임시 값을 백업해놓고 해당 위치의 레지스터를 사용해서 처리한다.
SUBI SP, SP, #24
STUR X10, [SP, #16]
STUR X9, [SP, #8]
STUR X19, [SP, #0]
ADD X9, X0, X1
ADD X10, X2, X3
SUB X19, X9, X10
ADD X0, X19, XZR
LDUR X10, [SP, #16]
LDUR X9, [SP, #8]
LDUR X19, [SP, #0]
ADDI SP, SP, #24
BR LR
int fact (int n) {
if (n < 1) return 1;
else return n * fact(n - 1);
}
// n in X0, result in X1
fact:
SUBI SP, SP, #16
STUR LR, [SP, #8]
STUR X0, [SP, #0]
SUBIS XZR, X0, #1
B.GE L1
ADDI X1, XZR, #1
ADDI SP, SP, #16
BR LR
L1:
SUBI X0, X0, #1
BL fact
LDUR X0, [SP, #0]
LDUR LR, [SP, #8]
ADDI SP, SP, #16
MUL X1, X0, X1
BR LR