汇编中的地址值

Was*_*our 0 assembly memory-address

我有以下汇编程序:

组装程序

我的问题是:为什么地址值在每个过程中都增加3h,有时却仅增加1h,例如:

0010h 0011h 0012h。。。

pax*_*blo 5

由于在这种情况下(a)的机器码不是每个指令的固定字节数,因此它取决于指令本身。您可以在操作码列中看到组成每个指令的字节。

处的指令0010占用3个字节,其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
:
Run Code Online (Sandbox Code Playgroud)

一条指令通常由一个控制操作的操作码以及其他给出更细粒度细节(操作数)的信息组成,这些细节可以提供诸如立即数据或寻址模式(立即数,内存,索引,I / O个端口(可扩展)以及其他各种可能性。例如,从您的示例中aa可以明显看出,加载寄存器立即操作码的工作方式如下:

aa x0 yy    ; rx <- yy
|| |  ||
|| |  ++--> immediate byte to load in to register
|| +------> register to receive byte
++--------> fixed opcode aa
Run Code Online (Sandbox Code Playgroud)

同样,处的add指令001e指示如何将两个寄存器加在一起:

b2 xy       ; rx <- rx + ry
|| ||
|| |+-----> register to add to rx
|| +------> register to receive sum (rx)
++--------> fixed opcode b2
Run Code Online (Sandbox Code Playgroud)

操作码/操作数二分法的最后一个示例是跳转指令(实际上是它们jmpjnz)-它具有控制操作码,其后两个字节指定了要跳转到的绝对地址(little-endian格式)。


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

但是,您所提出的特定体系结构不是其中之一。