使用Data Segment时使用BYTE PTR确定地址大小
Using BYTE PTR to determine the address size when using Data Segment
我正在尝试找出 MBR 代码(实模式下的 16 位汇编代码)并且我有这些行:
mov si,0x7cd8
lods al,BYTE PTR ds:[si]
实时发生的事情是,物理地址是 'D8' - 我怎么知道的?因为这是用于加载字符串并将其打印到字符串中。这是我在 运行 这个程序时看到的第一件事,这些是代码的第一行。
我的问题是关于第二行,我得到的物理地址是因为计算得到物理地址(段 * 16 + 偏移量)还是 BYTE PTR 告诉 SI 地址将是 BYTE 类型,我们将读取的数据类型是 byte ?
第二行
lods al,BYTE PTR ds:[si]
只是指令 LODSB
的反汇编程序输出(从地址 DS:SI
和 INC SI
加载一个字节)。
在汇编程序中你可以简单地写成 LODSB
这意味着
load a byte from the address DS:SI to the byte register AL and increment SI afterwards
关于DS
的段问题:访问地址当然是通过公式(segment * 16 + offset)
计算出来的,但是DS
可以任意设置,[=31=尽管如此,仅 SI
被指令递增(post-读取)。
DS
可以是任意值。
我正在尝试找出 MBR 代码(实模式下的 16 位汇编代码)并且我有这些行:
mov si,0x7cd8
lods al,BYTE PTR ds:[si]
实时发生的事情是,物理地址是 'D8' - 我怎么知道的?因为这是用于加载字符串并将其打印到字符串中。这是我在 运行 这个程序时看到的第一件事,这些是代码的第一行。
我的问题是关于第二行,我得到的物理地址是因为计算得到物理地址(段 * 16 + 偏移量)还是 BYTE PTR 告诉 SI 地址将是 BYTE 类型,我们将读取的数据类型是 byte ?
第二行
lods al,BYTE PTR ds:[si]
只是指令 LODSB
的反汇编程序输出(从地址 DS:SI
和 INC SI
加载一个字节)。
在汇编程序中你可以简单地写成 LODSB
这意味着
load a byte from the address DS:SI to the byte register AL and increment SI afterwards
关于DS
的段问题:访问地址当然是通过公式(segment * 16 + offset)
计算出来的,但是DS
可以任意设置,[=31=尽管如此,仅 SI
被指令递增(post-读取)。
DS
可以是任意值。