zoukankan      html  css  js  c++  java
  • 汇编学习--第十五天

    13.3 对int,iret和栈的深入理解

    检测点13.1

    (1)这道我认为主要是判断

    add [bp+2],bx

    这里是修改IP地址,即向前跳转距离,也即bx的范围。bx为十六位寄存器,范围在-32768~32767,即最大转移位移为32768

    (2)

    测试程序:

    assume cs:code
    data segment
        db 'conversation',0
    data ends
    code segment
    start:
        mov ax,data
        mov ds,ax
        mov si,0
        mov ax,0b800h
        mov es,ax
        mov di,12*160
        mov bx,offset flag-offset flagend
    flag:
        cmp byte ptr ds:[si],0
        je ok
        mov al,ds:[si]
        mov byte ptr es:[di],al
        mov byte ptr es:[di+1],2
        inc si
        add di,2
        int 7ch
    flagend:nop
    ok:
        mov ax,4c00h
        int 21h
    code ends
    end start

    中断例程:

    assume cs:code
    code segment
    start:
        ;将程序移入指定空闲区域
        mov ax,cs
        mov ds,ax
        mov si,offset do7c
        mov ax,0
        mov es,ax
        mov di,200h
        mov cx,offset do7cend-offset do7c
        cld
        rep movsb
        ;设置中断向量
        mov ax,0
        mov es,ax
        mov word ptr es:[7ch*4+2],0
        mov word ptr es:[7ch*4],200h
        
        mov ax,4c00h
        int 21h
        
    do7c:
        ;设置IP位置
        push bp
        mov bp,sp
        add ss:[bp+2],bx
        pop bp
        iret
    do7cend:nop
        
    code ends
    end start

    13.4 BIOS和DOS所提供的中断例程

    通常在系统板的ROM中存放着一套程序,称为BIOS(基本输入输出系统),BIOS中主要是包含了以下几部分内容

    1. 硬件系统的检测和初始化程序
    2. 外部中断和内部中断的中断例程
    3. 用于对硬件设备进行I/O操作的中断例程
    4. 其他和硬件相关的中断例程

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

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

    1. 开机后,CPU一加电,初始化(CS)=0FFFFH,(IP)=0,自动的会从FFFF:0的单元开始执行程序,需要注意的是FFFF:0这个地址是在BIOS的系统范围当中的,所以我们不能去更改。在FFFF:0处有一条跳转的指令,CPU在执行这条指令之后,会转去执行BIOS中的硬件系统检测和初始化程序
    2. 初始化程序会去建立BIOS所支持的中断向量,然后会将BIOS提供的中断例程的入口地址登记在中断向量表当中
    3. 硬件系统检测和初始化完成之后,会去调用int 19h进行操作系统的引导,之后计算机就会交由操作系统来控制,这里需要去注意的是,是先去调用int 19h引导操作系统启动的,所以int 19h的中断例程不能由DOS来提供
    4. DOS启动之后,除了完成其他工作之外,还会将它所提供的中断例程装入内存,并且去建立相应的中断向量

    检测点 13.2

    (1)错误,无法改变。

    (2)错误,硬件应该是BIOS的中断例程

    13.6 BIOS中断例程应用

    在显示缓冲区B8000H~B8FFFFH共32KB空间,为80*25彩色字符模式的显示缓冲区。一屏内容占4000字节。显示缓冲区共8页,每4KB一页。

    assume cs:code
    code segment
        ;设置光标位置
        mov ah,2;置光标
        mov bh,0;第0页
        mov dh,5;dh放行号
        mov dl,12;列号
        int 10h
        
        ;将字符显示到光标位置
        mov ah,9;在光标位置显示字符
        mov al,'b';字符
        mov bl,11001010b;颜色属性
        mov bh,0;第0页
        mov cx,3;字符重复个数
        int 10h
        
        mov ax,4c00h
        int 21h
    code ends
    end

     13.7 DOS中断例程应用

    mov ah,4ch;程序返回(表示调用第21h号中断例程的4ch号子程序)
    mov al,0;返回值
    int 21h

    int 21h中断例程在光标处显示字符串功能

    ds:dx指向字符串    ;要显示的字符串需用“$”作为结束符
    mov ah,9    ;功能号9,表示在光标处显示字符串        
    int 21h

     编程在5行12列显示‘Welcome to masm!’

    assume cs:code
    data segment
        db 'Welcome to masm!','$'
    data ends
    code segment
    start:
        ;设置光标位置
        mov ah,2
        mov bh,0
        mov dh,5
        mov dl,12
        int 10h
        
        ;显示字符串
        mov ax,data
        mov ds,ax
        mov dx,0
        mov ah,9
        int 21h
        
        mov ax,4c00h
        int 21h
    code ends
    end start

    实验13 编写,应用中断例程

    (1)编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处

    参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址

     测试程序

    assume cs:code
    data segment
        db 'Welcome to masm!BIU',0
    data ends
    code segment
    start:
        mov dh,12
        mov dl,30
        mov cl,2
        mov ax,data
        mov ds,ax
        mov si,0
        int 7ch
        
        mov ax,4c00h
        int 21h
    code ends
    end start

    中断例程

    assume cs:code
    code segment
    start:
        ;将程序写入0:200h
        mov ax,cs
        mov ds,ax
        mov si,offset func
        mov ax,0
        mov es,ax
        mov di,200h
        mov cx,offset funcend-offset func;程序长度
        cld
        rep movsb
        
        ;程序入口写入中断向量表中
        mov ax,0
        mov es,ax
        mov word ptr es:[7ch*4+2],0
        mov word ptr es:[7ch*4],200h
        
        mov ax,4c00h
        int 21h
        
    func:
        push ax
        push di
        push es
        
        ;显示缓冲区地址
        mov ax,0b800h
        mov es,ax
        
        ;将已知条件转换为正确的显存地址
        mov al,160
        mul dh
        mov di,ax
        
        dec dl
        mov dh,0
        add dx,dx
        add di,dx
    show:
        ;判断是否遇到末尾的0
        cmp byte ptr ds:[si],0
        je ok
        ;将显示信息写入显示缓冲区
        mov al,ds:[si]
        mov byte ptr es:[di],al
        mov es:[di+1],cl
        inc si
        add di,2
        jmp show
    ok:
        ;结束
        pop es
        pop di
        pop ax
        iret
        
    funcend:nop
    code ends
    end start

    CS:IP和SS:SP在int和iret前后变化

    入栈标志寄存器,CS,IP。SP=FFFAH

    SS为当前段地址,CS:IP为空闲区域地址

    (2)在屏幕中间显示80个'!'

    测试程序

    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

    中断程序

    assume cs:code
    code segment
    start:
        ;将程序写入0:200h
        mov ax,cs
        mov ds,ax
        mov si,offset func
        mov ax,0
        mov es,ax
        mov di,200h
        mov cx,offset funcend-offset func;程序长度
        cld
        rep movsb
        
        ;程序入口写入中断向量表中
        mov ax,0
        mov es,ax
        mov word ptr es:[7ch*4+2],0
        mov word ptr es:[7ch*4],200h
        
        mov ax,4c00h
        int 21h
        
    func:
        push bp
        mov bp,sp
        dec cx
        jcxz ok
        add ss:[bp+2],bx
    ok:
        pop bp
        iret
        
    funcend:nop
    code ends
    end start

    (3)下面的程序,分别在屏幕的第2,4,6,8行显示4句英文诗

    assume cs:code
    code segment
    s1:
        db 'Good,better,best,','$'
    s2:
        db 'Never let it rest,','$'
    s3:
        db 'Till good is better,','$'
    s4:
        db 'And better,best.','$'
    s:
        dw offset s1,offset s2,offset s3,offset s4
    row:
        db 2,4,6,8
        
    start:
        mov ax,cs
        mov ds,ax
        mov bx,offset s
        mov si,offset row
        mov cx,4
    ok:
        mov bh,0
        mov dh,ds:[si]
        mov dl,0
        mov ah,2
        int 10h
        
        mov dx,ds:[bx]
        mov ah,9
        int 21h
        inc si
        add bx,2
        loop ok
        mov ax,4c00h
        int 21h
    code ends
    end start

  • 相关阅读:
    区块链|肖臻《区块链技术与应用》公开课之以太坊篇
    区块链|肖臻《区块链技术与应用》公开课之比特币篇
    复合数据类型
    广播变量和累加器
    mysql_基本操作
    8.10 NOI模拟赛 fzhtql SAM 后缀数组 启发式合并 dsu on tree 树状数组 set 线段树合并
    心态
    7.29 NOI 模拟赛 Stars 状压 dp
    8.2 NOI模拟赛 Palindrome dp 组合计数 分类讨论
    7.30 NOI模拟赛 B Easy Sum 分块 NTT
  • 原文地址:https://www.cnblogs.com/Mayfly-nymph/p/11219931.html
Copyright © 2011-2022 走看看