zoukankan      html  css  js  c++  java
  • 编写在显存中显示字符串的子程序

     第十章 实验十 练习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 

    颜色属性里2 (00000010代表绿色字体) 66代表红底绿字。

    记得 :现场保护的目的是调用子程序之后,能够返回主程序继续执行.因此要对子程序中用到的寄存器,堆栈进行必要的保护.

     现阶段 子程序中用到的寄存器最好全入栈

  • 相关阅读:
    oracle session和process的关系
    Oracle 连接、会话数的查看,修改
    Oracle 中session和processes的初始设置
    Oracle 修改字段注释
    Oracle创建自增字段和修改方法-ORACLE SEQUENCE的简单介绍
    Oracle 字段类型
    ORA-01591错误的原因和处理方法
    Oracle 优化器
    Oracle 使用TRUNCATE TABLE删除所有行
    Oracle中Hint深入理解(原创)
  • 原文地址:https://www.cnblogs.com/youxin/p/2524589.html
Copyright © 2011-2022 走看看