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의 실행 횟수를 줄이려고 이런 명령어를 만드신게 아닌 가 생각되네요. 
 
참, 대단하신 것 같네요.
 

+ Recent posts