鱼C论坛

 找回密码
 立即注册
查看: 3561|回复: 3

实验九,想了一夜,觉得这个方法最简单明了

[复制链接]
发表于 2015-3-2 11:14:07 | 显示全部楼层 |阅读模式

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

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

x
想了一夜,其实也是突然灵感一闪,觉得这样比较简单,麻烦大家看看,还可以再改改不,发帖少,就不隐藏了:lol:

assume cs:codesg

data segment
db 'welcome to masm!'
db  02h,02h,02h,02h,02h,02h,02h,24h,24h,24h,24h,71h,71h,71h,71h,71h,71h      
data ends

codesg segment
        start: mov ax,data
               mov ds,ax
                   mov bx,0
                   mov ax,0b800h   
                   mov es,ax       
                   mov bp,720h
           mov cx,16
                  
                 s:mov al,[bx]           ;地位字节控制ASCII码
                   mov ah,[bx+16]        ;高位字节控制字符属性
                   mov es:[bp],ax        ;把字符与字符属性同时传送给显存
                   inc bx            
                   add bp,2               ;bp增加一个字的长度
           loop s
                  
                   mov ax,4c00h
                   int 21h
                 
codesg ends
end start

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-17 19:18:28 | 显示全部楼层
这样看起来是可以的,但是你忘掉了一个居中三行的外循环。
其实也可以把字节的属性作为立即数【常数】,在第一行时,把属性的源地址在ASCII字节的偏移变量上加8,再加一个偏移变量si,就可以和ASCII一起循环十六次,完成ASCII和属性的同步转移到显存中,在完成16次循环后,记得把si自加1
回头我试着把代码敲到回复里,大家一起研究研究
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-17 21:58:18 | 显示全部楼层
不知道为什么,我的64位window10,在下载了DOSbox后在DOS中无法搜自己写好并放好目录中的masm文件,也就无法在DOS中一步步的debug程序,哪位大佬帮我debug下,看看有没有问题这样



assume  ds:datasg  cs:codesg   ss:stacksg
datasg segment
          db ' welcome to masm!'
          db 02h 24h 71h
datasg ends

stacksg segment
          dw  8 dup(0)
stacksg ends

codesg segment
start        mov ax,datasg    ;定义数据段段地址       
              mov ds,ax
              mov ax,stacksg   ;定义栈段段地址
              mov ss,ax
              mov sp,16   ;定义栈段指针指向栈顶
              mov ax,0b872h          ;定义字符窜在显存地址的首地址段,这里搞不懂,小甲鱼那个视频为什么把这个定义放到大循环里面
              mov es,ax
              mov bx,0      ;bx为数据段的偏移地址变量
              mov cx,3       ;总共三行,外循环次数
              mov di,0        ;定义显存中字符的基址
            
  s0:       mov ax,ds:[bx]         ;这里做行的循环s0
             mov es:[di],ax
             push bx
             push di
             push cx
s1:        mov cx,16
             mov al,ds:[bx]  ;将字母字节转存到显存
             mov es:[di]:al
             mov al,ds:16[bx]   ;将字母的属性转存到显存
             mov es:1[di],al       ;因为字母属性前面有一个字母字节,所以它的起始地址需要向后偏移一个字节,用立即数1来实现
             inc bx,1      ;数据段中,逐一将字母字节挖出来
             add di,2     ;显存段中,将字母字节和字母属性同时入驻ds的数据
         loop s1
            pop cx
            pop di
            pop bx
            add di,160
         loop s0
mov   ax,4c00h
       int 21h
codesg ends
end start
            
            
            
            
            
            
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-12 11:24:12 | 显示全部楼层
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-6-29 05:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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