[转译][马基 杰斯特(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