8位步步高汇编语言程序设计 – 5 – 循环 LOOP


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

在 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并设置返回码.

e363061999333bbaafc92c2b972dc20a.jpg 8位步步高汇编语言程序设计 - 5 - 循环 LOOP 怀旧 技术 折腾 程序员 程序设计

当然,我们可以利用 9 号功能来显示一字符串. 16位寄存器 DX 此时指向一个 以 $ 美元符号结尾的字符串. 在这里我们用循环的方式显示这26 个字母.在16位 DOS 下, 我们可以用 AH=2 号功能来显示一个字符 (字符存放在8位寄存器 DL 里). 我们把循环的次数放在16位寄存器CX 中,并且用 LOOP 指令来进行 循环.LOOP指令会先对寄存器 CX 减一,然后判断是否等于0 如果不等于 继续跳传到指定的内存位置,否则继续. 每次进行中断调用的时候常用的寄存器AX 的值都会改变,所以需要对其值AL进行恢复.我们可以重新赋值或者使用堆栈来保存 (pushpop)

在 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 汇编中, 可以使用的寄存器相对较少,所以,通常达到同样功能的代码要用时比较长,需要的指令也比较多.

181ba2d5b85fb6d6994cb77e028cbb2a.jpg 8位步步高汇编语言程序设计 - 5 - 循环 LOOP 怀旧 技术 折腾 程序员 程序设计

; 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, XY. 所以我们不可能将所有的数据都放在寄存器中(寄存器的值会时不时的改变), 我们需要放在内存中,然后需要的时候通过指令传送到寄存器中进行操作.上面的程序在内存的位置定义了两个变量(关键字 DB, 每个变量一个字节,用于保存需要打印字母的个数和当前需要打印的字母)

我们通过 bne 指令来判断是否标志位 Z 不是零, 如果不是零,则进行跳转.在这之前省略了 cmp #$0 指令,因为这时候需要比较寄存器内容是否是零,则可以省略.

对以上代码进行保存 比如用 edit.cmd 或者是 wps.exc 进行代码的编写,用命令 basm /cmd ascii.asm 进行编译,一切正常的话会生成 ascii.map 和程序 ascii.cmd.

cdad7145554ba93c08c28492f39b4982.jpg 8位步步高汇编语言程序设计 - 5 - 循环 LOOP 怀旧 技术 折腾 程序员 程序设计

GD Star Rating
loading...
本文一共 900 个汉字, 你数一下对不对.
8位步步高汇编语言程序设计 – 5 – 循环 LOOP. (AMP 移动加速版本)
上一篇: 8位步步高汇编语言程序设计 4 - 显示字符串
下一篇: 讲一下我在英国GP看病的经历

扫描二维码,分享本文到微信朋友圈
f61943d1bb2fd189e4dc7efea32936d4 8位步步高汇编语言程序设计 - 5 - 循环 LOOP 怀旧 技术 折腾 程序员 程序设计

评论