0

我有以下汇编程序:

装配程序

我的问题是:为什么地址值在每个进程中增加 3h,有时它只增加 1h,例如:

0010h 0011h 0012h 。. .

4

1 回答 1

5

因为在这种情况下(a)中的机器代码不是每条指令的固定字节数,它会根据指令本身而有所不同。您可以在操作码列中看到组成每条指令的字节。

at 指令0010占用三个字节,aa含义是将立即字节加载到寄存器中,00含义是寄存器r0,并02给出要加载的立即字节值。这很明显,因为在以下指令中aa使用相同的操作码加载。r1

0019将其与具有两个字节的指令进行对比d4 20。指令的长度决定了下一条指令的地址。

也许将其扩展可能有助于您的理解:

0010  AA  MAIN:  MVI R0, 2
0011  00
0012  02

0013  AA         MVI R1, -1
0014  10
0015  FF

0016
:

一条指令往往由一个操作码组成,该操作码控制要做什么,以及提供更细粒度的细节(操作数)的其他信息,这些信息可能提供诸如立即数据或寻址模式(立即数、内存、索引、I/ O 端口,按比例缩放和许多其他可能性)。例如,从您的示例中可以明显看出,aa加载寄存器立即操作码的工作方式如下:

aa x0 yy    ; rx <- yy
|| |  ||
|| |  ++--> immediate byte to load in to register
|| +------> register to receive byte
++--------> fixed opcode aa

同样,addat 的指令001e指示如何将两个寄存器相加:

b2 xy       ; rx <- rx + ry
|| ||
|| |+-----> register to add to rx
|| +------> register to receive sum (rx)
++--------> fixed opcode b2

操作码/操作数二分法的最后一个示例是跳转指令(实际上它们都是jmpjnz)——它有一个控制操作码,接下来的两个字节指定要跳转到的绝对地址(以小端格式)。


(a)当然,有些架构的指令固定长度的,例如在某些 RISC CPU 上,固定长度(以及指令中字段的固定位置)使指令解码更简单(因此,希望更快)。

但是,您问题中的特定架构不是其中之一。

于 2013-07-17T00:39:30.277 回答