Pointers 使用数据段时使用字节PTR确定地址大小
我试图找出一个MBR代码(实模式下的16位汇编代码),我有以下几行代码: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
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中是(非常)糟糕的做法。