汇编语言第三版-检测点13.1

2018-06-25  本文已影响0人  pingerbufan
1. 7ch中断例程所能进行的最大转移位移是 *** -128 ~ 127 *** ,所以是128位。
2. 用7ch中断例程完成 jmp near ptr s(近转移)指令的功能,用bx向中断例程传送转移位移。
   应用举例: `在屏幕第12行,显示data段中以0为结尾的字符串`
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 ah,6     ; 字体颜色,橙色

        s: cmp byte ptr[si],0
           je ok
           mov bx,140h      ;140h表示第三行,总共25行 (80*25)
           add bx,0ah       ;从第10列开始显示
           mov al,[si]
           mov es:[bx+di],ax
           inc si
           add di,2

           mov bx,offset s-offset ok ; s 子程序中 bx 会被多次的赋值,不同的赋值都有不同的作用
           int 7ch  ;7ch向量表所对应的中断例程主要的作用就是设置cs-ip,使它指向 s 处 。从而达到循环的目的

      ok:  mov ax,4c00h
           int 21h   


code ends
end start


分析:
1. 首先我们知道中断例程是中断处理程序,它是安装在内存的某处地方,并在中断向量表中登记。所以我们可以把这个题目当做是两个程序,一个是安装程序:中断例程,另一个是主逻辑程序。
2. “应用举例”当做主逻辑程序,下面们写安装程序。


安装程序

assume cs:code
code segment
    start: mov ax,cs
           mov ds,ax
           mov si,offset content 
           mov ax,0
           mov es,ax
           mov di,200h
           mov cx,offset endContent-offset content
           cld
           rep movsb  ; 正向拷贝指令到es:di处

           ; 设置中断向量
           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

 content: push bp
          mov bp,sp
          add [bp+2],bx ; 这里bp+2的原因是 因为当前的栈顶是bp,加2表示bp的下一个出栈对象ip。
          pop bp
          iret      ; pop ip, pop cs, popf 
endContent:nop
code ends
end start

总结: 程序先运行安装程序,之后再运行主逻辑程序,这么分开写更加符合题意。

上一篇下一篇

猜你喜欢

热点阅读