2014-05-09 2 views
0

두 번째 단계는 13h (320x200) 비디오 모드를 사용하는 2 단계 부트 로더를 만듭니다. 이중 버퍼를 비디오 메모리에 복사하는 간단한 기능을 시작하기로 결정했지만 문제는 없습니다. 복사, 코드 수 : (하지만 난 메모리에 메모리를 필요로) 다음 코드는 일을 happens.Although이 코드는 빨간색으로 비디오 메모리의 첫 번째 400 바이트를 작성해야Assembly x86 movsb

org 0x7E00 
xor ax, ax 
mov ds, ax 

jmp begin 

foo: times 400 db 5 

govideo: 
mov ah, 0 
mov al, 13h 
int 10h 
ret 

begin: 
call govideo 

mov ax, 0xa000 ; video memory address 
mov es, ax  ; es,address to receive 
mov di, 0x0 ; no offset 
mov ax, foo ; foo,the test double buffer,all bytes initialized with 5(red color) 
mov ds, ax  ; ds,address to copy 
mov si, 0x0 ; no offset 
mov cx, 400 ; all foo 400 bytes 
cld   ; clear direction flag,so es and ds get incremented 
rep movsb  ; copy all 400 bytes 

terminate: 
times 510-($-$$) db 0 

, 아무것도하지만,

mov ax, 0xa000 
mov es, ax 
mov al, 5 
mov cx, 400 
cld 
rep stosb 

첫 번째 스 니펫이 작동하지 않는 이유는 무엇입니까? 사전

편집 2

감사 : 직접 Si 및 디하기 위해 이동 : 당신은 세그먼트 레지스터에 직접 foo는의 주소를 이동하는

xor ax, ax 
mov es, ax 
mov ds, ax 

mov di, 0xa000 
mov si, foo 

mov cx, 400 
cld 
rep movsb 
+1

'mov ax, seg foo'를 사용하셨습니까? – Michael

+0

@ 마이클 나는 당신이 의미하는 것을 이해하지 못했습니다! – Mateus

+1

현재'mov ax, foo' /'mov ds, ax'를하고 있는데'ds'에'foo'의 _offset을 넣을 것입니다. 'foo'의 _segment_를 원한다고 생각합니다. 그러므로'seg foo '를 사용하라는 제안. – Michael

답변

1

. 아시다시피 세그먼트 레지스터는 오프셋에 추가 된 20 비트 주소를 저장하는 데 사용됩니다. 귀하의 경우 foo의 주소는 0x7E06과 같습니다. 이것을 세그먼트 레지스터로 옮기고 오프셋을 제로화하면 주소 0x7E06 < < 4 + 0 = 0x7E060이됩니다.

mov ax, seg foo 
mov ds, ax 

또는 대안 :

mov ax, foo 
shr ax, 4 
mov ds, ax 

참고도 주소가있는 경우 그에 따라 인덱스 레지스터를 조정해야 마이클 의견에서 지적한대로 seg을 사용할 수 있습니다이 경우를 들어

16의 배수가 아닙니다.

+0

감사합니다! 레지스터를 바꾸는 것이 SEG 방법을 시도했을 때 '이진 ​​출력 형식이 세그먼트 기본 참조를 지원하지 않습니다.' – Mateus

+0

주소를 옮겨 보았습니다. foo가 SI에 직접적으로 전송되었지만 작동하지 않았습니다. foo 주소가 16 비트 (예 : 0x7E06)로 표시 될 수 있다는 것을 고려하면 작동하지 않아야합니까? – Mateus

+0

세그먼트 레지스터를 지우면 SI로 직접 이동해야합니다. SEG가 작동하지 않는다면'mov ax, foo >> 4'를 시도해 볼 수도 있습니다. –

관련 문제