[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 叁

注意:本文经过原作者授权转译,转载请标明出处

原文地址:http://mrjester.hapisan.com/04_MC68/Sect03Part04/Index.html

条件允许建议阅读原文,网上非中文资料还是较多,当作锻炼英文岂不美哉
翻译若有不足之处欢迎批评指正

译文:

"不合逻辑的事不一定是错的,合逻辑的也不一定就对" ---- 里昂 福伊希特万格 (Lion Feuchtwanger, 1884-1958),德国作家

简介

EOR (异或) - 逻辑异或

这条指令会把源操作数目的操作数执行逻辑异或,然后把结果存到目的操作数中,关于逻辑异或:

源操作数 目的操作数 结果
0 0 0
0 1 1
1 0 1
1 1 0

由上表可以看出只有当两个操作数其中仅有一个是1的时候,结果就是1。为了更好地理解为什么这个操作叫做EOR (异或),我们可以假想0false (假),而1true (真),再来康康这个表:

源操作数 目的操作数 结果
False False False
False True True
True False True
True True False

由上表可以看出,只有当源操作数 目的操作数 其中只有一个是时,结果就是,这就是EOR (异或) 这个名字的由来 (在C 风格编程语言(如C,C++,Java, Golang等等)中,一般用||表示逻辑异或,用|表示位运算的异或)

在其他的汇编语言中,一般使用的是XOR,但是在 m68k 汇编中,使用的是EOR,事实上它们是一个意思

例子:

开门见山,来康下面这个例子:(假设d0中的初始值是01234567)

    eori.b     #$E2, d0

这条指令会把字节E2d0中的67做或运算,因为这是二进制位指令,所以E267的二进制分别是1110 00100110 0111,于是:

    E2 EOR 67 = 85
     1 EOR  0 =  1
     1 EOR  1 =  0
     1 EOR  1 =  0
     0 EOR  0 =  0
     0 EOR  0 =  0
     0 EOR  1 =  1
     1 EOR  1 =  0
     0 EOR  1 =  1

正如你所见,只有当位运算的两个输入值都是1的时候结果才是1,所以:

    E2 EOR 67 = 85

然后,85就会被保存到d0里,所以d0现在的内容是01234585

当然,你也可以把两个寄存器拿来EOR

    eor.w      d0, d1

你也可以在内存上使用EOR

    eori.w     #$07FF, $00004000
    eor.w      d0, $00004000

同样的,你也可以通过地址寄存器来间接地用在内存中:

    eori.w     #$07FF, (a1)
    eor.w      d0, (a3)

对于EOR来说,它的源操作数不可以是内存地址,或是使用地址寄存器表示的内存地址:

    eor.w      $00020000, d0    
    eor.b      (a0), d0         

当然,你也不能EOR直接用在地址寄存器上:

    eori.w     #$3F10, a0       

注意,此处与ANDOR略有区别

异或 立即数

你可能记得addsub指令都有这个,如果源操作数立即数,你必须使用eori指令,而不是eor指令 (其中i表示立即数)

    eori.w     #$003F, d0

同样的汇编程序在汇编代码的时候会自动把需要用到eori的地方的eor修改为正确的写法

目录
上一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 叁 - 位 指令 | 3. OR 指令
下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 叁 - 位 指令 | 5. BSET, BCLR 和 BCHG 指令

原文地址:https://www.cnblogs.com/strawhatboy/p/12340370.html