Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 即时和程序计数器相对寻址_Assembly_Sic - Fatal编程技术网

Assembly 即时和程序计数器相对寻址

Assembly 即时和程序计数器相对寻址,assembly,sic,Assembly,Sic,我偶然发现了一个sic/xe机器的代码……下面是我遇到问题的原因 0003 LDB #LENGTH ;a 0020 LDA #3 ;b 0033 LENGTH RESW 1 ;c 103C +LDT #4096 ;d 现在给出了“a”将有一个目标代码,其中将使用pc相对模式和即时模式……但b将只有即时模式……既然长度为0033,那么为什么要使用pc相对模式……如果按照惯例必须使用pc相对模式,那么为什么不在

我偶然发现了一个sic/xe机器的代码……下面是我遇到问题的原因

0003         LDB  #LENGTH  ;a
0020         LDA  #3       ;b
0033 LENGTH  RESW 1        ;c
103C        +LDT  #4096    ;d

现在给出了“a”将有一个目标代码,其中将使用pc相对模式和即时模式……但b将只有即时模式……既然长度为0033,那么为什么要使用pc相对模式……如果按照惯例必须使用pc相对模式,那么为什么不在“b”中同时使用pc相对模式和即时模式呢?

对不起,但这并不是我所期望的问题

首先,您的“代码行”完全脱离上下文,因为第一列指示位置,所以我们缺少中间的所有位置。一减一

其次,请用适当的标签注明这是家庭作业。一减一

第三,请包括对原始来源的引用,如。20减

你觉得自己很幸运,因为我只能减去一

总而言之,我不是坏人,以下是我的答案:

长度是属于保留3字节字的地址0033的标签,位于当前PC位置附近。由于汇编程序在其决策中是自主的,由于PC相对优先,并且由于2047 max的偏移量是足够的,所以汇编程序采用PC相对。如果您查看PPT I链接中的操作码,您将看到PC相对(p=1)偏移量为2D(十六进制),LDB指令后的位置为6,2D+6=33(全部十六进制),QED

同样意义上的“b”:由于b=0和p=0,我们使用即时寻址,并且操作码的“地址”为3,因此A加载常量3


只有操作码中的加号表示format4使用4字节指令和20位地址字段。当需要更改机器码在内存中的位置时,使用与程序计数器相关的地址。这通常是垃圾收集所必需的。见Andrew W.Appel第13.3章;继续编辑;剑桥大学出版社,2007。

对不起,我听不懂你的问题。你能澄清一下吗?(看起来a确实与PC无关,但我不知道这种特殊的架构。)@david我读过(我指的是leland l beck关于系统软件的书)在sic/xe结构中,地址是pc相对的,如果超出范围,则是基相对的……所以我非常确信会是这种情况,但后来我发现对于“b”,只使用了立即模式(虽然pc模式可行,但不使用)…然后在下一段中,书中陈述了“a”的情况,但没有给出任何理由。您是在谈论压缩/垃圾收集JIT代码块+静态数据吗?这段代码是用asm源代码编写的,所以它是提前编译的,实际上可以是静态的,不需要更多。PC相对寻址的另一个主要原因是,相对于地址空间的大小,当数据接近代码时,它比绝对寻址更紧凑。(例如,x86-64与64位地址空间中的32位PC相对。)