利用 Ophis 编写 Commodore 64 programs PRG 程序(五)
在上一节中,我们理解了表达式和零页,接下来让我们一起来看看一些汇编代码与高级语言的对应关系:分支、循环与栈
本节参考了Structured Programming、The stack、Procedures and register saving
分支语句if else
汇编语言一般使用相反的构造方式,即将if
块中的代码紧跟在分支判断之后,若if条件成立则什么都不做,若不成立则直接跳过该块语句。
分支语句一般使用bcc/bcs/beq/bmi/bne/bpl/bvc/bvs做各种标志位的判断。
- 仅有
if
if(!++y) x++;
inybne no'overflowinx
no'overflow:;; rest of code
- 同时有
if else
if(前一个运算相等) {//Then
} else {//Else
}
;; Computation of the conditional expression.;; We assume for the sake of the example that;; we want to execute the THEN clause if the;; zero bit is set, otherwise the ELSE;; clause. This will happen after a CMP,;; which is the most common kind of 'if';; statement anyway.BNE else'clause;; THEN clause code goes here.JMP end'of'if'stmt
else'clause:;; ELSE clause code goes here.end'of'if'stmt:;; ... rest of code.
循环语句
1. while循环
- while
while(前一次比较不相等) {//Loop
}
loop'begin:;; ... computation of condition, setting zero;; bit if loop is finished...beq loop'done;; ... loop body goes herejmp loop'begin
loop'done:;; ... rest of program.
- do while
do {//Loop
} while(前一次比较不相等);
loop'begin:;; ... loop body goes here;; ... computation of condition, setting zero;; bit if loop is finished...bne loop'begin;; ... rest of program.
2. for循环
下面的程序实现16
字节的内存拷贝。为了简化代码,x
实际上从16
递减到1
,于是内存地址也进行了相应平移。
int *a = 0xC000;
int *b = 0xD000;
for (int x = 0; x < 16; x++) { a[x] = b[x]; }
ldx #$10 ; 16进制16
loop:lda #$bfff, xsta #$cfff, xdexbne loop
3. 嵌套循环
由于寄存器只有8
位,使得C64
汇编的嵌套循环非常简单。因为不管是递增还是递减,寄存器总会回到0
,此时就是循环退出的时机。不过,由于可以递增/递减的寄存器只有2个,因此两层以上的嵌套循环需要用到内存。为了不使内存读写拖慢运行速度,可以使用上一节提到的零页内存进行计数。当然,在循环中的代码会破坏x
、y
寄存器时,也可以使用内存进行循环计数。
在与C64
同芯片的NES
中,显示器IO的内存地址位于0x2007
,因此我们可以使用如下代码向其中写入4096
个0x20
。
ldx #$10ldy #$00lda #$20
loop:sta $2007inybne loopdexbne loop
栈
栈位于内存的第1
页。可以通过txs
指令修改栈指针,指针指向0xFF
表示栈为空。调用子程序的jsr
指令会将当前指令地址入栈,返回的rts
指令则会将出栈的地址加一后跳转到该处执行。中断时也会使用该栈。
当然,因为一页内存只有256
字节,因此递归调用会很容易溢出。
因此,一个类似C语言的函数应该如下。函数在开始时保护所有寄存器,在结束时恢复。
do'stuff:phatxaphatyapha;; Rest of do'stuff goes hereplatayplataxplarts
利用 Ophis 编写 Commodore 64 programs PRG 程序(五)相关推荐
- 利用 Ophis 编写 Commodore 64 programs PRG 程序(一)
参考Producing Commodore 64 programs.Writing the actual code 本节将实现简单的hello world程序,从而形成对ophis的初步认识 准备工作 ...
- 利用 Ophis 编写 Commodore 64 programs PRG 程序(四)
在上一节中,我们理解了字符映射与.data段的用法.接下来我们将看看另外两个好用的功能:表达式和零页 本节参考了Expressions.Advanced Memory Segments 表达式 Oph ...
- 利用 Ophis 编写 Commodore 64 programs PRG 程序(二)
在上一节中,我们利用ophis实现了简单的hello world程序.接下来我们将进一步了解ophis的更多出色功能,它们能大大降低开发难度. 本节参考了Labels and aliases.Head ...
- 利用 Ophis 编写 Commodore 64 programs PRG 程序(三)
在上一节中,我们理解了标签.别名.头文件/库以及宏定义的用法.接下来我们将看看另外两个好用的功能:字符映射与.data段 本节参考了Character maps.Local variables and ...
- Commodore 64 programs PRG 程序文件结构分析
参考Programming with Ophis-Producing Commodore 64 programs PRG程序文件的前两个字节是一个小端序的数字,指向程序起始地址(不会拷贝入内存),接下 ...
- 利用C#编写一个高斯正反算程序
一.代码界面展示 整个界面控件为tabControl,groupBox,label,textbox,comboBox,button,richTextBook. 二.代码运算结果展示 数据结果采用国家统 ...
- 利用Python编写一个高斯正反算程序
一.前言 这次的高斯正反算程序是使用的Python编写的. 环境信息是:Win10.PyCharm 2021.3.1.PySide6 6.3.1.Python 3.9.9,基于QT Designer设 ...
- linux终端程序如何编写,[LINUX]利用Ncursesw编写支持中文的终端程序
1. Ncursesw库的安装与使用 Ncurses库的安装(Ubuntu): 查看相关软件包 sudo apt-cache search ncursesw 安装ncursew必须软件包 sudo a ...
- 向串口助手发送数据c语言程序,利用DSP2812编写直流电机PID调速程序(C语言)
==57) { Scia_VarRx=9; } kb=Scia_VarRx[0]*1000; hd=Scia_VarRx[1]*100; de=Scia_VarRx[2]*10; un=Scia_Va ...
最新文章
- ajax php 区别,PHP中AJAX比较(转)
- PAT甲级1101 Quick Sort:[C++题解]DP、快速排序划分个数、快排
- 使用百度云服务器BCC搭建网站,过程记录
- BDFeatureMatch_yalmip_vlfeat
- html跨行使用的属性,HTML表格标记详解4:TD参数中设定跨列跨行属性
- 开发者应该关注的五项Web新兴技术:WebGL和SVG名列其中
- 在Linux平台使用VNC连接树莓派
- Sentry的安装搭建与使用
- 月结 sap_SAP的SD模块:从DN到Billing再到Invoice
- HCNA每日一练错误
- 遗传算法详解(GA)(个人觉得很形象,很适合初学者)
- ELF文件格式, ELF文件是什么,里面包含什么内容
- 求一个数的整数分化问题(python)实现
- 【IDEA设置和 操作遇到的 】会持续更新
- Server_虚拟机闲谈;
- 携职教育:个税APP申报流程
- 报告|中国智能音箱已入局全球市场,双重商业模式迅速扩张
- Google+ 登录
- 墨者学院SQL手工注入靶场漏洞详解
- 安装微软官方提供的win 10 PE 系统到U盘
热门文章
- SSM的医药管理系统ssm医药系统ssm药品管理系统ssm医药进销存系统医院JSP药品管理系统ssm药品进销存系统
- 【HaaS Python硬件积木】甲醛传感器
- 去掉Win7资源管理器左侧导航窗格中的收藏夹、库等的方法
- selenium+python处理广告弹窗
- 搭建私有云企业网盘需要准备什么?
- 《数据库系统概论》课程学习(26)——习题集(第1-14章)含答案
- 《炬丰科技-半导体工艺》种植体表面酸蚀氧化铝的稳定性
- websocket心跳链接代码_websocket心跳的实现(包括全部代码)
- Windows下使用C语言创建定时器并周期和网络调试助手通信
- Barra模型因子的构建及应用(一)