[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 贰 - 基本指令 | 5. CLR 指令

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

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

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

译文:

"有三件事是确定的: 死亡,税收和数据丢失。猜猜看哪个先发生了?" ---- 大卫 迪克逊 (David Dixon) 1998 年由Salon.com 赞助的 Haiku Error Message 21st 挑战的优胜者

简介

CLR (清除) - 清除一个操作数

这条指令会把目的操作数里的内容擦除,变成 0

例子

这条指令很简单:

    clr.b      d0

  • 如果d0原本的内容是01234567,指令执行后d0的内容会变成01234500
  • 如果d0原本的内容是ABCB9989,指令执行后d0的内容会变成ABCB9900

因为上面我们使用的是字节长度 (.b),所以最后一个字节被清除为 0 了

再比如:

    clr.w      d0

  • 如果d0原本的内容是01234567,指令执行后d0的内容会变成01230000
  • 如果d0原本的内容是ABCB9989,指令执行后d0的内容会变成ABCB0000

因为上面我们使用的是长度 (.w),所以最后一个被清除为 0 了

同理:

    clr.l      d0

  • 如果d0原本的内容是01234567,指令执行后d0的内容会变成00000000
  • 如果d0原本的内容是ABCB9989,指令执行后d0的内容会变成00000000

因为上面我们使用的是长字长度 (.l),所以最后一个长字被清除为 0 了

你也可以把这条指令用在内存地址上 (直接使用,或是通过地址寄存器间接使用),比如:

    clr.w      $00201000
    clr.b      $00201FFF
    clr.w      (a4)
    clr.l      $1C(a2)

然而,你不能把它直接用在地址寄存器上:

    clr.l      a0         

当然有可以代替的操作:

    clr.l      d0
    move.l     d0, a0

这里难道不是应该使用 movea.l 吗?或者干脆直接movea.l     #$00000000, a0 也是一样的擦除效果

家庭作业

下面是一系列指令,我希望你能够一条一条的过一遍:

    move.w     #$0010, d0
    move.w     d0, $00000040
    move.w     d0, d1
    add.w      d1, d1
    add.w      d0, d1
    sub.w      $00000040, d1
    swap       d1
    move.w     d0, d1
    movea.l    #$00000040, a4
    add.w      (a4), d1
    move.w     d1, (a4)
    exg.l      d1, d0
    swap       d0
    clr.w      d0

每个数据寄存器初始值都是00000000,这串指令执行后,d0里的内容会是多少呢?

答案见下一节,记得先自己做一遍再看答案哦

目录
上一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 贰 - 基本指令 | 4. EXG 指令
下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 贰 - 基本指令 | 6. 家庭作业答案 - 2

posted @ 2020-02-16 10:23  草帽过客  阅读(571)  评论(0编辑  收藏  举报