Что я должен загрузить в сегмент данных?

Я работаю над эмулятором, который должен эмулировать конкретную программу. У меня есть COM-файл и исходный файл. Теперь мне нужно эмулировать эту конкретную инструкцию (это то, что я вижу в отладчике DosBox):

mov cl, [017B]        8A 0E 7B 01

Я знаю, что это означает переместить значение из DS (сегмент данных) со смещением 017B в регистр CL. Но что должно быть в DS?

Программа, которую я пытаюсь эмулировать (исходный файл):

.386p

.model tiny

code    segment use16
    assume cs:code
    org  100h

begin:
  mov ax, 3h
  int 10h
...
  mov cl, byte ptr ds:[keylen]   <-- This is the instruction I'm talking about
...
  int 20h           

keylen db 13
key1 db 20h, 3ah, 23h, 32h, 0bh, 3dh, 1fh, 13h, 4ch, 19h, 05h, 07h, 07h, 00h
key2 db 00h, 0ah, 11h, 08h, 03h, 1dh, 1ah, 08h, 04h, 2ch, 3fh, 33h, 1ah, 41h
key3 db 01h, 00h, 08h, 0bh, 0ch, 07h, 0ah, 05h, 02h, 09h, 06h, 03h, 04h, 00h

code    ends
end begin

Что я должен сохранить в DS при запуске программы? Единственное, что я сейчас делаю, это устанавливаю DS = CS = ES = SS = SPECIFIC_ADDRESS


person Sk1X1    schedule 24.12.2017    source источник
comment
С программой COM (маленькая модель с размером 100h`) CS=DS=ES=SS=сегмент PSP, который вы используете для программы, прежде чем передать ей управление. Это относится только к COM (не EXE)   -  person Michael Petch    schedule 25.12.2017
comment
Это может быть вам полезно: fysnet.net/yourhelp.htm (плюс, возможно, PSP структура, если код извлекает что-то из диапазона cs:0000-cs:00FF).   -  person Ped7g    schedule 25.12.2017
comment
@MichaelPetch Я знаю, это программа COM   -  person Sk1X1    schedule 25.12.2017


Ответы (1)


Для программы .COM, подобной той, что у вас есть, нет необходимости самостоятельно настраивать какие-либо регистры сегментов. Загрузчик программ операционной системы уже установил их все, указывая на начало вашей программы.

Инструкция mov cl, byte ptr ds:[keylen] будет работать как есть.
Вам даже не нужно явно указывать сегмент. Вы также можете написать mov cl, byte ptr [keylen] или даже mov cl, [keylen].

Теперь, если вы настаиваете на настройке сегментного регистра DS вручную, вы можете написать:

mov ax, cs
mov ds, ax

Другой способ:

mov ah, 62h   ;DOS.GetPSP
int 21h       ; -> BX
mov ds, bx
person Sep Roland    schedule 07.01.2018
comment
Спасибо за ответ. Я не уверен, что вы поняли смысл моего вопроса. Я пытаюсь эмулировать эту программу, и я знаю, куда я должен указать DS. Но я не знаю, что должно быть во всем разделе данных. - person Sk1X1; 11.01.2018