编写子程序,显示字符串

October 8, 2013
masm

在屏幕的8行3列,用绿色显示data段中的字符串。

assume cs:code, ds:data

data segment
    db 'Welcome to masm!', 0
data ends

code segment
start:
    mov dh, 8
    mov dl, 3
    mov cl, 2
    mov ax, data
    mov ds, ax
    mov si, 0
    call show_str

    mov ax, 4c00h
    int 21h

show_str:
    push dx
    push cx

    ;row
    dec dh
    mov al, 0a0h
    mul dh
    push ax

    ;col
    dec dl
    mov al, 2h
    mul dl

    pop bx
    add ax, bx
    mov di, 0b800h
    mov es, di
    mov bp, ax
    mov bl, cl

change:
    mov cl, [si]
    mov ch, 0
    jcxz ok
    mov di, si
    add di, di
    mov al, ds:[si]
    mov byte ptr es:[bp+di], al
    mov byte ptr es:[bp+di+1], bl
    inc si  
    jmp short change
ok:
    pop cx
    pop dx
    ret

code ends

end start

开始遇到了很奇怪的bug,最终还是不知道为什么,所以换了一种方式解决问题了。

那个bug是:内存地址一样的位置,数据竟然不一样: 这两行地址不一样吗?为什么呢? 为什么数据不同呢? 后来又遇到了一个bug,就是si的增长方式和在es和ds中是不一样的,所以要用寄存器 di 临时作为es段中的偏移量。

虽然搞了很久,但最终还是搞出来了=_=

comments powered by Disqus