注意:本文经过原作者授权转译,转载请标明出处
原文地址:http://mrjester.hapisan.com/04_MC68/Sect03Part01/Index.html
条件允许建议阅读原文,网上非中文资料还是较多,当作锻炼英文岂不美哉
翻译若有不足之处欢迎批评指正
译文:
"我认为自动演奏钢琴是电脑爸爸的爸爸,是我们如今全部梦魇的祖先,是黑白分明无所逃避的二进制世界的开端" ---- 威廉 盖迪斯 (William Gaddis, 1922-1998),美国最重要的后现代主义作家之一
简介
NOT (非) - 逻辑互补数
这条指令能够把目的操作数里的每一位都翻转。原本是 0 的位会变成 1,原本是 1 的位会变成 0
例子
在 第一章第一节 我们提到的第一件事就是二进制和数据长度,你应该知道,一个位有两种状态: 0 和 1,这条指令的目的就是把所有的位都设置为其相反的值,就是翻转了结果
比如:
not.b d0
目的操作数是d0,比如现在d0的内容是FE800174,由于指令中用.b指明了有效长度是字节,所以只有后一个字节会被修改 (你应当很清楚这一点了)。最后一个字节是74,让我们来康康它的二进制是什么样:
0111 0100
|||| ||||
VVVV VVVV
1000 1011
由上可知,74的二进制是0111 0100,经过指令执行后,所有的0都变成了1,所有的1都变成了0,所以0111 0100就变成了1000 1011
而1000 1011换算成十六进制是8B,所以写入到d0之后,d0的内容是FE80018B
同样的这个指令也可以被用在内存上,比如:
not.w $000048C0
这条指令会把内存中地址为000048C0和000048C1处的位都翻转过来,比如指令执行前内存内容是这样的:
| 偏移量 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ... | ||||||||||||||||
| 000048B0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
| 000048C0 | 22 | 35 | 78 | 88 | 90 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 11 |
| 000048D0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 43 | F8 | 8F | EE | CC | C0 | 00 |
| 000048E0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
| ... |
所以读取到的字是2235,在二进制中是0010 0010 0011 0101,not指令会把位都翻转过来:
0010 0010 0011 0101
|||| |||| |||| ||||
VVVV VVVV VVVV VVVV
1101 1101 1100 1010
而1101 1101 1100 1010换算成十六进制是DDCA,所以它被写回到内存中:
| 偏移量 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ... | ||||||||||||||||
| 000048B0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
| 000048C0 | DD | CA | 78 | 88 | 90 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 11 |
| 000048D0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 43 | F8 | 8F | EE | CC | C0 | 00 |
| 000048E0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
| ... |
当然,这个指令也可以通过地址寄存器间接寻址而用到内存中:
not.w (a0)
not.b $0B(a0)
not.l (a0)+
但是,它不能被直接用在地址寄存器上:
not.w a0 ✖
目录
上一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 贰 - 基本指令 | 6. 家庭作业答案 - 2
下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 叁 - 位 指令 | 2. AND 指令