Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 使用数据段时使用字节PTR确定地址大小_Pointers_Assembly_X86_Bootloader_Mbr - Fatal编程技术网

Pointers 使用数据段时使用字节PTR确定地址大小

Pointers 使用数据段时使用字节PTR确定地址大小,pointers,assembly,x86,bootloader,mbr,Pointers,Assembly,X86,Bootloader,Mbr,我试图找出一个MBR代码(实模式下的16位汇编代码),我有以下几行代码: mov si,0x7cd8 lods al,BYTE PTR ds:[si] 实时发生的情况是,物理地址是“D8”-我怎么知道?因为这用于加载字符串并将其打印到字符串。这是我运行这个程序时看到的第一件事,这是代码的第一行 我的问题是关于第二行,是因为我得到的物理地址是为了得到物理地址(段*16+偏移量)而进行的计算,还是字节PTR告诉我们SI地址的类型是字节,我们将读取的数据的类型是字节?第二行 lods

我试图找出一个MBR代码(实模式下的16位汇编代码),我有以下几行代码:

mov    si,0x7cd8
lods   al,BYTE PTR ds:[si]
实时发生的情况是,物理地址是“D8”-我怎么知道?因为这用于加载字符串并将其打印到字符串。这是我运行这个程序时看到的第一件事,这是代码的第一行

我的问题是关于第二行,是因为我得到的物理地址是为了得到物理地址(段*16+偏移量)而进行的计算,还是字节PTR告诉我们SI地址的类型是字节,我们将读取的数据的类型是字节?

第二行

lods   al,BYTE PTR ds:[si]
只是指令
LODSB
的反汇编输出(从地址
DS:SI
INC-SI
加载一个字节)

在汇编程序中,您可以简单地编写
LODSB
,这意味着

从地址DS:SI加载一个字节到字节寄存器AL,然后递增SI

关于
DS
的段问题:当然,访问的地址是通过公式
(段*16+偏移量)
计算的,但是您可以将
DS
设置为您想要的任何值,并且指令只会增加
SI
(后期读取)


DS
可以有任何值。

类型无关紧要,这是因为
段*16+偏移量
。物理地址是
0x7cd8
ds=0
,否则它将无法工作;)只有在目标大小不明显时才需要
字节PTR
。而您的
lods…
通常写为
lodsb
。最后,
ds
lodsxx
的默认段寄存器,因此不需要段重写。我现在明白了。关于DS,所有程序都没有手动更改,它将始终保持0(默认)?@sitoNz:我(认真地)不知道。在执行这两行之前,
DS
的值肯定会在某个地方定义。假设默认值在MBR中是(非常)糟糕的做法。