ARM cpu의 linux 커널 소스 head.S에서 str 명령어 동작을 모르겠습니다

익명 사용자의 이미지

일단 str 인스트럭션 동작을 잘 모르겠습니다
ARM System Developer's Guide에서의 설명을 보면,

; store the contents of register r0 to the memory address pointed to by register r1.
STR r0, [r1] ; = STR r0, [r1, #0]

The instruction goes the other way by storing the contents of register
r0 to the address contained in register r1. The offset from register r1 is zero. Register r1 is
called the base address register.

위와 같이 나와 있는데,
정확히 잘 모르겠습니다.
str 인스트럭션 동작에 대해서 정확히 설명해주실 수 있는 분 있으신가요?

그리고 head.S 파일에서 이 명령이 쓰이는 모습을 보면

mov r0, #0
str r0, [r2], #4
str r0, [r2], #4
str r0, [r2], #4
str r0, [r2], #4

위와 같은데,
r2 레지스터에 저장되어 있는 주소가 가리키는 데이터를 4바이트 만큼 0으로 초기화인가요?
※ str 인스트럭션을 실행할 때마다 r2에 저장되어 있는 주소가 다음주소로 변경되는 건가요?
str r1, [r0], #4

head.S에서 위의 명령을 반복하면 왜 일대일 매핑이 되는지도 모르겠습니다
(코드를 전부 옮겨놓을 수도 없고 어디까지 옮겨놓아야 하는지도 몰라서 head.S 파일에서 확인 가능할 것 같습니다 죄송합니다)

마지막으로 cmp 명령도 설명 가능하신 분 있으시면 부탁드립니다
cmp r1, r10
위에서 r1 레지스터에 저장된 값과 r10 레지스터에 저장된 값을 단순히 비교하는 것이 아닌 것 같은데 잘 모르겠습니다

질문이 부실해서 죄송합니다

jundols의 이미지

ㅎㅎ 자료를 찾아보지 않고 말씀드리는거여서 틀릴수 도 있습니다~
str 명령어, ldr 명령어가 data 전송 명령어인거는 아실테니,
str, ldr 명령어의 인덱스 방식에는 pre-index 와 post-index 방식이 있습니다~
질문하신 str 명령어의 방식은 post-index 방식이구요~
post-index 방식의 경우 먼저 베이스 레지스터(위에서는 r2)에다가 r0의 값을 write 합니다
동작이 완료되면 offset(위에서는 #4)값을 베이스 레지스터의 값과 계산한 후 베이스 레지스터값을 갱신하여 줍니다~

명령어의 모양을 보면 pre-index인지, post-index인지 쉽게 알 수 있습니다
pre-index -> str r0, [r2, #4]! ; pre-index방식은 !를 맨 뒤에 붙여줘야 값이 갱신됩니다
post-index-> str r0, [r2], #4

그리고,,, 두번째 질문인... cmp 명령어..
ARM에는( 사실 대부분 CPU에는 ) status 레지스터가 있습니다. ARM에서는 cpsr 이라고 부릅니다.
cpsr의 bit assign을 잘 살펴보시면 Z bit이 있는데요.
cmp 명령어 자체로 하는 역활은 레지스터 A와B를 뺀후에 나온 값이 0인지 아닌지를 Z bit를 SET or CLEAR 시키는 일을 합니다.
따라서 cmp 명령어 자체로는 비교만 해줄뿐 판단은 안해줍니다. 그래서 항상 cmp 명령어는 다른 명령어와 같이 쓰입니다.

예제)
mov r0, #1
mov r1, #1
cmp r0, r1 ; <- 이 명령어를 수행하면 무조건 CPSR의 Z bit의 기존값은 날라가고, 1 또는 0 값이 write 됩니다.
beq ~~~~~~ ; <- beq 는 branch 에 컨디션 옵션은 eq 를 묶은 명령어 입니다. 즉, cpsr에 Z bit가 1이면 jump, 아니면 그냥 아래로 고고

drinkme의 이미지

void func(int a, int *b, int *c)
{
*b = a; <---- 1번

a = 0; <---- 2번
*(c++) = a;
*(c++) = a;
*(c++) = a;
*(c++) = a;

...
}

위의 '1번' 부분이

str r0, [r1]

이 됩니다.

위의 2번 부분이

mov r0, #0
str r0, [r2], #4
str r0, [r2], #4
str r0, [r2], #4
str r0, [r2], #4

입니다.

cmp r1, r10

맞습니다. 그냥 비교하는 겁니다. 크기 비교 후 결과가 CPSR에 반영될 겁니다.

mhhong의 이미지

간단히 생각 하시면 됩니다.
str r0, [r2], #4
r0의 값을 r2에 저장 되어 있는 주소에 복사를 하고 r2에 저장 되어있는 주소를 4만큼 증가 시킵니다.
cmp r1, r10
r1, r10의 값이 같으면 CPSR의 Z 플레그가 1이 되고 같지 않으면 0이 됩니다.
cmp는 subs와 같은 역할을 합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.