2012-12-31 5 views
1

다음 코드에서는 두 개의 상위 바이트에 ebx의 하위 2 바이트를 "저장"한 다음 더 낮은 순서 bx를 임시 변수로 사용하여 오프셋에 액세스합니다 "풀". 마지막으로 데이터를 오른쪽으로 이동하여 원래의 값 (처음에는 하위 2 바이트 만 사용)을 복원합니다. `에 대해 R_386_16 .DATA '16 비트 레지스터를 오프셋으로 사용하여 유효 주소 계산

연결 :

rol ebx, 16 

mov bl, dl 
;(other operations involving bx)  
mov [pool+bx], dword esi 

shr ebx, 16 

이 그러나 나는

재배치 맞게 잘립니다 오류, NASM과 잘 조립. 이 오류를 우회하는 방법에 대한 조언이 있으십니까? 문자 그대로 모든 레지스터가 esp를 저장하고 세그먼트 레지스터가 사용되고 있기 때문에 단순히 다른 레지스터를 사용하는 것은 옵션이 아닙니다.

편집 : BX는 다음 테이블 MOV [수영장 + EBX, ESI에 대한 인덱스로 사용, 나는 누군가가 묻습니다 가정, 그래서 32 비트 어셈블리를

답변

2

실제 주소에서 bx을 사용했기 때문에 어셈블러는 16 비트 주소를 원한다고 생각하여 링커가 불만족스러운 16 비트 재배치를 생성했습니다. 어쨌든 변수가 주소 공간의 맨 아래 64k에있을 가능성이 없으므로 아마 32 비트 모드에서는 작동하지 않을 것입니다.

당신이 어떤 무료로 등록 할 수없는 경우, 아마 당신은 스택을 사용할 수 있습니다

push ebx 
mov bl, dl 
;(other operations involving bx) 
movzx ebx, bx 
mov [pool+ebx], esi 
pop ebx 

당신은 ebx의 하위 16 비트가 사용되었다 말했다. 그뿐만 아니라 edx의 경우라면, 당신은 다음과 같은 ebx의 상위 16 비트에 dx을 저장할 수 있습니다

shl ebx, 16 
mov bx, dx 
;(other operations involving dx) 
movzx edx, dx 
mov [pool+edx], esi 
mov dx, bx 
shr ebx, 16 

아니, 당신은 세그먼트 레지스터에 임의의 값을 저장할 수 없습니다.

0

자르기 BX와 movzx EBX을 사용하고 있습니다 :)

+0

슬프게도 데이터를 ebx의 상위 2 바이트로 유지해야하므로 잘라내 기가 실제로 작동하지 않습니다. 사용하지 않는 세그먼트 레지스터에 풀로 오프셋을 오프로드 할 수 있다면 어떤 아이디어가 있습니까? – Precursor