无名似名 发表于 2018-4-11 18:53:49

实验10.1 我的答案

assume cs:code

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:
      mov ax,0b800h ;显存段地址
      mov es,ax

      ;计算显存起始偏移地址
      ;偏移地址 = 行数*160+列数*2 注意列数从0开始

      mov ax,160
      mov bl,dh
      and bx,00ffh
      mov cx,dx   ;进行16位乘法会占用dx 把dx数据临时存放在cx调试半天才发现
      mul bx
      mov dx,cx
      mov bp,ax;因为一页显示内存最大偏移量为4000小于65536 所以ax中结果为偏移量


      mov al,2
      mul dl
      add bp,ax ; bx结果为最终的起始偏移地址

    l:
      mov cl,ds:
      mov ch,0
      jcxz r
      mov es:,cl
      mov es:,02h
      add bp,2
      inc si
      jmp short l

    r:ret

code ends
end start

代码编写半小时 调试三小时
页: [1]
查看完整版本: 实验10.1 我的答案