[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 壹 - 基础介绍 | 6. 地址和程序流

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

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

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

译文:

"如果建筑工人像程序员码代码一样去码砖头,那么仅需要一只啄木鸟就可以毁灭整个人类文明了" ---- 一条技术墨菲定律

简介

在继续学习其他指令之前,关于"寻址"还有很多重要的东西需要了解,我们还要康康一些基本的程序流程还有编写汇编代码的思路

奇数地址 (Odd Addressing)

到目前为止,你可能已经见过了很多的从内存中读写数据的例子,比如:

    move.w     $00000046, d0

然而你不知道的是,当操作的地址是奇数时,你不能操作一个或是一个长字的数据,比如下面这个非法的例子

    move.w     $00000047, d0     

由于00000047是一个奇数 (奇数地址/偏移量),m68k 无法处理它,然后会报一个"地址错误" (address error) 的错误

对于奇数的地址,如果你想访问它的话,只能使用字节长度的指令:

    move.b     $00000047, d0     

上面这条指令就没问题,因为从奇数的地址中只允许访问一个字节

同样的规则也适用于"地址寄存器",当你的地址寄存器中有一个奇数的地址的时候,然后尝试去_通过寄存器间接寻址_访问一个内存中的或是长字的数据,m68k 也会出错:

    movea.l    $00000047, a0
    move.w     (a0), d0          

这个规则不仅是对move有效,而且对所有的指令都适用,只要你保证从奇数地址中只读取字节长度的数据就没问题

程序流

你可能已经自己琢磨出来这是什么意思了,是的我偏题了。当我们一条指令接着一条指令的编写汇编代码时,程序的执行方向都是向下的:

    move.b     #$20, d0          
    move.b     d0, d1            
    move.w     d2, d0            

总是向下的,一条接着一条

但是有一些特殊的指令能够打乱这种顺序,这我们以后再说

家庭作业

锵锵锵!机会来了!赶快来测试下自己学 (wang) 会 (ji) 了多少吧!
下面是一串操作数据的指令:

    move.w     #$0123, d0
    move.b     d0, d1
    move.w     d1, d2
    move.l     #$FFFF0000, d3
    move.w     d0, d3
    move.l     d3, d0
    move.w     d2, d0

上面所有的数据寄存器的初始内容都是00000000,当所有的指令执行完之后,d0里的内容会是什么呢?

答案见下一节,请在看答案前最好自己捋一遍

目录
上一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 壹 - 基础介绍 | 5. MOVE 指令
下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 壹 - 基础介绍 | 7. 家庭作业答案 - 1

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