2010-03-02 4 views
2

내가 소화 할 수없는 것이 있습니다. 나는 어떤 어셈블러를 배우고 있으며, 지금 나는 어드레싱과 관련된 장에있다. 역 참조를위한 괄호의 개념을 이해하지만 어떻게 든 사용법을 볼 때 나는 그 지점을 흡수 할 수 없다. 내 혼란이 시작된 곳 여기에 조금 더 정확하게하려면입니다 :어셈블러에서 주소 지정

mov 인 등이, [L1]

여기에서 확인 내가 예를 들어 케이스로 L1을 가정한다 나중에 실제 주소를 대입 매크로 어떤 종류의 기계어 코드에 .. 좋아?

이 명령어의 기능은 다음과 같습니다. 물리적 주소를 거의 변경할 수 없어서 참조를 역 참조하고 L1에 저장된 값으로 값을 변경합니다.

경우 지금은 모든 것이 확인 될 때까지 :

MOV [L1] 알

analogicaly ... 주소가 저장되어 있어야합니다 (그래서이 일을 어느 시점이 있었다) 의미가와 당신은 그것을 메모리의 다른 장소로 바꾼다. 그렇지?

만약 내가 실수를해서는 안되는 경우에 대비해주세요. 제게 배우기를 계속해도 좋을 것입니다.

오, 마지막으로 NASM은 내 코드 아래에 0xAA55를 추가합니다 (이 시퀀스는 프로그램을 끝내기로되어 있습니까?), 왜 이렇게 여러 번입니까? 여기를 읽어 주셔서 대단히 감사합니다.

답변

3

L1 통상적/아마 레이블, 메모리의 특정 어드레스와 관련된이다. 프로그래머는 자신의 편의를 위해 다양한 레이블을 정의하며 이러한 레이블은 메모리의 특정 위치를 상징적으로 나타내는 데 사용됩니다 (L1은 형편없는 이름이지만 일반적으로 레이블은 위치의 기본 용도를 나타냅니다. 예 : PingCounter, ErrorMessage, 로그인 등).

L1 자체 는 메모리 주소 (즉 등 아키텍처에 따라 메모리 모델, 통상 메모리 4 또는 8 바이트를 말한다)을 포함한다. 모든 라벨이 메모리의 주소와 일치하기 때문에 다소 혼란스러워 질 수 있지만, 모두 에는 주소가입니다.즉, L1 (또는보다 정확하게는 [L1])을 사용하면 읽기/쓰기가 발생하는 메모리 위치에 대한 추가 간접 참조가 있습니다. 어셈블리 언어에서이 간접 주소 지정 모드는 지정된 명령어의 소스 및/또는 대상 피연산자를 대괄호로 묶어 표시합니다.

mov al, [L1] 

메모리에 약간의 위치를 ​​찾기 위해, L1에 저장된 주소를 사용하며,이 위치에서 두 바이트 (= 16 비트 = AL 레지스터의 크기)를 판독하고, AL 레지스터에 이것을 저장한다.

mov [L1], al 

역순으로 표시됩니다. 즉 L1에 저장된 주소를 읽고,이 주소를 사용하여 메모리의 특정 위치를 찾은 다음 AL 레지스터의 내용을 거기에 저장합니다.


는 다음과 같은 정보가 불완전하고는 x86 제품군의 새로운 프로세서에 관해서는 다소 시대에 뒤 떨어진 것으로 이해 다만,이 primer on the 8086 architecture 아마 하나는 86 가족을위한 어셈블리 언어를 시작하는 매우 유용합니다.
이 "고대의 CPU"(아직 사용중인 상태)로 시작한 이점은 새로운 개념의 레지스터, 고급 어드레싱 모드, 작동 모드 및 기타 개념에 대한 기본 개념이 모두 존재한다는 것입니다. 최신 CPU의 더 큰 크기, 기능 및 모드는 옵션의 조합 폭발을 도입하기 만합니다. 모두가 (대부분?) 유용하지만, 개시와는 본질적으로 관련이 없습니다.

+0

나는 지금 그것을 얻는다 고 생각한다. 단지 하나지만. 당신은 모든 레이블이 두 번째 명령에서 실제로 L1에 저장되는 것이 AL 주소임을 나타냅니다. ? – Pyjong

+0

두 번째 명령에서 레이블 L1의 주소는 AL 레지스터의 값으로 설정됩니다. –

+2

@stupid_idiot (btw, 어느 쪽도 아닌 것 같습니다). 아니요, AL (및 AH, AX 및 모든 레지스터 이름)은 메모리 위치가 아니며 주소 자체가 없습니다. 그들은 단순히 CPU 자체 내의 특정 위치를 참조하기 만합니다. 사실, 나는 당신의 질문에 "dereferencing al register"라는 표현을 사용하는 것에 대해 "정정"하려고했다. 이 상황에서 AL에 대한 어드레싱 모드는 "등록"입니다. AL에 관해서는 역 참조가 일어나지 않습니다. (이것은 때로는 레지스터가 혼란스러워 질 수 있습니다. 레지스터는 다음에 참조되는 메모리에 주소를 생성하는 데 사용될 수 있습니다) – mjv

2
mov al, [L1] 

나는 L1을 매크로로 생각하지 않습니다. L1은 레지스터입니다. 프로세서는 해당 레지스터의 내용을 읽고 거기에서 주소를 찾습니다. 그런 다음 해당 주소에서 읽은 데이터가 al에 저장되어 있는지 확인합니다.

배열에있는 모든 숫자에 5를 더한다고 생각해보십시오. 그런 다음 L1 레지스터에 배열의 "색인"을 유지하고 [L1]에서 번호를 검색하고 5를 더한 다음 저장하고 L1을 증가시키고 반복하십시오.

면책 조항 : @Benoit 밀러 아래 말했듯이, L1이 등록되지 않습니다 : 나는

ETA ... 이것은 단지 다른 플랫폼에 의미 "역 참조"무엇에서 노력하고 있습니다 ... 특히 NASM을 사용한 적이 하지만 일반적인 메모리에있는 장소 ..하지만 dereferencing의 설명은 여전히 ​​적용, 나는 생각합니다.

2

귀하의 질문에 따라하기가 어렵지만 도와 드리겠습니다.

어셈블리에서 기호는 주소의 이름 일뿐입니다. 어셈블리 소스에서 L1은 다른 곳에서 정의 된 기호이며 어셈블러는 메모리에 대한 오프셋으로 해결합니다.

역 참조 ([] 표기법 사용) 할 때 "mov al, [esi]"와 같은 레지스터 또는 "mov al, [L1]"에서처럼) 참조를 역 참조 할 수 있습니다. 두 문장 모두 똑같은 일을합니다. 유일한 차이점은 주소의 출처입니다.

Intel CPU Documentation을 다운로드하고 지침 참조를 건너 뛰는 것이 좋습니다. 압도 당하고 싶지 않다면 이전 x86 프로세서 (예 : 486 또는 그 이전)에서부터 읽기 시작하십시오. 그 문서는 정확히 친숙하지는 않지만 손에 갖고 다니는 것이 매우 유용합니다.

내가 터보 어셈블러로 15 년 전에 조립 배운, NASM의 특성을 모르는, 그리고 그 지식을 오늘 :) 또한

여전히 유용합니다, 나는 당신이 "86 어셈블리 튜토리얼에 대한 인터넷 검색을 시도 제안 할 수있다 ", 유용한 문서가 많이 있습니다.

1

아, 그리고 마지막 한가지, NASM 내 코드에서 0xAA55의 무리를 추가합니다 (이 순서가 프로그램 권리를 종료하도록되어?), 왜 거기에 너무 몇 번입니까? 여기에 그것을 읽어 주셔서 대단히 감사합니다.

저는 부트 로더를 만드는 경우에만 해당합니다. 그것은 "부팅 서명"입니다. 이 부트 로더 코드로 컴퓨터를 시작하려고 할 때, BIOS는 플로피를보고 실제 부트 로더인지를 결정합니다.이를 수행하기 위해 플로피의 첫 번째 섹터의 마지막 두 바이트를보고 부팅 할 수 있음을 나타 내기 위해 0xAA55이어야합니다 (또한 하드 드라이브를 부팅 할 때와 같은 방식으로 작동합니다. 엄지 드라이브 등 무엇이든간에 4096 바이트 섹터가있어 CD가 약간 다릅니다.)

소스 코드에서 $(times.. db 0xAA55과 같은 내용입니까? 부트 로더를 만들지 않으려면 그 라인을 효과적으로 제거 할 수 있습니다.

+0

Earlz. 나는 그것이 규칙적인 수업이라고 생각했기 때문에 조금 혼란 스러웠습니다. 무엇이 잘못 되었습니까 ... 이제는 모든 것을 더 쉽게 코딩 할 수있는 NASM 펑키 모드라는 것을 알게되었습니다. – Pyjong

관련 문제