在上一节中,我们理解了表达式和零页,接下来让我们一起来看看一些汇编代码与高级语言的对应关系:分支、循环与栈
本节参考了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个,因此两层以上的嵌套循环需要用到内存。为了不使内存读写拖慢运行速度,可以使用上一节提到的零页内存进行计数。当然,在循环中的代码会破坏xy寄存器时,也可以使用内存进行循环计数。
在与C64同芯片的NES中,显示器IO的内存地址位于0x2007 ,因此我们可以使用如下代码向其中写入40960x20

   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 程序(五)相关推荐

  1. 利用 Ophis 编写 Commodore 64 programs PRG 程序(一)

    参考Producing Commodore 64 programs.Writing the actual code 本节将实现简单的hello world程序,从而形成对ophis的初步认识 准备工作 ...

  2. 利用 Ophis 编写 Commodore 64 programs PRG 程序(四)

    在上一节中,我们理解了字符映射与.data段的用法.接下来我们将看看另外两个好用的功能:表达式和零页 本节参考了Expressions.Advanced Memory Segments 表达式 Oph ...

  3. 利用 Ophis 编写 Commodore 64 programs PRG 程序(二)

    在上一节中,我们利用ophis实现了简单的hello world程序.接下来我们将进一步了解ophis的更多出色功能,它们能大大降低开发难度. 本节参考了Labels and aliases.Head ...

  4. 利用 Ophis 编写 Commodore 64 programs PRG 程序(三)

    在上一节中,我们理解了标签.别名.头文件/库以及宏定义的用法.接下来我们将看看另外两个好用的功能:字符映射与.data段 本节参考了Character maps.Local variables and ...

  5. Commodore 64 programs PRG 程序文件结构分析

    参考Programming with Ophis-Producing Commodore 64 programs PRG程序文件的前两个字节是一个小端序的数字,指向程序起始地址(不会拷贝入内存),接下 ...

  6. 利用C#编写一个高斯正反算程序

    一.代码界面展示 整个界面控件为tabControl,groupBox,label,textbox,comboBox,button,richTextBook. 二.代码运算结果展示 数据结果采用国家统 ...

  7. 利用Python编写一个高斯正反算程序

    一.前言 这次的高斯正反算程序是使用的Python编写的. 环境信息是:Win10.PyCharm 2021.3.1.PySide6 6.3.1.Python 3.9.9,基于QT Designer设 ...

  8. linux终端程序如何编写,[LINUX]利用Ncursesw编写支持中文的终端程序

    1. Ncursesw库的安装与使用 Ncurses库的安装(Ubuntu): 查看相关软件包 sudo apt-cache search ncursesw 安装ncursew必须软件包 sudo a ...

  9. 向串口助手发送数据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 ...

最新文章

  1. ajax php 区别,PHP中AJAX比较(转)
  2. PAT甲级1101 Quick Sort:[C++题解]DP、快速排序划分个数、快排
  3. 使用百度云服务器BCC搭建网站,过程记录
  4. BDFeatureMatch_yalmip_vlfeat
  5. html跨行使用的属性,HTML表格标记详解4:TD参数中设定跨列跨行属性
  6. 开发者应该关注的五项Web新兴技术:WebGL和SVG名列其中
  7. 在Linux平台使用VNC连接树莓派
  8. Sentry的安装搭建与使用
  9. 月结 sap_SAP的SD模块:从DN到Billing再到Invoice
  10. HCNA每日一练错误
  11. 遗传算法详解(GA)(个人觉得很形象,很适合初学者)
  12. ELF文件格式, ELF文件是什么,里面包含什么内容
  13. 求一个数的整数分化问题(python)实现
  14. 【IDEA设置和 操作遇到的 】会持续更新
  15. Server_虚拟机闲谈;
  16. 携职教育:个税APP申报流程
  17. 报告|中国智能音箱已入局全球市场,双重商业模式迅速扩张
  18. Google+ 登录
  19. 墨者学院SQL手工注入靶场漏洞详解
  20. 安装微软官方提供的win 10 PE 系统到U盘

热门文章

  1. SSM的医药管理系统ssm医药系统ssm药品管理系统ssm医药进销存系统医院JSP药品管理系统ssm药品进销存系统
  2. 【HaaS Python硬件积木】甲醛传感器
  3. 去掉Win7资源管理器左侧导航窗格中的收藏夹、库等的方法
  4. selenium+python处理广告弹窗
  5. 搭建私有云企业网盘需要准备什么?
  6. 《数据库系统概论》课程学习(26)——习题集(第1-14章)含答案
  7. 《炬丰科技-半导体工艺》种植体表面酸蚀氧化铝的稳定性
  8. websocket心跳链接代码_websocket心跳的实现(包括全部代码)
  9. Windows下使用C语言创建定时器并周期和网络调试助手通信
  10. Barra模型因子的构建及应用(一)