;    用int 7ch显示字符串

assume cs:codesg
datasg segment
        db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends
codesg segment
    start:
        ; 安装中断程序于0:200设置源地址与目的地址,并使用movsb传送
        mov ax, cs
        mov ds, ax
        mov si, offset doPrint
        mov ax, 0
        mov es, ax
        mov di, 200h
        mov cx, offset doPrint_end - offset doPrint
        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, datasg
        mov ds, ax
        mov si, 0
        ;    设置中断处理程序要处理字符串地址ds:0
        mov dh, 12
        mov dl, 2
        mov cl, 3
        int 7ch
        ;    调用打印函数
        mov ax, 4c00h
        int 21h
        
        ;dh  行号,dl 列号  cl  颜色 ,ds:si 指向首地址,遇到0返回
doPrint:

    push ax
    push bx
    push es
    push di
    push si
    push cx
    
    ; 计算偏移量
    mov al, 160
    mul dh
    mov bx, ax
    mov al, 2
    ;mov dl, 2
    mul dl
    add bx, ax
    ; 偏移量存储在bx中
    mov ax, 0b800h
    mov es, ax
    mov di, 0
    mov ah, cl
    mov ch, 0
print:
    mov cl, ds:[si]
    jcxz backshow_str
    mov al, cl
    mov es:[bx + di], ax
    add di, 2
    inc si
    jmp short print
    
backshow_str:
    pop cx
    pop si
    pop di
    pop es
    pop bx
    pop ax
    iret
    
doPrint_end:
    nop
                
        
codesg ends
end start

posted on 2014-05-10 15:22  Notflybird  阅读(277)  评论(0)    收藏  举报