首页 > 编程语言 >《汇编程序语言》第11~15章

《汇编程序语言》第11~15章

时间:2025-01-05 16:03:00浏览次数:3  
标签:11 CODE 15 DATA 汇编程序 MOV 寄存器 AX DOS

第十一章 输入输出程序设计

键盘输入(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

相关文章

  • 《汇编程序语言》第6~10章
    以下是对《汇编程序语言》中这几章内容的详细介绍:第六章循环结构程序一、循环结构概述概念:循环结构允许程序在满足特定条件时,重复执行一段代码。这在需要多次执行相同或相似操作的场景中非常有用,例如对数组的每个元素进行处理,或者进行多次迭代计算。通过循环结构,可以避......
  • 全网最全112个11种注意力机制集合[即插即用]!!!
      一、引言‌注意力机制(AttentionMechanism)是一种让机器学会去感知数据中的重要和不重要的部分的机制,通过选择性地关注和集中注意力来处理特定的刺激,从而过滤掉不相关或无用的信息,专注于重要的刺激、任务或目标‌。‌二、定义和背景注意力机制源于对人类视觉的研究,人类......
  • 第15章 汇编语言--- 数组与指针
    汇编语言是一种低级编程语言,它几乎与特定的计算机架构一一对应。在汇编语言中,数组和指针的概念不像在高级语言(如C或C++)中那样直接存在,但可以通过对内存地址的操作来实现类似的功能。在汇编语言中,数组可以被看作是一系列连续存储的相同类型的元素,而指针则是用来存放某个变量......
  • Spring MVC注解故障追踪记15
    SpringMVC是美团点评很多团队使用的Web框架。在基于SpringMVC的项目里,注解的使用几乎遍布在项目中的各个模块,有Java提供的注解,如:@Override、@Deprecated等;也有Spring提供的注解,如:@Controller、@Service、@Autowired等;同时还可能有自定义注解等。注解一方面可以作为标记说明使......
  • 20241415 《计算机基础与程序设计》课程总结
    20241415《计算机基础与程序设计》课程总结每周作业链接汇总第一周作业参考基于VirtualBox虚拟机安装Ubuntu图文教程安装Linux系统自学计算机科学概论》并提出问题第二周作业了解计算思维和计算机结构第三周作业计算机的数据表示法C语言的基本数据类型第四周作业门......
  • 2024-2025-1 20241427 《计算机基础与程序设计》第15周学习总结
    每周作业链接汇总第一周作业内容:利用各种AI工具进行辅助学习,学会了不同进制之间的互相转化,了解了计算机的发展历史和信息安全的重要性。二维码:https://assets.cnblogs.com/qrcode.html?url=https%3A%2F%2Fwww.cnblogs.com%2F2981586354yx%2Fp%2F18439414第三周作业内容:不同数据......
  • Error: Attempted to call generateViewport() from the server (Next.js 15)
    Erroroccurredprerenderingpage"/".Readmore:https://nextjs.org/docs/messages/prerender-errorError:AttemptedtocallgenerateViewport()fromtheserverbutgenerateViewportisontheclient.It'snotpossibletoinvokeaclientfuncti......
  • Error occurred prerendering page "/_not-found".(Next.js 15)
    我们需要更新UserProfile.tsx组件,改用Next.js的Link组件而不是react-router-dom的Link组件。以下是解决方法:这样可以确保组件更好地适应Next.js的框架,避免不兼容的问题。#错误的代码'useclient'importReactfrom'react'import{Box,Avatar,Typography,......
  • [cause]: TypeError: e_.createContext is not a function (Next.js 15)
    开发Next.js项目遇到报错: [cause]:TypeError:e_.createContextisnotafunction 出现这个报错的原因是在Next.js项目中,在 ServerComponent 中使用了MUI组件,但是MUI组件没有做SSR适配就会导致这个报错。解决办法解决办法就是在文件顶部添加 useclient 声明,让......
  • 2024-2025-1 学号20241315《计算机基础与程序设计》第二周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>https://www.cnblogs.com/rocedu/p/9577842.html#WEEK02这个作业的目标<写上具体方面>数字化信息安全自学教材计算机科学概论(第七版)第1章并完成......