汇编学习(八)8086汇编拾遗 (7)

原创 2016年05月31日 20:50:59
int 中断指令

使用方式:

int n.  n 为中断类型码,它的功能是引发中断,n 为引发的中断号。

先写一个中断程序的例子吧,安装中断7ch 中断例程,计算一个字型数的平方。
assume cs:code

code segment

    start:
        mov ax,cs
        mov ds,ax
        
        mov si,offset sets
        mov di,200h
        mov ax,0
        mov es,ax
        mov cx,offset sets0 - offset sets
        cld
        rep movsb

        mov ax,0
        mov es,ax
        mov word ptr es:[7ch*4],200h
        mov word ptr es:[7ch*4 + 2],0

        mov ax,4c00h
        int 21h

    sets:
        mul ax
        iret

    sets0:nop

code ends

end start
再来一个转换字符串的中断。 功能:将一个全是子母,以0结尾的字符串转换为大写。
assume cs:code

code segment

    start:
        mov ah,2
        mov bh,0
        mov dh,5
        mov dl,12
        int 10h
        
        mov ah,9
        mov al,'a'
        mov bl,11001010b
        mov bh,0
        mov cx,3
        int 10h


        mov ax,4c00h
        int 21h

code ends
end start
使用int 模拟 loop
assume cs:code

code segment
    start:
        mov ax,cs
        mov ds,ax
        mov ax,0
        mov es,ax
        mov si,200h
        mov di,offset se

        mov cx,offset se0 - offset se

        rep movsb

        mov ax,0
        mov es,ax
        mov word ptr es:[7ch*4],0
        mov word ptr es:[7ch*4+2],200h

        mov ax,4c00h
        int 21h

    se:
        push bp
        mov bp,sp
        dec cx
        jcxz ll
        add [bp+2],bx
    ll:
        pop bp
        iret

    se0:
        nop

code ends
end start
编写7CH中断实现jmp near ptr s   功能:
assume cs:code

data segment

    db 'conversion',0

data ends

code segment

    start:
        mov ax,cs
        mov ds,ax
        mov si,offset se
        mov ax,0
        mov es,ax
        mov di,200h
        mov cx,offset se0 - offset se 

        rep movsb

        mov ax,0
        mov es,ax
        mov word ptr es:[7ch*4],200h
        mov word ptr es:[7ch*4+2],0
        
        mov ax,data
        mov ds,ax
        mov si,0
        mov ax,0b800h
        mov es,ax
        mov di,12*160
      s:
        cmp byte ptr [si],0
        je ok
        mov al,[si]
        mov es:[di],al
        inc si
        add di,2
        mov bx,offset s - offset ok
        int 7ch
     ok:
        mov ax,4c00h
        int 21h


    se:
        push bp
        mov  bp,sp
        add  [bp+2],bx
        pop bp
        iret

    se0:nop

code ends
end start
编写并安装7ch中断,直到0结束的字符串
assume cs:code

data segment

    db 'weclome to linux world!',0

data ends

code segment

    start:
        mov ax,cs                ;添加中断代码
        mov ds,ax
        
        mov si,offset se 
        mov di,200h

        mov ax,0
        mov es,ax
        mov cx,offset se0 - offset se 
        
        cld 
        rep movsb

        mov ax,0                 ;设置中断号
        mov es,ax
        mov word ptr es:[7ch * 4],200h
        mov word ptr es:[7ch * 4 + 2],0
    
        mov dh,10                ;测试代码
        mov dl,10
        mov cl,2
        mov ax,data
        mov ds,ax
        mov si,0
        int 7ch



        mov ax,4c00h
        int 21h

    se:
        mov al,160           ;设置es:0b800h         
        mul dh
        add dl,dl
        mov dh,0
        add ax,dx
        mov di,ax
        mov ax,0b800h
        mov es,ax
      s:
        mov al,ds:[si]       ;打印字符
        mov ah,0
        cmp ax,0
        je f
        mov ah,cl 
        mov es:[di],ax
        inc si
        inc di
        inc di
        jmp s
      f:
        iret

    se0:nop


code ends
end start
编写7C 中断,打印80个!
assume cs:code

code segment

    start:
        mov ax,cs                       ;安装中断
        mov ds,ax
        mov si,offset lp

        mov ax,0
        mov es,ax
        mov di,200h

        mov cx,offset lpend - offset lp
        cld
        rep movsb

        mov word ptr es:[7ch*4],200h
        mov word ptr es:[7ch*4 + 2],0

        mov ax,0b800h                   ;设置es
        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

        lp:
            push bp                     ;循环 
            dec cx
            jcxz f
            mov bp,sp
            add [bp+2],bx
        f:
            pop bp
            iret
        lpend:nop

code ends
end start
 

查看原文:http://zmrlinux.com/2016/05/31/%e6%b1%87%e7%bc%96%e5%ad%a6%e4%b9%a0%ef%bc%88%e5%85%ab%ef%bc%898086%e6%b1%87%e7%bc%96%e6%8b%be%e9%81%97-7/
版权声明:本文为博主原创文章,未经博主允许不得转载。

8086汇编基础 新手汇编源代码---多段实例

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 assume cs:code,ds:data,ss:stack data segm...
  • yushaopu
  • yushaopu
  • 2016年07月22日 20:35
  • 2350

8086汇编

指令mov指令(传送指令) 将数据直接送入寄存器 mov ax,01 将一个寄存器中的内容送入另一个寄存器 mov ax,bx 将一个内存单元中的内容送入一个寄存器中 mov a...
  • Lotheve
  • Lotheve
  • 2015年12月17日 18:53
  • 1994

汇编学习(九)8086汇编拾遗 (8)

端口: 从CPU的角度,简单来看,CPU将这些硬件设备进行了统一的编址。一些硬件被编进的地址就变成了对CPU 读取地址的接口。 端口的读写指令只有2条: in: 从端口读入数据 ...
  • zmrlinux
  • zmrlinux
  • 2016年05月31日 21:26
  • 191

汇编学习(五)8086汇编拾遗 (4)

汇编模块化成程序语言设计 使用寄存器来存储参数和结果是最常用使用的方法。对于存放参数的寄存器和存放结果的寄存器,调用者和子程序的读写操作恰恰相反,调用者将参数送入寄存器,从结果寄存器中取到返回值...
  • zmrlinux
  • zmrlinux
  • 2016年05月25日 21:01
  • 139

汇编学习(一)8086汇编拾遗(2)

寻址方式 立即寻址             mov ax,3069H 寄存器寻址         mov al,BH 直接寻址             mov ax,[2000H] ...
  • zmrlinux
  • zmrlinux
  • 2016年05月18日 12:12
  • 160

汇编学习(十三)8086汇编拾遗 (12)

王爽的《汇编语言》虽然结束了,但是我们的思考还要继续,结下来就要进入X86汇编语言的学习了,但是思考还要继续。 指令拾遗,其实指令还有太多,这里只能写一些有限的: xchg:   交换指令...
  • zmrlinux
  • zmrlinux
  • 2016年06月03日 18:04
  • 199

汇编学习(一)8086汇编拾遗(1)

前言 汇编学习这个系列是我一直想要开启的一个学习模块,但是因为种种原因一直没有开始做这件事,正好我们开始准备做操作系统,我们必须出发了,之前的一些事情只能让它飞向天边了。 基础概念 指令和数据,...
  • zmrlinux
  • zmrlinux
  • 2016年05月16日 20:17
  • 195

汇编学习(四)8086汇编拾遗 (3)

jcxz  指令:条件指令,所有的转移都是短转移,IP 的修改范围是-128~127 之间。 eg. 查找内存2000H段中的一个值为0的字节,然后将它的偏移地址存储在dx 中。 assume...
  • zmrlinux
  • zmrlinux
  • 2016年05月24日 23:01
  • 95

汇编学习(十二)8086汇编拾遗 (11)

《汇编语言》最后一章,键盘和磁盘的读取 一个键盘读写程序: assume cs:code code segment charstack: jmp short chars...
  • zmrlinux
  • zmrlinux
  • 2016年06月02日 22:41
  • 169

汇编学习(七)8086汇编拾遗 (6)

前边我们已经基本学完了8086的语法,接下来进入系统学习阶段。 中断这个概念蕴含的意思想当的多,但是这里我们只考虑8086的中断模式,等后边学到x86的时候在讨论现代计算机系统的中断,一样会以L...
  • zmrlinux
  • zmrlinux
  • 2016年05月29日 22:55
  • 227
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:汇编学习(八)8086汇编拾遗 (7)
举报原因:
原因补充:

(最多只允许输入30个字)