작성
·
182
1
(strexb %0, %2 %1" : "=&r"(result), "=Q"(*addr): "r" ((uint32_t)value));
여기에서 %0 과 %1 이 출력 오퍼랜드이고 %2가 입력 오퍼랜드라고 하셨는데 출력오퍼인지 입력오퍼인지 어떻게 구분하는건지요? %0하고%2 가 순서대로 result 와 addr 이고, value 가 %1 인줄 알았는데 가운데 있는 %2가 왜 입력 오퍼랜드인지 궁금합니다. (순서대로인줄 알았음)
답변 1
0
반갑습니다:) 신지웅님
우선 "=&r"(result), "=Q"(*addr): "r" ((uint32_t)value 는 순서대로 %0 %1 %2 로 맵핑됩니다.
그리고, 궁금하신 부분이었던
입력이냐 출력이냐는 연산 방향에 의해 결정됩니다. 예를들어 R0=1 의 경우 숫자 1이 R0 에 저장되죠?
이때 R0 는 출력 오퍼랜드로 보고 1은 입력 오퍼랜드로 바라보는 식입니다.
이번 사례에서 사용된 명령 STREXB 시놉시스 STREXB{cond} Rd, Rt, [Rn] 의 경우
연산이 Rd=[Rn] 와 [Rn]=Rt 로 각각 처리되므로
Rd 와 [Rn] 는 출력 오퍼랜드
Rt 가 입력 오퍼랜드가 되겠죠
추가 궁금한 점 있으시면 다시 댓글 남겨주세요.
답변감사드립니다. 그럼 %0,%1,%2 이 숫자의 크기? 로 순서가 판별된건가요?
예를들어 (strexb %2, %1 %0" : "=&r"(result), "=Q"(*addr): "r" ((uint32_t)value)); 이면
적혀있는 순서에 상관없이 result, addr, value 에 순서대로(숫자의크기) %0 %1 %2 로 맵핑 되는것인가요?