指针寄存器可以使用两次吗?

时间:2018-05-29 13:08:10

标签: assembly tasm

大家好我是大会新成员,我很难理解为什么下面的代码有效。我学到的是si保存数据段的地址,因为a和b位于数据段的不同位置,它不能用于它们两者,我将不得不使用di作为b。 但由于某种原因,下面的代码(将a的第一个char复制到b的第一个char)工作正常

.model  small
.stack  100H
.data
  a  db   '     This      is     a          test     $'
  b   db   100 dup('$')
.code
  mov si,0
  mov al,a[si]
  mov b[si],al
.exit
end

我的主要误解是[si]与b [si]和[si]之间的区别是什么 任何解释都将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

  

我学到的是si拥有数据段的地址

传统上。 SI表示“源索引”。但是,自保护模式以来,寻址模式已经大量放松,因此si可以用于更多。毕竟,这是一个通用的注册表。

  

我的主要误解是[si]与...之间的区别是什么   b [si]和[si] [...]

  • [si]获取si中的地址并引用该地址的数据。
  • a[si]si 加上地址常量a中的地址作为参考数据。
  • b[si]si 加上地址常量b中的地址作为参考数据。

该行

mov al, a[si]

a + si处的字节移动到al

mov b[si], al

al中的字节移动到b + si处的字节。这是一个传递性的操作链,因此a[si] = b[si]之后。