6502基础知识Word文件下载.docx
《6502基础知识Word文件下载.docx》由会员分享,可在线阅读,更多相关《6502基础知识Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
与操作在实际中常于于屏蔽(修改)或测试(获取)数据中某个或某几个位的状态
如lda$80
and#$40(10000000b)
sta$80
这样就可以屏蔽$80中的6-0位
b.逻辑或
逻辑或的表达式为:
f=aˇb
逻辑状态表为:
0ˇ0=10ˇ1=11ˇ0=11ˇ1=1规则可总结为:
有1则1,全0则0"
或操作常用来置位,如将$80的0,1位置1:
lda$80
ora#$03(00000011b)
和上面是一样的,现在$80里就又是原来的数据了,这里#$79就是密码,没有它就无法解开加密后的数据
6502寄存器知识
触发器是一类具有记忆能力的基本逻辑电路
触发器就是一位寄存器,可以存放1位二进制信息,并且有接收和输出二进制数的功能,N个触发器便可构成N位的寄存器
6502中共有5个8位寄存器和1个16位寄存器
1.累加寄存器A
这是8位的寄存器,也是6502中最重要和最常用的寄存器,可用于读写数据,进行各种逻辑运算等等。
2.变址寄存器X
这个8位寄存器和A差不多,只是它可以非常方便地加1或减1,常用于数据传送,运算等等3.变址寄存器Y
和X一样,2个变址寄存器搭配使用使程序更加灵活
4.堆栈指针SP
这是8位的寄存器,指向对栈栈顶位置
在程序运行时.须要一称之为堆栈的RAM块作为数据缓冲区,以暂存程序运行过程中的一些重要数据
堆栈由连续的RAM单元组成。
数据写入堆栈称入栈,数据从堆栈中读出称为出栈,堆栈的操作遵循”先进后出"
的操作,即先入栈的数据后出栈。
系统如何了解当前的堆栈顶在哪以从顶部弹出堆栈呢?
就要依靠堆栈指针SP,6502规定,堆栈位于第一页($0100—$01ff)的RAM中,因此SP指向的时堆栈顶的低8位,即堆栈顶地址为$00SP,当进行入栈、出栈操作时,栈顶单元发生变化,SP的内容也将加1或减1
可以用下面程序读出当前SP的内容:
TSX
STX$2000
RTS
这时$2000即为SP的内容
5.程序状态字PSW(ProgramStatusWord)
这也是8位寄存器,用于寄存指令执行的状态信息,PSW的各位状态有的是根据指令执行的结果由硬件自动设置的,有的可以由用户用软件的方法设定。
PSW的各位如下(其中第5位未用,保持为0)
76543210
NVBDIZC
N:
负数标志,指令指行完后为负(>
7F)则n=0,否则为1
V:
溢出标志,若产生溢出则V=1,否则V=0
I:
中断标志。
是否允许系统中断IRQ,=1:
禁止,=0:
允许
Z:
零标志,结果是否为0,为0则Z=1,否则Z=0
C:
进位标志,结果最高位有进位则C=1,否则C=0
5.程序计数器PC
这是6502唯一的一个16为计数器,其内容为将要执行命令的存放地址,寻址范围达64KB($0000-$FFFF),CPU是根据PC的内容找到指令的存储单元,取出指令执行的。
PC具有自动加1的功能,CPU每读取一条指令的1字节,PC内容自动加1,指向下一个存储单元,这样就能实现程序的顺序执行
PC没有地址,用户不能对它进行读写,但可以通过转移,调用,返回等指令改变其内容,以改变程序的执行顺序
6502主要组成设备
这节讲解wqx的主要组成部件
1。
软件
就是我们编写或下载的程序和系统的部分,6502系统包括软件和硬件两个方面。
2.存储器
主要作用是存放程序和数据,6502系统的存储单元为8位,每位都是一个二进制数,即每个存储单元存放一个8位的进制数,也就是一个字节。
向存储单元存放信息称为”写”,取出信息称为”读"
”读”,”写"
操作都称为访问存储器.6502访问存储器是根据存储单元的地址进行的,根据地址访问存储单元又称为寻址.6502的cpu最大寻址范围为64kb,即$0000-$ffff
wqx有512kb的闪存和数mb的rom,而cpu却只能寻址64kb,这个问题是如何解决的呢?
和早期的dos系统一样,系统对存储器采取了分页访问的方法,以nc1020的512kb闪存为例,第00页的$4000—$bfff为512kb的第一个32kb,第01页的$4000-$bfff为512kb的第二个32kb..。
以此类推,这样即可对大容量的存储器进行访问。
至于nc2k的nandflash存储器,和这有些不同,这将在以后详细讲解。
Wqx主要有下面这些存储器:
a。
MaskROM
这是种不可写的存储器,又称为掩膜ROM,也就是说对于此种存储器来说,只能进行读操作。
在NC1020中分步在80—FF页$4000—BFFF
b.Systembios
这是种特殊的rom,是系统的bios,存放了中断处理例程,系统重要的函数等等
位于各系统的$e000-$ffff
NorFlash是可多次擦除的存储器,wqx用的是512kb的norflash,Flash存储器内容不易丢失。
norflash的特点是读取速度快,性能稳定,可以芯片内执行,缺点则是容量小,写入速度慢,nc2k以前的机型将其作为系统/数据存储器,nc2k以后的机型则将其作为系统和一些重要数据的存储器
d.nandflash
这是一种容量很大的flash存储器.nc2k使用的是32mb的nandflash,它的特点是容量大,擦写速度快,缺点是稳定性较差(易出现坏区),读写复杂,同时读取速度较慢
e。
sram
主要的随机存储器也即内存,分布在各系统的$0000—$3fff($0000-$003f映射到系统i/o)
f.xram
nc2k后的机型为了适应nandflash增加的32k大内存,位于$80页4000—bfff
g。
ramb
nc2k系统作为坏区表等信息存放处
h。
ram04
$00页的$4000—$5fff($6000—$7fff为其镜象),8k的内存
3。
CPU中央处理器(CentralProcessorUnit,CPU)是整个6502系统的核心,由运算器和控制器组成,进行运算和控制操作。
运算器是6502的运算部件,内有逻辑运算单元,可以实现加、减、加1、减1、比较等算术运算和与、或、异或等逻辑运算.
b.控制器是6502的指挥控制元件,保证wqx各部分能自动而协调地工作。
4.I/O接口
wqx在工作时,要不断从外部设备,比如键盘等获取信息,并向外部设备,比如屏幕,发送控制信号,这些信息的输入输出电路称为I/O(Input/Output),I/O口是系统和外部设备之间交换信息的通道
WQX共有64个8位I/O口,分别被映射到sram的$0000—$003f,直接对改段地址进行操作即可操作I/O
5.其它外部设备
很多设备是不能集成到6502主板上的,比如lcd,红外/串口通讯设备,键盘,电源(电池和外部电源接口),时钟电路,发音设备等等,它们称为外部设备,一般通过I/O接口对它们进行访问.
使用debug工具
这是本章最后一节,这里我将告诉大家如何使用debug工具,这可是很重要的!
目前wqx使用的debug工具有xasm(byxu),wqxhex(bysun),nc-tools(byxu)等等,这里我强烈推荐nc-tools这个工具!
这是我有史以来用过的最好的debug工具了。
nc-tools1020和2600分别在的下载区和星迷天地区可得到最新版本。
nc1020版nc-tools可用于nc1020/n,cc880,cc980;
nc2600版可用于nc—2600,如果你的机型没由相应的nc-tools,用sun的wqxhexeditor也可。
这里只介绍和汇编编程相关的一些命令的用法,其它功能请参考nc—tools使用说明
按键操作:
空格:
命令确定
方向上:
当前浏览位置+10
下:
减10
换姨烫烫烫烫烫烫烫烫烫烫烫坛上:
加1
下:
加60
方向左:
减1
方向右:
减60
q:
退出
求助:
工具菜单
〈中英数〉:
切换hex/中文
<
输入法〉:
直接以文字修改当前存储器内容
r〉:
查看寄存器状态
i〉:
当前页+1
〈k>
:
—1
〈z〉+〈h>
(nc1020):
清空$2000-$3000
1.v命令
转到地址
格式:
vxxxx
vxxxxyy
xxxx为地址
yy为页
2。
ec修改存储器内容
ecxxxx
ecxxxxyy
3.ei插入数据
eixxxx
xxxx:
移动范围
yy:
删除个数
5。
c比较数据
cx000yy
x000:
地址yy页
将yy页x000—xfff和$2000—$2fff比较
6.a写汇编
axxxxyy
axxxx
只能在ram写
方向上=”$"
换页上=”#”
左="
)”
方向下=”,"
右="
y”
”。
”="
b"
换页下=”("
7。
sh搜索hex
shxxxxyyyyxxyy
xxxxxx开始地址、页
yyyyyy结束地址、页
8。
sc搜索文字
scxxxxyyyyxxyy
9.u反汇编
uxxxx
uxxxxyy
10g执行
gxxxx
gxxxxyy
11.w写入
wx000yy
将$2000-$2fff写入$x000—$xfff
12。
l发送
lx000yy
将$2000—$2fff写入$x000—$xfff
12.l发送
将yy页x000-xfff发送到$2000-$2fff
13。
x求int中断地址
xyyyy
yyyy:
中断向量
寻址方式
掌握6502的寻址方式才能弄懂6502的指令,因此这节很重要
#$xx:
指令
#$zz:
数据(8位)
$yy:
地址(8位零页地址)
$yyyy:
地址(16位)
(1)立即寻址方式
xx#$zz
如lda#$05
要寻址的数据在后面已给出,称为立即寻址
(2)直接寻址方式
格式:
xx$yyorxx$yyyy
如:
LDA$1E
ADC$2300
要寻址的数据在所给出的地址中,该地址的内容即为所需数据
这里分为零页寻址(xx$yy)和普通寻址(xx$yyyy)
xx$yy就相当于xx$00yy
cpu将$0000—$ffff的可寻址范围分为0-ff个页面,每页面ff个地址,其中$00—$ff称为零页,对他们的寻址称为零页寻址,可以看出,由于零页寻址的指令为2字节,较普通寻址要快,因此使用零页寻址的指令可提高程序运行速度
(3)寄存器隐含寻址
xx
如:
tay
php
在这种寻址方式中,所需的数据并没有直接给出,也没有给出地址,而是将某个寄存器的内容作为操作数,常用于寄存器间交换数据等
(4)直接x变址,直接y变址
xx$yyyy,x
orxx$yyyy,y
orxx$yy,y
orxx$yy,x
lda$1000,x
lda$1000,y
lda$80,x
lda$80,y
这种寻址方式是在直接寻址的基础上,再加上x或y寄存器的内容,获得操作数所在地址
如lda$1000,x
当x=5时,那么所要寻址的操作数就在$1005
(4)间接寻址
xx($yy,x)orxx($yy),yorjmp($xxxx)
cmp($80,x)
lda($80),y
所谓间接寻址就是指操作数所在的地址或所需跳转的地址并不直接给出,而是在所给出的地址中
lda($80,x)
当x=5,$85=00,$86=20
那么所要的操作数就在$2000中即在$80+5,$81+5存放了地址
当y=5,$80=00,$81=20那么操作数就在$2005中,即将$80,$81中地址+5(y)
如jmp($2000)
$2000=00,$2001=30
那么就会跳转到$3000
间接寻址是很重要的一种寻址方式,刚开始时你也许会觉得使用直接寻址很简单,但用多了就会发现,间接寻址的灵活方便是直接寻址无法相比的
(6)相对寻址
xx$yyyy
bcs$2000
相对寻址是相对于当前地址的跳转指令寻址,可向前或向后跳转,范围在+7f~—7f之间
指令系统
$xxxx:
16位地址
#$xx:
数据
$xx:
零页地址
data:
地址中数据
addr:
地址
stack:
堆栈
a,x,y,p,s:
寄存器
z,n,c,v,d,i,b:
标志寄存器p的各位
各种指令和寻址方式构成了汇编代码,要注意并非每个指令都有所有的寻址方式,例如cmp指令就只有cmp($xx,x)的间接x寻址方式而没有cmp($xx),y的间接y寻址方式
指令分为一字节、二字节、三字节指令,分别占用1,2,3b的存储空间,一、二字节的指令比三字节指令所占空间少,速度快
1.数据传输指令
这里的传输是”复制"
,而不是"
移动"
(1)lda
data->
a
(2)ldx
data—〉x
(3)ldy
data—>
y
(4)sta
a—>
addr
(5)stx
a—〉addr
(6)sty
a-〉addr
(7)tay
a-〉y
(8)tya
y—〉a
(9)tax
a-〉x
(10)txa
x—〉a
(11)pha
a-〉stack
堆栈是由系统开辟的一块用于保护数据的区,在$0100—$01ff间,用于存放一些数据
这里pha将a放入了堆栈中,同时堆栈指针s=s-1
(12)pla
stack-〉a
将保存在堆栈最上的数据弹出—>
a,s=s+1
(13)php
p-〉stack,s=s—1
(14)plp
stack->
p,s=s+1
(15)tsx
s—〉x
(16)txs
x-〉s
数据操作指令
(1)ora
a=aordata
(2)eor
a=axordata
(3)and
a=aanddata
(4)asl
逻缉左移,将data中各位依次向作移一位,最高位-〉c,相当于x2
a(ordata)=〈〈a(ordata)=a(ordata)*2
(5)lsr
a(ordata)=〉>
a(ordata)=a(ordata)/2
(6)rol
循环左移
(7)ror
循环右移
(8)bit
相当于and,只是与操作的结果不放入a中,而只是影响标志位
a=a+c+data
这带c进位的加法,若c=1,则a=a+data+1
因此在单个数据加法时要将c位清0
lda#$80
clc
adc#$05
sta$2000
此时结果为85而在多个数据加法时,仅在最低位加法时清0
如2030+5080
lda#$30
adc#$80
sta$2000
lda#$20
adc#$50//注意这里就不要清c了
sta$2001
结果为70B0
(10)sbc
带c借位减法
a=a—c-data
减法和加法类似,在单个数据减法时,需将c位置1
如lda#$80
sec
sbc#$20
多个数据加减最低位要令c置1,其它不要
2050—1020
lda#$50
sbc#$20
lda#$20
sbc#$10
(11)dex
x=x—1
(12)dey
y=y—1
(13)inx
x=x+1
(14)iny
(15)inc
data=data+1
(16)dec
data=data-1
3.数据比较指令
(1)cmp
比较a和data
若相等,z=0
a〉datac=1
a〈datac=0
(2)cpx
比较x和data
(3)cpy
比较y和data
4.跳转指令
(1)bne
ifz=1then。
。
.
(2)beq
ifz=0then。
.。
(4)bcc
ifc=0then。
(5)bvs
ifn=0then。
(6)bmi
ifn=1then.。
(1)—(6)皆为相对寻址
(7)jsr
调用子程序,遇rts返回
2000:
lda#$20
jsr$2100
2100:
adc#$20
(8)jmp
无条件跳转至地址
jmp($xxxx)
间接寻址跳转
5.位操作指令
(1)sec
setc=1
(2)clc
setc=0
(3)sei
seti=1
(4)cli
seti=0
(5)sed
setd=1
(6)cld
setd=0
(7)clv
中断相关指令
(1)int
执行软中断
(2)rti
从中断返回
其它指令
(1)nop
什么也不做,空耗一个机器周期,用于延时等
(2)rts
从子程序返回或结束主程序