2012-01-03 4 views
0

어셈블리 프로그래밍을 배우면서 레지스트리에 몇 가지 문제가 발생했습니다. 예를 들어 나는이 건너 온 :어셈블리 언어 레지스터

이 코드가 3000에서 2 개 메모리 세그먼트의 합하게
mov ax, 3000 
mov ds, ax 
mov si, 200 
mov ax, [si] 
add si, 2 
add ax, [si] 
add si, 2 
mov [si], ax 
mov ax, 4c00 
int 21 

: (200) 3000 : (202)을 넣어 3000의 결과이다 : (202) 내가 DS 사이의 연결을 이해하지 못하는 왜냐하면 내가 왜 우리가 움직이는, 도끼를 설명 할 수 없기 때문이지? 그리고 나는 일반적으로 레지스터 간의 연결을 이해하지 못한다. ... 나는 그들이 무엇을지지 하는지를 안다.하지만 ... 어떤 도움이 매우 유용 할 지 모르겠다.

답변

1

Ds는 데이터 세그먼트 레지스터이다. 주소는 위에서 말한대로 ds 레지스터와 si 레지스터를 결합하여 구성됩니다. 8088/86 일 이전에이 경우 귀하의 주소 (ds < < 4) + si를 계산했을 것입니다. 당신이 할 수있는/할 수없는 일을 즉각적으로 수행 할 수있는 한계가 있기 때문입니다. 어쩌면 당신은 어차피 3000 번을 할 수 없습니다. 도끼가 중간 레지스터로 사용됩니다. 3000 번을 ds 레지스터에 연결하는 데 전혀 연결이 없습니다.

따라서 ds = 3000이고 si = 200이면 주소는 (3000 < < 4) +200입니다.

ds와 si 사이의 연결이 의미됩니다. SI 또는 DI를 사용하는 경우 인텔에서 프로그래머 참조 설명서를 보면 DS 세그먼트가 기본값입니다. CS : ES : SS는 SI의 대체 번호이지만 (DI는 사용할 수 없음) 다른 세그먼트 중 하나를 사용하려면 명령/어셈블리에서 대체 세그먼트를 지정해야합니다. 대체 세그먼트를 지정하는 방법은 어셈블러가 기대하는 구문에 따라 다릅니다.

0

즉,

즉치 값을 세그먼트 레지스터에 직접 할당 할 수 없습니다. 그게 일반 회계 국을 사용해서 그 일을하는 이유입니다.

mov ds, ax 

DS 및 SI 정보 DS : SI가 올바르게 작동한다고 가정하는 지침이 있지만 여기에는 해당되지 않습니다. DS가 기본 데이터 세그먼트이므로 DS:offset으로 가정합니다. 귀하의 경우 SI는 귀하의 상계입니다. SI를 다른 16 비트 레지스터 (예 : CX)로 변경하면 마찬가지로 작동합니다. 테스트를하고 피드백을 보내십시오 : P

3

DS는 모든 세그먼트 레지스터와 마찬가지로 16 진수 값은 64K 덩어리 메모리의 기본 주소를 나타냅니다.

명령어를 실행할 때 세그먼트 레지스터 (기본적으로 DS 레지스터는 데이터 용으로 사용됨)로 표시된 기본 주소를 가져 와서 상수 또는 레지스터로 지정된 오프셋 값을 추가하여 메모리 주소를 계산합니다.

따라서 mov ax, [si]mov ax, [ds:si]과 같으며 (레지스터 값 사용) mov ax, [3000:200]을 나타냅니다. 내부적으로 프로세서는 (3000 * 16) +200의 절대 메모리 주소를 계산하고 해당 메모리 위치의 데이터를 ax에 복사합니다. 결과를 추가하고 저장할 때 메모리 액세스에 대해 유사한 절차가 사용됩니다.

mov ds, 3000을 수행 할 수없는 이유는 단순히 세그먼트 레지스터로 이동하는 상수 값을 지원하지 않기로 결정했기 때문입니다. 인코딩 할 수있는 명령어가 없습니다. 대신 다른 레지스터 (코드에서 ax이 사용됨)를 통해 값을 전송해야합니다.

코드는 [3000 : 200] 및 [3000 : 202]에 값을 추가하지만 그 결과는 [3000 : 204] (3000이 아님)에 저장됩니다. : 202]).

DS (및 CS, ES, FS 및 GS)와 같은 세그먼트 레지스터에 저장된 값은 기본 주소를 직접 지정하지 않으므로 실제 기본 주소를 얻으려면 항상 16을 곱해야합니다.