【问题标题】:Using BYTE PTR to determine the address size when using Data Segment使用数据段时使用 BYTE PTR 确定地址大小
【发布时间】:2016-11-28 20:40:54
【问题描述】:

我正在尝试找出一个 MBR 代码(实模式下的 16 位汇编代码),我有这些行:

mov    si,0x7cd8
lods   al,BYTE PTR ds:[si]

实时发生的事情是物理地址是“D8” - 我怎么知道?因为这用于加载字符串并将其打印到字符串。这是我运行这个程序时看到的第一件事,这些是代码的第一行。

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

【问题讨论】:

  • 类型无所谓,因为segment*16+offset。物理地址是0x7cd8ds=0,否则它不起作用;)
  • BYTE PTR 仅在目标大小不明显时才需要。而你的lods ... 通常写成lodsb。最后,ds 无论如何都是lodsxx 的默认段寄存器,所以段覆盖是不必要的。

标签: pointers assembly x86 bootloader mbr


【解决方案1】:

第二行

lods   al,BYTE PTR ds:[si]

只是指令LODSB的反汇编输出(从地址DS:SIINC SI加载一个字节)。

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

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

关于DS的段问题:当然访问地址是由公式(segment * 16 + offset)计算的,但你可以将DS设置为任何你想要的,只有SI是尽管如此,还是由指令递增(读取后)。

DS 可以有任何值。

【讨论】:

  • 我现在明白了。关于 DS 没有通过所有程序手动更改,它将始终保持 0(默认)?
  • @sitoNz:我(说真的)不知道。 DS 的值肯定会在这两行执行之前在某处定义。假设默认值在 MBR 中是(非常)不好的做法。
猜你喜欢
  • 1970-01-01
  • 2015-08-07
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 2010-09-21
  • 2019-06-12
相关资源
最近更新 更多