"Assembly Language" Third Edition Wang Shuang Experiment 13

Write and apply interrupt routines

  1.编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处
    参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址
    
    assume cs:codesg
    codesg segment
    start:  ;安装中断例程 
            mov ax,cs
            mov ds,ax
            mov si,offset sub
            
            mov ax,0
            mov es,ax
            mov di,200H
            
            mov cx,offset subend-sub
            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
            ;设置中断例程
      sub:  push ax
            push es
            push di
        
            mov ax,0b800H
            mov es,ax
            mov di,[dh*160+dl*2]
              
        s:  cmd ds:[si],0
            je end
            mov al,ds:[si]
            mov es:[di],al   
            mov es:[di+1],cl
            inc si
            add di,2
            jmp short s
      
      end:  pop di
            pop es
            pop ax 
            iret                
   subend:  nop    
    
    codesg ends
    endstart            
          
  
  2.编写并安装int 7ch中断例程,功能为完成loop指令的功能
    参数:(cx)=循环次数,(bx)=位移
    
    assume cs:codesg
    codesg segment
    start:  ;安装中断例程和设置中断向量表省略
            
            ;以下为中断例程:完成loop指令的功能
      sub:  push bp
            mov bp,sp
            dec cx
            jcxz end
            add [bp+2],bx    ;改变原IP值         
      end:  pop bp
            iret  
   subend:  nop   


  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  
            ;调用为BIOS的10h标量的中断中的第二个程序
            ;设置光标位置
            
            mov dx,[bx]    ;dx寄存器为与标量21h处所对应的中断的输出有关
            mov ah,9    
            int 21h
            inc si
            add bx,2
            loop ok
            ;调用DOS的21h标量的中断中的第九个程序
            
            mov ax,4c00h
            int 21h
    code ends
    end start              

Guess you like

Origin blog.csdn.net/Xgggcalled/article/details/113770384