鱼C论坛

 找回密码
 立即注册
查看: 3217|回复: 1

[汇编作业] 实验九

[复制链接]
发表于 2020-10-15 15:36:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 逆风飞翔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,[bx]        ;复制文字到屏幕位置
                mov es:[si],al
                mov ax,di
                mov byte ptr es:[si+1],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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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,[bx]
           mov ah,[si+16]
           mov es:[0720h+di],ax
           inc bx
           add di,2
           loop s
          
           add di,128
           inc si
           dec dx
           mov cx,dx
           jcxz s2
           jmp  short s1         

    s2:mov ax,4c00H
       int 21h          
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-29 04:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表