我刚开始学习一点汇编语言,有点卡壳了。假设我把两个值放入寄存器A和B,如下所示:
MOV A, 45d MOV B, 127d
我尝试做的是减去这些值,并将结果放入寄存器C。我尝试执行以下操作:
diff: SUB B, A MOV C, diff
我知道SUB将获取操作的结果并将其放入目的地(B),但我不知道如何将其移入寄存器C。编辑:我想我已经明白了。我继续做了以下工作:
MOV A, 26d MOV B, 193d MOV C, B SUB C, A
envsm3lx1#
3操作数伊萨(如RISC-V或AArch 64)可以非破坏性地执行sub dst, src1, src2操作。例如sub x1, x2, x3碰巧对两个ISA都有效,因为它们都具有寄存器x0..31。双操作数伊萨可以使用mov dst, src1/sub dst, src2模拟此操作。对于任何其它双输入操作也是如此,您希望在不修改任一输入的情况下将结果存入第三个寄存器。一些ISA可能对哪些指令可以使用哪些寄存器有限制,例如386之前的x86只能使用multiply two registers,如果其中一个是累加器,并且目的地隐含地是DX:AX(16 x16 =〉32位)或AX(8x8 =〉16位)。但是如果你有一个简单的正交2操作数ISA,每个指令可以使用任意两个寄存器,这就不是问题。diff: SUB B, A/MOV C, diff会将该标签的地址加载到C中,或者从该地址加载机器码字节。当然不会从B寄存器复制减法结果。
sub dst, src1, src2
sub x1, x2, x3
mov dst, src1
sub dst, src2
diff: SUB B, A
MOV C, diff
B
1条答案
按热度按时间envsm3lx1#
3操作数伊萨(如RISC-V或AArch 64)可以非破坏性地执行
sub dst, src1, src2
操作。例如
sub x1, x2, x3
碰巧对两个ISA都有效,因为它们都具有寄存器x0..31。双操作数伊萨可以使用
mov dst, src1
/sub dst, src2
模拟此操作。对于任何其它双输入操作也是如此,您希望在不修改任一输入的情况下将结果存入第三个寄存器。一些ISA可能对哪些指令可以使用哪些寄存器有限制,例如386之前的x86只能使用multiply two registers,如果其中一个是累加器,并且目的地隐含地是DX:AX(16 x16 =〉32位)或AX(8x8 =〉16位)。但是如果你有一个简单的正交2操作数ISA,每个指令可以使用任意两个寄存器,这就不是问题。
diff: SUB B, A
/MOV C, diff
会将该标签的地址加载到C中,或者从该地址加载机器码字节。当然不会从B
寄存器复制减法结果。