鱼C论坛

 找回密码
 立即注册
查看: 1839|回复: 2

[技术交流] 实验九,我的代码

[复制链接]
发表于 2012-7-5 15:09:39 | 显示全部楼层 |阅读模式

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

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

x
据说比较重要,怕不搞透彻后面课跟不上,因此第一次独立完成实验,特分享我的代码

assume cs:code,ds:data,ss:stack

data segment
db 'welcome to masm!'  ;定义要显示的字符串(共16字节)
db 02h,24h,71h         ;定义三种颜色属性
data ends

stack segment
dw 8 dup(0)
stack ends

code segment
start:

mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10h


mov ax,0b872h          ;算出屏幕第12行中间的显存的段起始位置放入ax中
mov es,ax              ;此时es为屏幕第12行中间的显存的段起始位置
mov bx,0               ;bx索引源字符串数据的偏移地址
mov bp,0               ;bp索引要写入的显存偏移地址
mov si,10h             ;si索引颜色属性源数据的偏移地址

mov cx,3               ;外部循环三次,每次循环写入一行完整的字符串及属性
s0:                  
push cx                ;将当前外循环计数推入栈保护起来
mov bx,0               ;bx索引源字符串数据的偏移地址,内循环结束出来后重新清零,为下一行从第一个字符串开始取值做准备
mov di,bp              ;bp保存的当前行第一个字符"w"写入的显存偏移地址,放入di保护

mov cx,10h             ;内循环16次,每次循环写入一个字符及属性
s:
mov al,ds:[bx]         ;
mov es:[bp],al         ;将当前行第一个字符写入指定段的第1个显存偏移地址
mov al,ds:[si]         ;
mov es:[bp+1],al       ;将当前行第一个字符属性写入指定段的第2个显存偏移地址
add bx,1               ;每次内循环源字符串寻址地址递增1个字节,指向下一个字符
add bp,2               ;字符和属性占2个字节,每次内循环写入显存偏移地址递增2个字节
loop s

mov bp,di              ;内循环结束出来,重新恢复bp为当前显示行第一个字符"w"的偏移地址
add bp,0a0h            ;内循环结束出来,要写入的目的显存偏移地址增加160个字节,索引到下一行"w"要写入显存的偏移地址
add si,1               ;内循环结束出来,颜色数据索引偏移地址递增1个字节,指向下一行的颜色属性
pop cx                 ;内循环结束出来,重新恢复外循环的计数,确保下一个外循环正常运行
loop s0

mov ax,4c00h
int 21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-7-5 15:18:47 | 显示全部楼层
这个实验刚才看到有人按列循环,一个循环就可以了
不过毕竟亲自用了嵌套循环,获得这样的经验也是很值的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-24 11:12:12 | 显示全部楼层
本帖最后由 三田学校 于 2012-7-24 15:04 编辑

assume cs:code,ds:data
data segment
db 'welcome to masm!'  ;定义要显示的字符串(共16字节)
db 02h,24h,71h         ;定义三种颜色属性
data ends
code segment
start:
mov ax,data
mov ds,ax

mov ax,0b872h
mov es,ax

mov bx,0
mov di,0
mov cx,10h

s0:
mov al,[bx]
mov es:[di],al
mov es:0a0h[di],al
mov es:140h[di],al

mov al,ds:[10h]
mov es:1[di],al
mov al,ds:[11h]
mov es:0a1h[di],al
mov al,ds:[12h]
mov es:141h[di],al
inc bx
add di,2
loop s0

mov ax,4c00h
int 21h
code ends
end start


一个循环实现,简单明了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-20 11:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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