movsb

Тема в разделе "WASM.BEGINNERS", создана пользователем GLEB, 9 фев 2009.

  1. GLEB

    GLEB New Member

    Публикаций:
    0
    mov si, p
    mov di, 07C00h
    mov cx,512
    rep movsb

    код копирует 512 байт с адреса переменной p по адресу 07C0h:0000h (0000h:07C00h)

    а как скопировать по адресу 2000h:0000h ?
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    эм... тебе вроде бы в сторону сегментных регистров копать надо
     
  3. GLEB

    GLEB New Member

    Публикаций:
    0
    ну а можно пример
     
  4. censored

    censored New Member

    Публикаций:
    0
    Код (Text):
    1. push 2000h
    2. pop es
    3. xor di, di
    4. rep movsb
     
  5. Noga

    Noga New Member

    Публикаций:
    0
    -- del --
     
  6. GLEB

    GLEB New Member

    Публикаций:
    0
    censored

    не работает ((

    push 07C0h
    pop es
    xor di, di
    mov cx,512
    rep movsb
     
  7. censored

    censored New Member

    Публикаций:
    0
    А должно?
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    а в si положить p и отрегулировать адрес в ds (push adr/pop ds)
     
  9. GLEB

    GLEB New Member

    Публикаций:
    0
    censored
    >А должно?
    я имел ввиду не работает аналогично

    mov di, 07C00h
    mov cx,512
    rep movsb
     
  10. max7C4

    max7C4 New Member

    Публикаций:
    0
    а симптомы какие. экстросенсов и правидцев до пятницы не будет!
     
  11. Freeman

    Freeman New Member

    Публикаций:
    0
    а тут es куда показывает?

    вообще rep movsb производит пересылку cx байтов из буфера на который указывает ds:si в буфер, на который указывает es:di
    тоесть если надо переслать 10 байт из памяти по адресу 1000:1000 в память по адресу 500:500, то достаточно сделать
    Код (Text):
    1. mov cx,10
    2. push 1000h
    3. push 500h
    4. pop es
    5. pop ds
    6. mov di,500h
    7. mov si,1000h
    8. rep movsb
     
  12. GLEB

    GLEB New Member

    Публикаций:
    0
    в общем задача такая, ну что из буфера скопировать код в произвольный участок памяти и передать на него управление

    вот что вышло

    Код (Text):
    1. org 100h
    2. use16
    3.  
    4. jmp start
    5.  
    6. BootSector file '1.bin'
    7.  
    8. start:
    9.  
    10. cli
    11.  
    12. mov si, BootSector
    13. mov di, 7c00h
    14. mov cx, 512
    15. rep movsb
    16.  
    17. sti
    18.  
    19. jmp 7C00h
    этот код работает, но тут надо указываются физические адреса, а мне нужно указывать в формате сегмент:смещение, так как например адрес 2000h:0000h = 20000h а это уже за пределами размера регистра
     
  13. GLEB

    GLEB New Member

    Публикаций:
    0
    Или этот код вообще копируется и выполняется в пределах текущего сегмента программы? )))))))

    Блин чувствую чушь написал какую-то )))))
     
  14. MSoft

    MSoft New Member

    Публикаций:
    0
    друг, ну тебе уже показали, что надо изменить сегментные регистры. Даже показали как. Что тебе еще мешает вставить показанный код себе? Религия не позволяет?
     
  15. murder

    murder Member

    Публикаций:
    0
    можно еще и в памяти адрес хранить, а загружать так
    Код (Text):
    1. lds si,[Source]
    2. les di,[Destination]
     
  16. GLEB

    GLEB New Member

    Публикаций:
    0
    вроде разобрался, только вот скажите, почему jmp 0:07C00h и jmp 07C0h:0 прыгают не в одно и тоже место?

    правка.

    опс, извиняюсь, все работает, просто org 7c00h стояло
     
  17. murder

    murder Member

    Публикаций:
    0
    Адрес кажется расчитывается так: (seg shl 4)+ofs