2012-09-14 2 views
0

을 이해했으며 플로피로 부팅 한 후 문자열을 표시하는 작은 코드 조각을 작성했습니다.어셈블러 - 일부 튜토리얼을 통해

내 문제는 지금, 일부 줄을 이해하지 못한다. 내가 도와 주면 좋겠다. 또는 바로 나에게 말해줘.

코드 :

mov ax, 07C0h 
add ax, 288   ; (512 + 4096)/16 = 288 
mov ss, ax 
mov sp, 4096 

mov ax, 07C0h 
mov ds, ax 
  1. 라인 : (? 내가이 변경 될 수 있습니다)
  2. 도끼 288 단락의 ADRESS 07C0h @ 프로그램을 시작
  3. 추가 공간? 내 프로그램 (변수와 물건을 저장하는 방법?)
  4. 가 시작 ADRESS
  5. 로 이동 4096 바이트
  6. 공간? 귀하의 도움에 감사드립니다.

+0

Google "dos bootstrap loader" –

답변

4
mov ax, 07C0h 
add ax, 288   ; (512 + 4096)/16 = 288 
mov ss, ax 

이것은 세그먼트 번호 07C0h + 부트 로더 (288)가 세그먼트 수 07C0h 시작시로드의 스택 세그먼트 (SS)의 시작을 둔다. 부트 로더의 크기는 512 바이트이고 각 세그먼트는 16 바이트입니다. 즉, 스택 세그먼트는 부트 로더가 끝난 후 4096 바이트를 시작합니다.

mov sp, 4096 

이이 스택의 상단이 4096 바이트 스택 세그먼트 (segment)의 과거 현재는 것을 의미 4096 스택 포인터를 설정합니다. 효과적으로 스택에 4096 바이트를 할당했습니다.

mov ax, 07C0h 
mov ds, ax 

데이터 세그먼트를 07C0h (부트 로더가 시작되는 세그먼트)로 설정합니다. 부트 로더의 뒷부분에서 데이터 레이블을 참조하면 데이터 세그먼트를 사용하므로 메모리에서 올바른 위치를 찾을 수 있도록 부트 로더가 데이터 세그먼트의 시작 부분에 있어야합니다.

+0

이 문서가 도움이되었다고 발견했습니다. http://duartes.org/gustavo/blog/post/how-computers-boot-up/ – Zack

3
mov ax, 07C0h // copy the address 07C0h into the register ax 
add ax, 288  // add the number 288 to the address in ax 
mov ss, ax  // copy the result to the stack segment register (07C0h + 288) 
mov sp, 4096 // set the stack pointer to 4096 

mov ax, 07C0h // copy the address 07C0h to ax again 
mov ds, ax  // copy the address 07c0h from ax into ds 

.. 그게 전부입니다.

+0

좋습니다. 감사합니다. – user1571682