我有以下汇编程序:
我的问题是:为什么地址值在每个进程中增加 3h,有时它只增加 1h,例如:
0010h 0011h 0012h 。. .
因为在这种情况下(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
同样,add
at 的指令001e
指示如何将两个寄存器相加:
b2 xy ; rx <- rx + ry
|| ||
|| |+-----> register to add to rx
|| +------> register to receive sum (rx)
++--------> fixed opcode b2
操作码/操作数二分法的最后一个示例是跳转指令(实际上它们都是jmp
和jnz
)——它有一个控制操作码,接下来的两个字节指定要跳转到的绝对地址(以小端格式)。
(a)当然,有些架构的指令是固定长度的,例如在某些 RISC CPU 上,固定长度(以及指令中字段的固定位置)使指令解码更简单(因此,希望更快)。
但是,您问题中的特定架构不是其中之一。