目录 上一页 下一页 下一章

第4章 奇妙的声音 -47-

    OR 存储单元,立即数
执 行:两个操作数进行"或"计算,结果保存在左边的寄存器或存储单元中
PROG6
-a100[Enter]
0A3E:0100 MOV AL,B6
0A3E:0102 OUT 43,AL
0A3E:0104 MOV AX,04A9
0A3E:0107 OUT 42,AL
0A3E:0109 MOV AL,AH
0A3E:010B OUT 42,AL
0A3E:010D IN AL,61
0A3E:010F PUSH AX
0A3E:0110 OR AL,03
0A3E:0112 OUT 61,AL
0A3E:0114 MOV AH,01
0A3E:0116 INT 21
0A3E:0118 POP AX
0A3E:0119 OUT 61,AL
0A3E:011B RET
0A3E:011C
;AL寄存器装入定时器初始化设置码
;将设置码输出到43H端口
;AX寄存器置入N值
;将N值分两次输出到42H端口


;取得61H端口的当前状态
;在堆栈中保存61H端口的当前状态
;准备将03H输出到61H端口
;打开定时器及电子开关
;选择DOS API的01H功能
;调用21H中断等待键盘输入
;从堆栈中取回61H端口的原状态
;恢复61H端口的原状态
;结束程序运行

4.1.2 编制源程序

  我们已经用DEBUG编制了一些程序,相信大家对DEBUG已有了较深的了解。DEBUG虽然小巧,但它存在很多弱点。最明显的,当我们用"JMP"指令向高地址方向转移时,我们无法知道目的地址究竟是多少,只能先假设一个地址,等到全部程序输入完后在修改转移指令的目的地址。这个问题在DEBUG中无法解决,毕竟它不是一个真正的编译系统。那么如何应用汇编语言的编译系统?这就是我们现在要讨论的问题。先来看这样一个程序:
PROG7
CODE


MAIN








SEGMENT
ASSUME
ORG
PROC
MOV
OUT
MOV
OUT
MOV
OUT
IN
PUSH

CS:CODE
100H
NEAR
AL,10110110B
43H,AL
AX,4A9H
42H,AL
AL,AH
42H,AL
AL,61H
AX
;定义代码段
;声明代码段与CS寄存器关联
;设定偏移地址为0100H
;定义主过程开始
;AL寄存器置入定时器初始化设置码
;初始化定时器
;设置N值为04A9H
;输出N值


;取得61H端口当前状态
;将61H端口的当前状态存入堆栈

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章