逆风飞翔1992 发表于 2020-10-15 15:36:24

实验九

本帖最后由 逆风飞翔1992 于 2020-10-15 15:38 编辑

assume cs:codesg,ds:datasg,ss:stack;用栈来存储颜色信息

datasg segment
       db 'welcome to masm!'    ;文字数据段
datasg ends

stack segment
        dw 0002h,0024h,0071h
        ; 绿色         00000010 2h          绿底红色 00100100 24h                白底蓝色        01110001 71h
stack ends

codesg segment

start:
                mov ax,datasg        ;获取文字数据位置
                mov ds,ax
               
                mov ax,0b872h        ;获取屏幕显示位置        显示起始段地址为:B800        屏幕25行80列 (80字符) 中间位置为12,13,14行         起始地址:(160*11+中间位置距离) 字节 = 1760+x
                                                ;文字数据段占16字节(8字符) 但由于 文字要配合颜色使用 因此 数据占内存大小需要*2         该段文字占内存16*2=32字节
                                                ;一行共160字节 文字在中间 因此 前方留空的内存大小为 (160-32)/2=64 字节
                                                ;1760+64=1824=720h                        720h作为偏移地址 段地址应该为72h 因此 B800H+72H 为文字颜色的起始地址
                mov es,ax
               
                mov ax,stack
                mov ss,ax
                mov sp,0                ;把栈顶位置找到 0002h是地址最小,在最上方
               
               
                mov cx,3
                mov si,0        ;si 表示对应的字体 si+1对应颜色
               
               
s0:               
                mov dx,cx
                mov bx,0        ;bx 表示welcome to masm
               
                pop di                ;直接从栈顶取颜色
                mov cx,16
               
s:                mov al,        ;复制文字到屏幕位置
                mov es:,al
                mov ax,di
                mov byte ptr es:,al        ;将颜色给地址的高位 通过al来改变颜色
                inc bx
                add si,2
                loop s
               
                add si,80h                        ;80h的由来后一行开始的文字比前一行开始 中间相差160个字节(一行为160字节) 160=a0h       
                                                        ;datasg 里的文字和颜色 占据了 16*2=32=20h字节
                                                        ;因此 下一行开始和上一行的结尾 相差了 a0h-20h=80h个字节
                mov cx,dx
                loop s0
               
                mov ax,4c00h
                int 21h


codesg ends
end start

人间凑数 发表于 2020-11-12 11:13:30

我这个没用到栈

assume cs:code,ds:data

data segment
db 'welcome to masm!';可以用字符(我当时挨个查的ascll码)
db 0ah,0ach,71h;16开头
data ends

code segment
start: mov ax,data
       mov ds,ax
       mov ax,0b800h
       mov es,ax          
           mov si,0
       mov di,0
           mov dx,3
          
        s1:mov bx,0
           mov cx,16
        s: mov al,
           mov ah,
           mov es:,ax
           inc bx
           add di,2
           loop s
          
           add di,128
           inc si
           dec dx
           mov cx,dx
           jcxz s2
           jmpshort s1       

    s2:mov ax,4c00H
       int 21h          
code ends
end start
页: [1]
查看完整版本: 实验九