【问题标题】:Calculating Effective Address in Assembly在汇编中计算有效地址
【发布时间】:2014-03-24 13:24:16
【问题描述】:

我需要计算每一行的有效地址。我知道您将 DS 向左移动一次并添加偏移量,但是当您更改默认数据段时我感到困惑?对于第一行,我是否只添加 ES+DI 而不是使用 DS?

使用这些:Register Numbers 一个我知道是对的例子

IN    AL, 70H

OUT  DX,  AX

OUT    21H ,  AL

【问题讨论】:

  • 添加 ES:[DI],AL -> 地址 = (ES
  • 好的,所以我得到的答案是 3A000H?有没有办法将这些输入到模拟器中并检查我的答案?
  • 是的,通过观察地址 03a000h 的内存并查看它是否被该指令更改。

标签: assembly x86-16


【解决方案1】:

IN/OUT 不使用段寄存器,I/O 地址(端口号)在立即操作数中指定

IN  AL, 70H    ; Read one byte from I/O port 70H
OUT 21H, AL    ; Write one byte to I/O port 21H

或在 DX 寄存器中

OUT  DX,  AX   ; Write two bytes from AX to I/O port specified in DX

您为寄存器提供了以下值

哪个字节是低字节哪个是高字节并不明显(x86 使用 little-endian 字节顺序)。假设 DX 的值为 0022H,而 AX 的值为 2355H,那么

OUT  DX,  AX   ; Write 2355H (AX) to port 0022H (16-bit data bus)

http://en.wikipedia.org/wiki/Intel_8086

【讨论】:

  • 好的,我得到了确认,除了 OUT DX、AX 之外一切正常。它确实使用了这两个端口,但地址总线只识别一个端口 0022H。除此之外,这是一个很好的答案!
  • 啊,对,8086 有一个 16 位数据总线。我会修复答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 2017-03-27
  • 1970-01-01
  • 2016-09-07
  • 2014-12-27
  • 2020-02-19
  • 1970-01-01
相关资源
最近更新 更多