第十一章 输入输出程序设计
键盘输入(BIOS 中断调用)
; 数据段定义
DATA SEGMENT
; 预留一个字节用于存储读取的字符
INPUT_CHAR DB?
DATA ENDS
; 代码段定义
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA ; 将数据段地址加载到 AX 寄存器
MOV DS, AX ; 将 AX 寄存器的值赋给数据段寄存器 DS,初始化数据段
MOV AH, 00H ; 设置 BIOS 中断 16H 的功能号为 00H,用于从键盘读取一个字符
INT 16H ; 调用 BIOS 中断 16H,执行键盘读取操作
MOV INPUT_CHAR, AL ; 将读取到的字符(存于 AL 寄存器)存储到 INPUT_CHAR 变量中
MOV AH, 4CH ; 设置 DOS 功能调用号为 4CH,用于程序结束并返回 DOS
INT 21H ; 执行 DOS 功能调用,结束程序并返回 DOS
CODE ENDS
END START
显示器输出(BIOS 中断调用)
; 数据段定义
DATA SEGMENT
; 定义要显示的字符为 'A'
DISPLAY_CHAR DB 'A'
; 定义字符属性,07H 表示白色字符,黑色背景
ATTRIBUTE DB 07H
DATA ENDS
; 代码段定义
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA ; 将数据段地址加载到 AX 寄存器
MOV DS, AX ; 将 AX 寄存器的值赋给数据段寄存器 DS,初始化数据段
MOV AH, 09H ; 设置 BIOS 中断 10H 的功能号为 09H,用于在当前光标位置显示字符及其属性
MOV AL, DISPLAY_CHAR ; 将要显示的字符加载到 AL 寄存器
MOV BL, ATTRIBUTE ; 将字符属性加载到 BL 寄存器
MOV CX, 1 ; 设置显示次数为 1
INT 10H ; 调用 BIOS 中断 10H,执行显示操作
MOV AH, 4CH ; 设置 DOS 功能调用号为 4CH,用于程序结束并返回 DOS
INT 21H ; 执行 DOS 功能调用,结束程序并返回 DOS
CODE ENDS
END START
第十二章 中断程序设计
自定义中断服务程序及安装中断向量
; 数据段定义
DATA SEGMENT
; 此处可定义中断服务程序中需要使用的变量
DATA ENDS
; 代码段定义
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
; 中断服务程序
MY_ISR PROC
PUSH AX ; 保护现场,将 AX 寄存器的值压入堆栈
PUSH BX ; 保护现场,将 BX 寄存器的值压入堆栈
; 中断处理代码
MOV AX, 0FFFFH ; 示例:将 AX 寄存器赋值为 0FFFFH
; 恢复现场
POP BX ; 从堆栈中弹出 BX 寄存器的值,恢复 BX 寄存器
POP AX ; 从堆栈中弹出 AX 寄存器的值,恢复 AX 寄存器
IRET ; 从中断服务程序返回主程序
MY_ISR ENDP
START:
MOV AX, DATA ; 将数据段地址加载到 AX 寄存器
MOV DS, AX ; 将 AX 寄存器的值赋给数据段寄存器 DS,初始化数据段
CLI ; 关中断,防止在修改中断向量表时被中断
MOV AX, 0 ; 将 AX 寄存器清零
MOV ES, AX ; 将 ES 寄存器指向内存 0 段,即中断向量表所在段
MOV AX, OFFSET MY_ISR ; 将中断服务程序的偏移地址加载到 AX 寄存器
MOV ES:[60H * 4], AX ; 将中断服务程序的偏移地址存入中断向量表对应位置
MOV AX, SEG MY_ISR ; 将中断服务程序的段地址加载到 AX 寄存器
MOV ES:[60H * 4 + 2], AX ; 将中断服务程序的段地址存入中断向量表对应位置
STI ; 开中断
MOV AH, 4CH ; 设置 DOS 功能调用号为 4CH,用于程序结束并返回 DOS
INT 21H ; 执行 DOS 功能调用,结束程序并返回 DOS
CODE ENDS
END START
第十三章 磁盘操作及文件管理
BIOS 磁盘中断调用(读取扇区)
; 数据段定义
DATA SEGMENT
; 定义一个缓冲区,用于存储从磁盘读取的数据
BUFFER DB 512 DUP(0)
DATA ENDS
; 代码段定义
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA ; 将数据段地址加载到 AX 寄存器
MOV DS, AX ; 将 AX 寄存器的值赋给数据段寄存器 DS,初始化数据段
MOV AH, 02H ; 设置 BIOS 中断 13H 的功能号为 02H,用于从磁盘读取扇区
MOV AL, 1 ; 设置要读取的扇区数为 1
MOV CH, 0 ; 设置柱面号的低 8 位为 0
MOV CL, 1 ; 设置扇区号为 1,同时柱面号的高 2 位为 0
MOV DH, 0 ; 设置磁头号为 0
MOV DL, 0 ; 设置驱动器号为 0(表示软驱)
MOV BX, OFFSET BUFFER ; 将缓冲区地址的偏移量加载到 BX 寄存器
MOV ES, AX ; 将 ES 寄存器设置为数据段地址,与 BX 寄存器共同指向缓冲区
INT 13H ; 调用 BIOS 中断 13H,执行磁盘读取操作
MOV AH, 4CH ; 设置 DOS 功能调用号为 4CH,用于程序结束并返回 DOS
INT 21H ; 执行 DOS 功能调用,结束程序并返回 DOS
CODE ENDS
END START
DOS 磁盘功能调用(打开文件)
; 数据段定义
DATA SEGMENT
; 定义要打开的文件名
FILE_NAME DB 'TEST.TXT', 0
; 预留一个字用于存储文件句柄
FILE_HANDLE DW?
DATA ENDS
; 代码段定义
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA ; 将数据段地址加载到 AX 寄存器
MOV DS, AX ; 将 AX 寄存器的值赋给数据段寄存器 DS,初始化数据段
MOV AH, 3DH ; 设置 DOS 功能调用号为 3DH,用于打开文件
MOV AL, 0 ; 设置访问模式为读(0 - 读,1 - 写,2 - 读写)
MOV DX, OFFSET FILE_NAME ; 将文件名地址的偏移量加载到 DX 寄存器
INT 21H ; 调用 DOS 功能调用,执行打开文件操作
JC ERROR_HANDLER ; 如果进位标志位为 1,表示打开文件失败,跳转到错误处理程序
MOV FILE_HANDLE, AX ; 将返回的文件句柄存储到 FILE_HANDLE 变量中
MOV AH, 4CH ; 设置 DOS 功能调用号为 4CH,用于程序结束并返回 DOS
INT 21H ; 执行 DOS 功能调用,结束程序并返回 DOS
ERROR_HANDLER:
; 错误处理代码,此处可添加具体的错误处理逻辑
MOV AH, 4CH ; 设置 DOS 功能调用号为 4CH,用于程序结束并返回 DOS
INT 21H ; 执行 DOS 功能调用,结束程序并返回 DOS
CODE ENDS
END START
第十四章 汉字处理技术
简单汉字显示(假设已有 16x16 点阵字库及相关显示函数)
; 数据段定义
DATA SEGMENT
; 定义要显示的汉字机内码,以“中”字为例
CHINESE_CHAR DB 0D6H, 0D0H
; 假设已有字库地址
FONT_LIBRARY_ADDR DW?
DATA ENDS
; 代码段定义
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA ; 将数据段地址加载到 AX 寄存器
MOV DS, AX ; 将 AX 寄存器的值赋给数据段寄存器 DS,初始化数据段
; 假设此处有函数根据机内码从字库中获取点阵数据并显示
; 示例函数调用,实际需根据具体实现编写
MOV AX, CHINESE_CHAR ; 将汉字机内码加载到 AX 寄存器(假设函数以此方式接收参数)
MOV BX, FONT_LIBRARY_ADDR ; 将字库地址加载到 BX 寄存器(假设函数以此方式接收参数)
CALL DISPLAY_CHINESE_CHAR ; 调用显示汉字函数
MOV AH, 4CH ; 设置 DOS 功能调用号为 4CH,用于程序结束并返回 DOS
INT 21H ; 执行 DOS 功能调用,结束程序并返回 DOS
CODE ENDS
END START
第十五章 条件汇编与宏指令
条件汇编示例
; 定义一个宏,用于根据条件选择不同的代码段
CHECK_CONDITION MACRO
; 假设定义一个条件变量
CONDITION EQU 1
IF CONDITION
MOV AX, 100H ; 如果条件为真,将 100H 赋值给 AX 寄存器
ELSE
MOV AX, 200H ; 如果条件为假,将 200H 赋值给 AX 寄存器
ENDIF
ENDM
; 数据段定义
DATA SEGMENT
; 此处可定义其他数据
DATA ENDS
; 代码段定义
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA ; 将数据段地址加载到 AX 寄存器
MOV DS, AX ; 将 AX 寄存器的值赋给数据段寄存器 DS,初始化数据段
CHECK_CONDITION ; 调用宏,根据条件汇编相应代码
MOV AH, 4CH ; 设置 DOS 功能调用号为 4CH,用于程序结束并返回 DOS
INT 21H ; 执行 DOS 功能调用,结束程序并返回 DOS
CODE ENDS
END START
宏指令示例
; 定义一个宏,用于两个数相加
ADD_TWO_NUMS MACRO num1, num2
MOV AX, num1 ; 将第一个参数加载到 AX 寄存器
ADD AX, num2 ; 将第二个参数加到 AX 寄存器
ENDM
; 数据段定义
DATA SEGMENT
; 定义两个数
NUMBER1 DW 10H
NUMBER2 DW 20H
; 预留一个字用于存储结果
RESULT DW?
DATA ENDS
; 代码段定义
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA ; 将数据段地址加载到 AX 寄存器
MOV DS, AX ; 将 AX 寄存器的值赋给数据段寄存器 DS,初始化数据段
ADD_TWO_NUMS NUMBER1, NUMBER2 ; 调用宏,将 NUMBER1 和 NUMBER2 相加
MOV RESULT, AX ; 将相加结果存储到 RESULT 变量中
MOV AH, 4CH ; 设置 DOS 功能调用号为 4CH,用于程序结束并返回 DOS
INT 21H ; 执行 DOS 功能调用,结束程序并返回 DOS
CODE ENDS
END START
以上代码示例及注释旨在帮助你更清晰地理解各章节的核心概念和代码实现逻辑。汇编语言的实际应用可能因具体环境和需求有所不同,你可根据实际情况进行调整。
标签:11,CODE,15,DATA,汇编程序,MOV,寄存器,AX,DOS From: https://blog.csdn.net/qq_40844444/article/details/144934667