2014-12-05 3 views
0

클래스 프로젝트를위한 플랫 어셈블러 내에서 링크 된 목록을 만드는 프로젝트를 맡았습니다. 거기에 단어를 동적으로 저장할 수 있어야합니다. 저는 막연하게 메모리 할당과 할당을 이해합니다. 필자가 이해할 수없는 것은이 할당을 링크 된 목록으로 바꾸거나 플랫 어셈블러 내부에서 링크 된 목록을 만드는 방법입니다. 나는 인터넷에서 노드와 메모리 세그먼트에 대해 이야기하는 많은 예제를 살펴 보았지만 실제로 이들이 어떻게 결합 될지 확신하지 못합니다. 플랫 어셈블러에서 링크드리스트를 실제로 만들 수있는 방법을 누군가가 설명 할 수 있다면 크게 감사하겠습니다. 미리 감사드립니다.링크 된 목록 설명 Flat Assembler Please?

+0

링크 된 목록을 알고 있습니까? – Tyler

+0

그리고 메모리 세그먼트는 16 비트에서만 관심사입니다. 16 비트를 사용하고 있습니까? (나는 정말로 중요하지 않다고 생각한다. 그러나 적어도 당신이 알아야 할 것이있다.) – Tyler

+0

필자는 Java와 같은 기본적인 것에서 Linked List를 이해한다. 나는 16 비트도 사용하고있다. – user2984232

답변

0

A (단독으로) 연결된 목록은 순서대로 서로를 가리키는 노드로 구성됩니다. 데이터를 보유하고 다른 노드를 가리키는 루트 노드가 있습니다. 루트 노드는 데이터를 보유하고 다른 노드를 가리키며 목록의 모든 데이터를 가리 킵니다.

일반적으로 목록과 상호 작용할 수있는 함수를 만들 수 있습니다. 그들은 목록을 직접 다루는 것을 추상화 할 것이다. 최소한, 작성, 삽입, 제거, 가져 오기 및 삭제 (전체 목록 삭제) 기능이 있습니다.

노드를 만드는 데 필요한 할당 크기를 알기 위해서는 포인터의 크기와 데이터 크기를 알아야합니다. 16 비트이므로 세그먼트 (2 바이트)와 오프셋 (2 바이트)이 필요합니다. 2 바이트의 데이터 (16 비트 정수)를 저장하기위한 노드는 다음 포인터를 먼저 배치 한 다음 데이터로 배치 할 수 있습니다. 따라서 레이아웃은 기본 = 세그먼트, 기본 + 2 = 오프셋, 기본 + 4 = 데이터입니다.

따라서 현재 노드에 대한 포인터가 es:ax 인 다음 노드에 대한 포인터에 액세스하려면 먼저 다음 세그먼트를 가져온 다음 오프셋을 가져옵니다.

mov fs, [es:ax] 
add ax, 2 
mov cx, [ds:ax] 
; fs:cs points to next node in list 

은 해당 노드에서 데이터를 얻으려면 fs:cx, 우리는 add cx, 4 다음 mov dx, [fs:cx]을 할 것입니다.

이제 이제 데이터를 가져 와서 다음 노드를 얻는 방법을 설명합니다. 그것들은 당신이 연결된 목록을 탐색하는데 필요한 빌딩 블록입니다.

새 목록을 할당하려면 첫 번째 노드 (16 비트 정수를 저장하는 경우 6 바이트)를 할당하고 해당 세그먼트에 0을 놓고 오프셋을 적용하여 데이터를 데이터 슬롯에 넣습니다. 따라서 노드 (방금 할당 한 6 바이트의 메모리)가 fs:cs에 있다고 가정 해보십시오.

mov [fs:cx], 0 
add cx, 2  ; assuming cx doesn't overflow... 
mov [fs:cx], 0 
add cx, 2 
mov [fs:cx], `data` 

새 노드를 추가하려면 끝 부분을 찾을 때까지 위에서 설명한대로 노드를 추가하면됩니다. 끝은 0 세그먼트와 오프셋이있는 노드입니다. 그런 다음 새 노드에 대해 6 바이트를 할당합니다. 포인터를 새 노드에 꼬리에 저장하십시오. 그런 다음 새 노드에 데이터를 저장하고 새 노드의 포인터를 0으로 만듭니다 (위 코드의 첫 번째 노드와 동일).

+0

나는 당신이 말하는 것을 이해하고 있다고 생각합니다. 이러한 연결된 목록 영역에 할당 된 메모리 블록을 넣으려면 어떻게해야합니까? 편집 : 나는 거의 말하지 않았다 : 매우 상세한 답변을 정말 고맙게 생각합니다. 정말 고마워요. – user2984232

+0

새로운 노드를 어떻게 할당 할 것인가, 아니면 어떻게 포인터의 링크 된 목록을 만드나요? 전자는 마지막 2 단락에서 설명되며 이후에는 노드 크기가 포인터 (즉, 4) x 2가 될 것입니다 (다음 및 데이터 포인터에 대한 포인터를 저장하기 때문에). – Tyler

+0

흠, 질문을 링크하는 것이 가장 좋을 수도 있습니다. 동적으로 할당 된 메모리 영역의 링크 된 목록을 만들 것입니다. 내가 많이 묻는 것을 알고있다.하지만 정확히 비슷한 것을 어떻게 할 수 있을까? – user2984232