本文介绍了通过 basm.cmd 步步高8位汇编器,编写一个6502汇编,向屏幕显示一串字符并返回BBGDOS.该方法可以在步步高多媒学生电脑(软驱1号)或者是步步高98型学生电脑上运行.
在16位的MSDOS操作系统下, 我们可以编写比较小的COM可执行文件.COM可执行文件的大小最多不能超过64KB.由于文件体积较小,并且没有文件头(所有的程序和代码都连续的放在一起),COM文件经常用来做较小的软件,并很经常被恶意程序或者是病毒的感染目标.COM汇编模式是 .model tiny 开始汇编地址是 org $100. 前 256 个字节是操作系统保留信息块, 用于存储像命令行参数之类的信息.
我们可以用 debug.exe 调试器能过命令 U, R CX, W 来直接写汇编代码并生成机器代码. 下面就显示了这么一个 16 位的 hello.com 程序.文件大小只有 20 字节. 这个程序像MSDOS输出 “Hello!” 并返回DOS.
MSDOS 的DOS中断号是 21h, 可以通过 int 21h 来调用. 8位寄存器 AL 指定了功能号.比如 AL=9的时候是显示字符串(以 $ 结尾) AL=4c 的时候是返回操作系统,8位AH寄存器存的是返回码.16位寄存器 DX 则指向了字符串首的内存地址.
8位步步高多媒体学生电脑(软驱1号)很类似. BBGDOS则是高仿微软的DOS系统.但是却只有8 位而已, 用的汇编指令也不太一样, 是8位的 6502 汇编.
8位的BBGDOS操作系统可以通过 8位的6502汇编器 basm.cmd 把汇编程序 *.asm 编译成 .cmd 或者是 .obj 后者则可以被 link 成比较大的程序 .exc
在 这里 介绍了如何向BBGDOS终端显示一个单一字符.
在BBGDOS下, 我们可以通过 4 号DOS功能来显示字符串(也是需要用美元符号来标识字符串结尾),因为8位6502汇编并没有中断的概念,而是用 字程序的方式来模拟中断的功能,比如需要用 jsr 来调用相应的子程序.
DosDisplayString equ 4
DOSIOEntry 常量 在 xnrdef.h 定义,它指定了DOS功能的入口(子程序)
DOSIOEntry equ $580c
和其他平台大多数汇编一样,我们可以用 db 来定义数据.
msg db "Hello!$"
在调用 DosDisplayString 之前,我们需要把字符串的地址放入寄存器 X 和 Y (低8位和高8位)
ldx #<msg ldy #>msg
这样之后我们就可以用 jsr DOSIOEntry 来显示该字符串了.
返回BBGDOS,我们可以调用 0 号功能.
DosProgramReturn equ 0
返回码则存在 寄存器 X 中, 而寄存器 Y, 当第一位设置了后, 则会在程序退出后 显示 ‘Return from running program’ 或者在中文下是 “从程序执行中返回”
以下的汇编代码简单易懂,不需要注释也可以.
; HELLOACM.COM include xnrdef.h org $8000 jmp start msg: db "Hello!", 13, 10, "$" start: ldx #<msg ldy #>msg lda #DosDisplayString jsr DOSIOEntry ldx #$0 ldy #$0 lda #DosProgramReturn jmp DOSIOEntry
你们可以把上面的代码存成 hello.asm (用 edit.cmd 或者 wps.exc 文本编译器), 然后使用 basm /cmd hello.asm 命令来编译成 hello.cmd 二进制程序. 另外一种方法类似本文开头用 debug.exe 一样,用 debug.cmd (8位步步高调试器) 直接输入汇编程序.
程序 hello.cmd 只有32字节, 而 hello.com 更小,只有 20 字节. 在步步高上 .cmd 格式的文件头两个字节则指定了程序载入内存的偏移地址.
Hello.cmd 可以在中英文下运行!
不错吧,8位步步高汇编是不是很简单, 和16位MSDOS的汇编是不是很像?
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK