实验10 编写子程序 1.显示字符串

assume cs:code,ds:data

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

code segment
start:  mov dh,8 ;dh表示行号(范围:1~25)
        mov dl,3 ;dl表示列号(范围:1~80)[注:每超过80等于行号自动加1]
        mov cl,2 ;cl中存放颜色属性(0cah为红底高亮闪烁绿色属性)
        mov ax,data
        mov ds,ax
        mov si,0
        call show_str

        mov ax,4c00h
        int 21h

show_str: ;显示字符串的子程序[定义开始]
        push cx ;cx和si寄存器后面会用到,防止值被覆盖,先入栈保存
        push si

        mov al,0a0h ;每行有 80*2 == 160个字节 == 0a0h个字节
                    ;al也就是表示每行有多少个字符

        dec dh ;行号在显存中下标从0开始,所以减1。因为计算机内部编号从0开始
        mul dh ;dh存放的是行数,dh*al相当于 (n-1)*0a0h。表示从
               ;第(n-1)*0a0h个Byte单元开始...
               ;(n-1)*0a0h相乘的结果默认放入ax中

        mov bx,ax ;定位好的位置偏移地址存放在bx里(bx定位了行地址)

        mov al,2 ;每个字符占两个字节
        mul dl ;dl存放列数,定位列,结果ax存放的是定位好的列的位置
        sub ax,2 ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2

        add bx,ax ;此时bx中存放的是行与列号的偏移地址

        mov ax,0b800h ;显存开始的地址
        mov es,ax ;es中存放的是显存的第0页(共0~7页)的起始的段地址

        mov di,0 ;di指向显存的偏移地址。指向下一个要处理的字符的位置

        mov al,cl ;cl是存放颜色的参数,这时候al存放颜色了
                  ;因为cl下面要用来临时存放要处理的字符

        mov ch,0 ;下边cx存放的是每次准备处理的字符

s:      mov cl,ds:[si] ;ds:[si]指向“Welcome to masm!”,0
                       ;例如当si=0时,就是把字符W赋给cl。cl存的是W的ASCII码

        jcxz ok ;当cl的值为0的时候,cx == 0,则发生跳转,到ok处结束处理!

        mov es:[bx+di],cl ;偶地址存放字符
        mov es:[bx+di+1],al ;奇地址存放字符的颜色属性

        inc si ;si自增1,指向下一个将要处理的字符串中的字符

        add di,2 ;指向了下个字符。因为每个字符在显存中占两个字节
        jmp short s ;无条件跳转,jcxz是离开的关键跳

ok:     pop si
        pop cx

        ret ;显示字符串的子程序[定义结束]
code ends
end start

执行效果截图:

原文地址:https://www.cnblogs.com/doctorx/p/9696895.html

时间: 2024-10-12 19:50:35

实验10 编写子程序 1.显示字符串的相关文章

汇编|使用10h中断来显示字符串

特么这个问题困扰了我好久,毕竟是个OS newbie,还没有汇编的基础. 在前天的加载loader的实验中,老师要求显示字符串,但是给的代码只是显示一个字符. 愚蠢的我实在没办法,最后为了按期完成实验,只能一个个字符地输出,呀真是羞耻. 好了,趁着清明假期,花了几个小时终于弄懂了. 下面进入正题! 前戏是先对boot.asm和loader.asm编译: nasm -o boot.bin boot.asm nasm -o loader.bin loader.asm 然后把boot.bin写入软盘a

汇编在dos下显示字符串的子程序

assume cs:code,ss:stack,ds:data data segment db 'welcome to masm','0' data ends stack segment dw 8 dup (0) stack ends code segment start: mov dh,8 mov dl,3 mov cl,2 mov ax,data mov ds,ax mov si,0 mov ss,stack call show_str mov ax,4c00h int 21h show_s

实验10(1)

;实验10 ;1.显示字符串 ;表示要用到前面的,8,3数据好麻烦,但是最后还是用了, ;不知道push,pop这么多寄存器干嘛,可能是因为题目要求 ;要保存子程序中要用到的寄存器吧~ 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 m

使用BIOS中断显示字符串笔记(int 10h 13号中断)

BIOS的10H中断的13号中断用于显示字符串,参数为: 1.AH=13H 2.AL=显示方式 如果AL=0,表示目标字符串仅仅包含字符,属性在BL中包含,不移动光标 如果AL=1,表示目标字符串仅仅包含字符,属性在BL中包含,移动光标 如果AL=2,表示目标字符串包含字符和属性,不移动光标 如果AL=3,表示目标字符串包含字符和属性,移动光标 总之,可以归纳为: |BIT7|BIT6|BIT5|BIT4|BIT3|BIT2|BIT1|BIT0| AL BIT0为0表示不移动光标,为1表示移动光

SQL Server 编写自动增长的字符串型主键

1.编写标量值函数ICONVERT2STRING CREATE FUNCTION ICONVERT2STRING(@N INT,@F INT) RETURNS VARCHAR(10) AS BEGIN DECLARE @M INT DECLARE @L0 INT DECLARE @CH VARCHAR(10) DECLARE @ST VARCHAR(20) SELECT @CH='' SELECT @ST=CONVERT(VARCHAR(10),@N) SELECT @ST=RTRIM(@ST)

Cisco PT模拟实验(10) 路由器的基本配置

Cisco PT模拟实验(10) 路由器的基本配置 实验目的: 掌握路由器几种常用配置方法 熟悉路由器不同的命令行操作模式 掌提路由器的基本配置命令 实验背景: 作为网络管理员,你第一次在设备机房对路由器进行了初次配置后,希望以后在办公室或出差时也可以对设备进行远程管理,现要在路由器上做适当配置. 技术原理: 路由器:一种用于连接因特网中各局域网.广域网,负责分组转发.路由选择的三层网络互联设备.根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号. 与二层交换机的最大区别,体现在其

显示字符串的全排列

显示字符串的全排列: 1 public static void AllSequenceofString(String string){ 2 if(string == null) 3 return; 4 char[] chars = string.toCharArray(); 5 Permutation(chars,0); 6 } 7 private static void Permutation(char[] chars, int index) { 8 // TODO Auto-generate

王爽汇编第三版实验10

1. 显示字符串 1 assume cs:code 2 3 data segment 4 db 'Welcome to masm!',0 5 data ends 6 7 stack segment 8 db 16 dup (0) 9 stack ends 10 11 code segment 12 start: 13 mov dh,8 14 mov dl,3 15 mov cl,2 16 mov ax,data 17 mov ds,ax 18 mov si,0 19 call show_str

shell脚本,在指定目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件。

[[email protected] wyb]# cat test10.sh #!/bin/bash #使用for循环在/test10目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件 dir=/root/wyb/test10/ [ ! -d $dir ] && mkdir -p $dir for i in `seq 10` do touch $dir`echo $RANDOM|md5sum|cut -c 1-10`_oldboy.html done [[ema