• 汇编笔记_第十三章



    title: 汇编笔记_第十三章
    date: 2019-01-02 15:45:55
    tags:

    • 笔记
      categories:
    • 汇编语言

    中断程序设计

    int 指令

    int n:n为中断类型码,功能是引发中断过程

    定制自己的中断

    eg:将data段中的字符转化为大写

    assume cs:code
    data segment 
        db 'coversation',0
    data ends
    
    code segment
    start:
        mov ax,data
        mov ds,ax
        mov si,0
    
        int 7ch
    
        mov ax,4c00h
        int 21h
    
    code ends
    end start
    
    
    
    capital:
        push cx
        push si
    change:
        mov cl,[si]
        mov ch,0
        jcxz ok
        and byte ptr [si],0DFH
        inc si
        jmp short change
    
    ok:
        pop si
        pop cx
        iret
    
    capitalend:nop
    

    软件中断子程序的编写

    • 保存现场
    • STI开中断指令;如允许中断嵌套,则开中断
    • 处理中断
    • CLI关中断指令
    • 恢复现场
    • IRET指令,返回被中断的程序

    对int,iret和栈的深入理解

    用7ch中断完成loop指令的功能

    bx:保存位移(负的)
    cx: 保存循环次数

    所以7ch的功能有:

    • dec cx
    • 判断(cx),不为零循环,为零向下执行
    assume cs:code
    code segment
    start:
        mov ax,0b800h
        mov es,ax
        mov di,160*12
    
        mov bx,offset s-offset se
        mov cx,80
    
      s:
        mov byte ptr es:[di],'!'
        add di,2
        int 7ch
      se:nop
    
      mov ax,4c00h
      int 21h
    
    code ends
    end start
    
    
    ;int 7ch:
    ;直接修改IP的值到s处实现循环
    ;访问栈需要使用bp
    
    lp:
        push bp
        mov bp,sp
        dec cx
        jcxz lpret
        add [bp+2],bx   ;[bp+2]即为IP
    lpret:
        pop bp
        iret
    

    BIOS和DOS中断例程

    rom中存放着BIOS(基本输入输出系统):

    • 硬件系统的检测和初始化程序
    • 外部中断和内部中断例程
    • 用于对硬件设备进行IO操作的中断例程
    • 其他和硬件系统相关的中断例程

    BIOS和DOS中断例程的安装过程

    • CPU开机加电后,初始化(CS)=0FFFFH,(IP)=0,自动从FFFF:0单元开始执行程序(该单元处为一条跳转指令,CPU会转去执行BIOS中的硬件系统检测和初始化程序)
    • 初始化程序将建立BIOS所支持的中断向量,将BIOS提供的中断例程的入口地址登记在中断向量表中
    • 硬件系统检测和初始化完成后,调用 int 19h 进行操作系统的应道,从而将计算机交由操作系统控制
    • DOS启动后,除完成其他工作外,还将它提供的中断例程装入内存,并建立相应的中断向量

    BIOS中断

    BIOS主要分为:

    • 系统硬件检测和初始化程序
    • 内中断的中断处理程序
    • 硬件中断的中断处理程序
    • IO设备及接口控制等功能模块

    屏幕及光标控制 int 10h

    光标控制

    • 光标大小控制
    ah=01h
    ch=光标开始行
    cl=光标结束行
    int 10h
    
    • 设置光标位置
    ah=01h
    dh=行号
    dl=列号
    bh=页号
    int 10h
    
    • 读光标位置
    ah=03h
    bh=页号
    int 10h
    
    返回值:
    dh=行号
    dl=列号
    cx=光标大小
    

    卷屏、清屏、开窗口

    • 选择显示页
    ah=05h
    al=页号
    int 10h
    
    • 屏幕开窗口
    ah=06h
    al=0
    bh=窗口颜色属性
    ch=左上角行号
    cl=左上角列号
    dh=右下角行号
    dl=右下角列号
    int 10h
    
    • 屏幕上卷
    ah=06h
    al=上卷行数
    bh=卷入行属性
    ch=左上角行号
    cl=左上角列号
    dh=右下角行号
    dl=右下角列号
    int 10h
    
    • 屏幕下卷
    ah=07h
    

    字符读与显示

    • 读当前光标处字符和属性
    ah=08h
    bh=页号
    int 10h
    
    返回值:
    ah=属性
    al=字符
    
    • 显示多个带属性的相同字符
    ah=09h
    bh=页号
    cx=字符重复个数
    al=字符
    bl=属性
    int 10h
    
    
    7   6 5 4  3  2 1 0
    bl  r g b  i  r g b
    闪烁 背景 高亮 前景
    

    DOS中断

    显示功能调用

    • 显示一个字符
    ah=02h
    dl=字符
    int 21h
    功能:屏幕上显示一个字符,光标跟随字符移动。检验DL是否为Ctrl_Break。
    
    • 显示一个字符
    ah=06h
    dl=字符
    int 21h
    功能:屏幕上显示一个字符,光标跟随字符移动。不检验Ctrl_Break。
    
    • 显示一串字符
    ah=09h
    ds:dx=字符串地址
    int 21h
    功能:屏幕上显示一串字符,光标跟随字符移动。要求字符串必须以$结尾。
    

    输入

    • 键入一个字符并回显
    ah=01h
    int 21h
    返回值:AL=字符的ASCII码。
    
    • 键入一个字符不回显
    ah=07h
    int 21h
    返回值:AL=字符的ASCII码。不检验键入的字符是否为Ctrl_Break。
    

    (end)

  • 相关阅读:
    redis 笔记
    经验
    增加模块-概念图
    node API buffer
    VS2010中使用CL快速 生成DLL的方法
    WIN7下VS2010中使用cl编译的步骤
    Win7下VS2010编译的程序在XP报错:找不到msvcp100d.dll或者msvcp100.dll
    C#速学
    Windows下架设SVN服务
    Redis 压力测试
  • 原文地址:https://www.cnblogs.com/31415926535x/p/10209817.html
Copyright © 2020-2023  润新知