鱼C论坛

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

[汇编作业] 实验九

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

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

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

x
本帖最后由 逆风飞翔1992 于 2020-10-15 15:38 编辑
  1. assume cs:codesg,ds:datasg,ss:stack;用栈来存储颜色信息

  2. datasg segment
  3.        db 'welcome to masm!'    ;文字数据段  
  4. datasg ends

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

  9. codesg segment

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


  52. codesg ends
  53. end start

复制代码
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 18:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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