我应该加载到数据段中?

时间:2017-12-24 21:55:07

标签: assembly emulation dos i386

我正在使用模拟器,它应模拟特定程序。我有COM文件和源文件。现在我需要模拟这个特定的指令(这是我在DosBox调试器中可以看到的):

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

我知道这意味着将DS(数据段)的值与偏移量017B一起移动到CL寄存器中。但DS应该是什么?

程序I尝试模拟(源文件):

.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

1 个答案:

答案 0 :(得分:2)

对于像你这样的.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