小赖子的英国生活和资讯

8位步步高汇编语言程序设计 4 – 显示字符串

阅读 桌面完整版

英文同步原贴可以在这里阅读

本文介绍了通过 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 之前,我们需要把字符串的地址放入寄存器 XY (低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的汇编是不是很像?

强烈推荐

微信公众号: 小赖子的英国生活和资讯 JustYYUK

阅读 桌面完整版
Exit mobile version