我正在使用模拟器,它应模拟特定程序。我有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
答案 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