strleb란 명령어를 본 적이 있나요? 전 잘 몰라서요, 이 명령어가 어떻게 동작하는지 테스트를 해봤거든요.
그 내용을 정리해서 업데이트할께요.
제가 만난 명령어는 아래와 같거든요.
cmp r3, #2 @ 1 //<<--[1]
strleb r2, [r0], #1 @ 1
해석을 하면 아래와 같아요.
"R3이 0x2보다 같거나 작을 경우[1], r2의 하위 2바이트를 r0가 가리키는 주소에 있는 값에 저장한 후 r2를 1만큼 증가시킴"
"strltb" 명령어는 아래 단어를 줄인 것 같은데요.
Str(Store)|le(Signed less than OR equal) | b(Byte)
이 내용이 머리에 잘 안 들어와서 실제 Trace32로 이 명령어가 동작하기 전/후를 점검해봤어요.
cmp r3, #2 @ 1
strleb r2, [r0], #1 @ 1
일단 R3이 1이니까 2보다 작죠.
R0은 C000A000 주소를 갖고 있고, C000A000 메모리에는 FFFFFFFF값이 있어요.
N _ R0 C000A000 R8 0
Z Z R1 0 R9 0
C C R2 EEEECCCC R10 0
V _ R3 1 R11 0
_____address|________0________4________8________C
NSD:C0009FF0| 00000000 00000000 00000000 00000000
NSD:C000A000|>FFFFFFFF 00000000 00000000 00000000
NSD:C000A010| 00000000 00000000 00000000 00000000
이 명령어를 수행하면, R0이 1만큼 커져서 C000A001이 되구요.
R0이 가르켰던 C000A000 메모리 공간에 있는 FFFFFFFF값 하위 2바이트가 CC로 바뀌어 있어요.
[After]
N N R0 C000A001 R8 0
Z _ R1 0 R9 0
C _ R2 EEEECCCC R10 0
V _ R3 1 R11 0
_____address|________0________4________8________C
NSD:C0009FF0| 00000000 00000000 00000000 00000000
NSD:C000A000|>FFFFFFCC 00000000 00000000 00000000
NSD:C000A010| 00000000 00000000 00000000 00000000
ARM사에 계신 ARM개발자님께서 왜 이런 명령어를 개발하셨을까요?
아마 명령어당 ARM core의 실행 횟수를 줄이려고 이런 명령어를 만드신게 아닌 가 생각되네요.
참, 대단하신 것 같네요.
'시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 > 4장: 어셈블리 명령어' 카테고리의 다른 글
arm instruction(명령어) - ldr (0) | 2023.06.10 |
---|---|
arm instruction(명령어) - push & 스택 푸쉬 (0) | 2023.06.10 |
arm instruction(명령어) - cmn (0) | 2023.06.10 |
arm instruction(명령어) - ldm (0) | 2023.06.10 |
arm - ldrd 명령어 (0) | 2023.06.10 |