ARM 어셈을 공부 하던중 궁금증이 생겼습니다.

teaeune의 이미지

바로 상수값 로드 부분에 대한 궁금증입니다.
일반적으로 ARM의 경우 0x0000000부터 0xfffffff 사이에 레지스터를 매핑 시켜 두고 접근 하는 것으로 알고 있습니다.
간단하게 예로 들면 LDR r0,=0x53000000
이런 루틴으로 s3c2440에서는 Watchdog Configu 레지스터가 존재 합니다.

상수값역시 을 로드 하는 명령 역시 LDR을 사용해서 사용 한다고 하더군요
32비트 상수값을쓰는 이유는 레지스터에 대한 값을 한번에 초기화 시키기 위해서 사용 하는 것 같은데요
0x0000d7fd로 초기화 하고 싶다면 LDR r0,=0x0000d7fd 이렇게 하면 초기화 되더군요.
32비트 상수는 리터럴풀으로 offset값이변경되어 거기 값을 참조 하는것으로 알고 있습니다.

근데 여기서 궁금증이 생깁니다.
초기화 해야 되는 코드가 0x53000000 로 32bit를 초기화 하고 싶다면
LDR r0,=0x53000000 이 되지 않겠습니까? 그런데 이것은 s3c2440 watchdog 주소라는 것이죠.
이점이 궁금합니다. 어떤식으로 처리가 되는지..

poonamu의 이미지

Watch dog 초기화 코드는 다음과 같습니다.

0x53000000 주소에 매핑되어 있는 watch dog의 레지스터 값을 0으로 초기화 하는 코드 입니다.

ldr r0,=0x53000000 // r0에 0x53000000 상수를 저장합니다.
ldr r1,=0x0 // r1에 0x0 상수를 저장 합니다.
str r1,[r0] // r0 값의 주소에 r1 값을 저장 합니다.

위 3줄의 코드가 있어야 0x53000000 주소에 있는 레지스터를 초기화 할 수 있습니다.

teaeune의 이미지

답변 감사합니다.

제가 궁금 한것이
LDR 로 레지스터도 읽어 오고, 일반 상수도 저장 할수 있는데
코딩할때 어떤식으로 해야 될지 모르겠습니다.
LDR r0,#0x~~~~ 라고 하면 어떨때는 에러가 날때도 있고 어떨때는 그냥 될때고 있고 그렇더라고요
그래서 책을 보니 LDR r0,=0x~~~ 로 하면 r0에 제가 원하는 32비트 값을 세팅 할수 있다고 하더군요
그래서 그렇게 하려고 하다 보니 LDR 이라는 명령은 레지스터값을 가지고 오는 역할을 하더라구요.
그래서 궁금증이 생긴 것입니다. 인트스럭션 셋을 확인 해보니 중간에 중간에 25번 비트가 레지스터를 선택 할 것인지 이미디어트 상수를 선택 할것인지를 나타 내는 부분이 있더라구요.

그래서 궁금한것의 요점은
1. 0x53000000(WATCHDOG) 레지스터를 0x53000000(값) 으로 초기화 하고 싶으면 어떻게 해야하나요
2. LDR r0,=0x53000000 이것이 r1를 초기화 값을 초기화 하고 싶어 하는지, 레지스터를 가지고 싶어 하는지를 어떻게 알까요?

poonamu의 이미지

제가 적은 코드에 주석을 적었는데도 아직 이해를 못하신것 같네요.
코드를 빌드해서 디어셈해서 봐보세요.

가장 간단하게 레지스터에 값을 적는 방법은 mv 명령어를 사용하는 방법입니다.
mv r0, #0x0

이거는 해보셨나요?
mv r0,#0x53000000
mv r1,#0x0
str r1,[r0]

입력된 상수에 따라 빌드 할 때 에러가 날수도 있고 에러 없이 빌드가 될 수도 있습니다.
단지 상수 값이 다르다는 이유만으로....

mv 명령어, ldr 명령어의 동작 방식을 정확하게 이해하셔야 합니다.

첫번째 질문 0x53000000(WATCHDOG) 레지스터를 0x53000000(값) 으로 초기화 하고 싶으면
ldr r0,=0x53000000 // r0에 0x53000000 상수를 저장합니다.
ldr r1,=0x53000000 // r1에 0x53000000 상수를 저장합니다.
str r1,[r0] // r0 값의 주소에 r1 값을 저장합니다.

두번째 질문에 대한 답은 아래 질문의 답을 알면 알 수 있습니다.

만약 원래 코드를 아래와 같이 바꾼다면 어떻게 동작할까요?
ldr r0,=0x53000000
ldr r1,=0x0
str r0,[r1]

ldr r0,=0x53000000
ldr r1,=0x0
는 그냥 아무 생각없이 r0, r1에 내가 원하는 상수값을 저장한 것 밖에 없습니다.
왜 어떤 목적으로 r0, r1에 그 값을 저장하는지는 그 다음 코드를 봐야 알 수 있습니다.
그 다음 코드가 없다면 r0, r1에 그냥 상수가 있을 뿐입니다.

teaeune의 이미지

감사드립니당

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.