在 16 位DOS下, 你可以使用debug.exe(16位的调试器) 来编写很小的 .COM 进制程序 (不需要编译,直接写汇编代码,debugger 会直接翻译成机器代码). .COM 程序是二进制的程序, 程序入口地址偏移为 0x100 (有一个 256 字节的 PSP Program Segment Prefix, 用于保存一些关于进程的信息). 所有代码(包括数据) 都存储在这一个 最多 64KB 字节的文件里. 文件里并没有格式,所以并没的指定哪一块是存放数据哪一块是存放代码,你可以完全设计你的存放空间(所以会有很多跳转代码,如 jmp, jne 等)
下面汇编代码生成了 15 字节的 16位 .COM DOS 程序. 程序功能就是打印26个英文大写字母.返回DOS用了 int 0x20 指令 (这需要 CS 指向PSP 而在 .COM 里是这样的) 我们也可以用 0x4c 功能来 int 21h 返回DOS并设置返回码.
当然,我们可以利用 9 号功能来显示一字符串. 16位寄存器 DX 此时指向一个 以 $ 美元符号结尾的字符串. 在这里我们用循环的方式显示这26 个字母.在16位 DOS 下, 我们可以用 AH=2 号功能来显示一个字符 (字符存放在8位寄存器 DL 里). 我们把循环的次数放在16位寄存器CX 中,并且用 LOOP 指令来进行 循环.LOOP指令会先对寄存器 CX 减一,然后判断是否等于0 如果不等于 继续跳传到指定的内存位置,否则继续. 每次进行中断调用的时候常用的寄存器AX 的值都会改变,所以需要对其值AL进行恢复.我们可以重新赋值或者使用堆栈来保存 (push 和 pop)
在 8 位步步高 (软驱1号或者98型学生电脑) 上, 你可以使用8位的汇编器 basm.cmd 在 8 位的操作系统 BBGDOS 上通过 8 位的汇编神器 basm.cmd 将汇编代码编译成 .CMD 或者 是 .OBJ 二进制程序.后者用于链接成较大的 .EXC 程序.
下面8位 6502 汇编代码 可以用 basm.cmd /cmd ascii.asm 命令(假设原文件存为 ascii.asm) 来生成 二进制 ascii.cmd (生成的大小是 42 字节)
这是因为在8位6502 汇编中, 可以使用的寄存器相对较少,所以,通常达到同样功能的代码要用时比较长,需要的指令也比较多.
; HelloACM.com include xnrdef.h org $8000 jmp start chr db "A" cnt db 26 start: ldx chr ldy cnt loop: lda #DosDisplayChar jsr DosIOEntry inc chr ; 下一个字母 ldx chr ; 从内存中读入寄存器 X dec cnt ; 需要显示字母个数减一 lda cnt ; 把值拷贝到寄存器 A 中 bne loop ; 如果不为零则跳转到 loop ldx #$0 ldy #$0 lda #DosProgramReturn jmp DosIOEntry
在6502汇编中, 可以使用的寄存器较少, 通用的几个寄传器是 A, X 和 Y. 所以我们不可能将所有的数据都放在寄存器中(寄存器的值会时不时的改变), 我们需要放在内存中,然后需要的时候通过指令传送到寄存器中进行操作.上面的程序在内存的位置定义了两个变量(关键字 DB, 每个变量一个字节,用于保存需要打印字母的个数和当前需要打印的字母)
我们通过 bne 指令来判断是否标志位 Z 不是零, 如果不是零,则进行跳转.在这之前省略了 cmp #$0 指令,因为这时候需要比较寄存器内容是否是零,则可以省略.
对以上代码进行保存 比如用 edit.cmd 或者是 wps.exc 进行代码的编写,用命令 basm /cmd ascii.asm 进行编译,一切正常的话会生成 ascii.map 和程序 ascii.cmd.
强烈推荐
- 英国代购-畅购英伦
- 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