我創建了一個兩級引導加載程序,第二個階段使用了13h(320x200)視頻模式。我決定開始編寫一個簡單的函數來將雙緩衝區複製到視頻內存,問題似乎沒有被複制,代碼:程序集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
此代碼應填寫第一個400個字節的視頻內存的紅色,但沒有happens.Although下面的代碼做這項工作(但我需要存儲器到存儲器)
mov ax, 0xa000
mov es, ax
mov al, 5
mov cx, 400
cld
rep stosb
爲什麼第一個代碼段不起作用?
在此先感謝
編輯2:移動直接對和迪:
xor ax, ax
mov es, ax
mov ds, ax
mov di, 0xa000
mov si, foo
mov cx, 400
cld
rep movsb
你的意思是使用'mov ax,seg foo'? – Michael
@邁克爾我不明白你的意思! – Mateus
您目前正在執行'mov ax,foo' /'mov ds,ax',這會將'foo'的_offset_放入'ds'中。對我來說,就像你想要'foo'的_segment_一樣。因此建議使用'seg foo'。 – Michael