汇编语言中断安装

assume cs:code
code segment
 
start:
    设置 es:di 指向目的地址
        设置 ds:si 指向源地址
        设置 cx 为传输长度
        设置传输方向为正
    rep movsb
 
    设置中断向量表
 
    mov ax,4c00h
    int 21h
 
    do0:
        显示字符串 "overflow!"
        mov ax,4c00h
        int 21h
code ends
end start

  我们来看一下,用 rep movsb 指令的时候需要确定的信息。

  (1)传送的原始地址,段地址:code,偏移地址:offset do0

  (2)传送的目的地址:0:200

  (3)传送的长度:do0 部分代码的长度

  (4)传送的方向:正向

问题是,我们如何知道do0代码的长度?最简单的方法是,计算一下do0中所有指令码的字节数。但是这样做太麻烦了,因为只要do0的内容发生了改变,我们都要重新计算它的长度。

assume cs:code
code segment
 
start:
    mov ax,cs
    mov ds,ax
    mov si, offset do0    ;设置 ds:si 指向源地址
 
    mov ax,0
    mov es,ax
    mov di,200h            ;设置 es:di 指向目的地址
 
    mov cx, offset do0end - offset do0    ;设置 cx 为传输长度
 
    cld    ;设置传输方向为正
    rep movsb
 
    设置中断向量表
     
    mov ax,4c00h
    int 21h
 
do0:   
    显示字符串"overflow!"
    mov ax,4c00h
    int 21h
do0end:
    nop
 
code ends
end start

  “-” 是编译器识别的运算符号,编译器可以用它来进行两个常熟的减法。

  比如,指令:mov ax,8-4,被编译器处理为指令:mov ax,4

汇编编译器可以处理表达式。
比如,指令:mov ax,(5+3)*5/10,被编译器处理为指令:mov ax,4 0
好了,知道了“-”的含义,对于用offset do0end-offset do0,得到do0代码的长度的原理,就可以进行分析了。


发布日期:

所属分类: 易语言 标签: