王爽《汇编语言》第十章实验十 子程序1(show_str) 题目解答

来源:互联网 发布:美工感受 编辑:程序博客网 时间:2024/04/27 21:39

; 第十章 实验十 练习1
; 子程序描述
; 名称:show_str
; 功能:指定位置,用指定颜色,显示一个用0结束的字符串
; 参数:(dh) =  行号(0--24),(dl) = 列号(0--79)
;  (cl) = 颜色,ds:si 指向字符串的首地址
; 返回:无

 

assume cs:code, ds:data

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

code segment
start:
 mov ax, data
 mov ds, ax

 mov dh, 8
 mov dl, 3
 mov cl, 2

 mov si, 0

 call show_str

 mov ah, 01h  ; 不是mov ax, 01h
 int 21h

 mov ax, 4c00h
 int 21h

show_str:
  push ax
  push bx
  push cx
  push dx
  push es

  ; 计算好字串开始显示的地址Y = 160*(行数-1) + 列数*2-2, B800 : Y
  ; 循环将参数里的字串写进显卡内存,并检测到0就返回
  
  ; bx = 160*(行数-1)
  sub dh, 1
  mov al, 160
  mul dh
  mov bx, ax ; bx 为根据行数算出来的偏移值

  ; ax = 列数*2-2
  ;mov bl, dl
  mov al, 2
  mul dl
  sub ax, 2 ; 根据列数算出来的偏移值 
  add bx, ax ; 行数和列数的和存在bx中了

  mov ax, 0b800h
  mov es, ax
  
  mov dl, cl ; 保存字体颜色属性
  mov ch, 0

 s_show_str:
  mov  cl, ds:[si]
  mov  es:[bx], cl
  jcxz ok_show_str

  mov es:[bx+1], dl

  inc si
  add bx, 2
  jmp short  s_show_str

 ok_show_str:
  pop es
  pop dx
  pop cx
  pop bx
  pop ax

  ret

code ends
end start