Assembly 将汇编指令更改为更详细的指令-我做得对吗?
给出了以下assember指令:Assembly 将汇编指令更改为更详细的指令-我做得对吗?,assembly,processor,instructions,addressing-mode,Assembly,Processor,Instructions,Addressing Mode,给出了以下assember指令: SUB[R1], 8[-R2] 本指令的计算形式为: op1 = op1 - op2 第一个操作数被寻址为“间接寄存器”。第二个是用预减量(n[-Rx])寻址的“寄存器索引” 我已将其改为: add #7, R2 sub [R1], [R2] sub #8, R2 我试着解释我为什么会这样: 8[-R2]也是这样写的:R2-1+8=R2+7,所以我在开头的R2中添加了7 下一行是明确的 最后一行我从R2中删除了8,因为它说的是“预减量” 我希望一切都好吗
SUB[R1], 8[-R2]
本指令的计算形式为:
op1 = op1 - op2
第一个操作数被寻址为“间接寄存器”。第二个是用预减量(n[-Rx]
)寻址的“寄存器索引”
我已将其改为:
add #7, R2
sub [R1], [R2]
sub #8, R2
我试着解释我为什么会这样:
8[-R2]
也是这样写的:R2-1+8=R2+7
,所以我在开头的R2
中添加了7
下一行是明确的
最后一行我从R2中删除了8,因为它说的是“预减量”
我希望一切都好吗?我希望我对我们个人的写作方式描述得足够好(我知道还有其他的写作方式,但我们使用这个…)
这不是家庭作业,我只是要求理解它,我把这个任务作为我自己的学习任务。我在你的定义中发现了几个问题 首先,指令具有
[-R2]
,因此该指令的计算形式必须包括该副作用:
op1 = op1 - op2
r2 = r2 - 1
您的说明中的另一个问题是,它没有明确定义尺寸。看起来你假设它是一个字节。您可能想看看68000处理器,它具有递增和递减以及定义良好的大小(与Intel处理器相反,Intel处理器具有许多隐含的大小)
例如,要在堆栈上保存D1,做一些工作,然后将值弹出回堆栈,.L定义大小(长,4字节):
在这种情况下,
SP
寄存器将递减4,然后再递增4,因为该指令正在处理一个长的寄存器。在你的情况下,我们真的不知道。这是什么指令集?我也不明白是什么意思?如果表示什么是#,则表示我们使用常量。在每次持续使用之前,我们都会写入#,那么#constant什么样的CPU应该能够执行您显示的指令?汇编语言不是一种单一的语言,有数百种,所以如果你不能告诉我们你使用的是哪种汇编语言,我们也帮不了你。如果有帮助的话,看起来你使用的汇编语言不是用于真正的CPU,而是用于教学目的的虚拟CPU。这里有问题吗?您似乎正在为自己的CPU创建自己的汇编语法。只有你才能知道这个程序集是否与你想象中的CPU能力相匹配。你所说的“隐含大小”是程序集语法设计的问题,而不是CPU设计的问题。如果您讨论的是和i.l#$ffff,d0
和与eax,0xffff
之间的区别,那么请注意AT&T语法(GNUas
)版本是和l$0xffff,%eax
(其中l
指定32位操作数大小)。当然,与32位模式具有相同机器代码格式的16位模式的存在确实意味着在机器代码/CPU设计意义上,x86中存在大量隐式大小的内容。ARM寻址模式很有趣,允许通过元素大小IIRC以外的值进行前/后递增/递减。(同样,在ARM模式下允许所有四种组合,IIRC。在thumb模式下仅允许post inc和pre dec,至少使用压缩编码。)例如,STR R2、[R4],#-16
在使用R4作为存储地址后不允许R4-=16
。
MOV.L D1, -(SP)
...
MOV.L (SP)+, D1