|
主题 : : 关于实验九的作业已独立完成,希望大家给予指点:) [待解决] |
回复[ 3次 ]
点击[ 473次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-05-06 14:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26 |
对于实验九,我用两种方法完成了实验,第一种的结果是将三种效果的字符串在屏幕中间的同一行里显示出来。第二种方法的结果是将三种效果的字符串在屏幕中间的三行中分别显示出来。程序运行后都已达到预想的结果,只是不知道我在程序的编排上和指令的用法上有没有不合理的地方,希望大家给予指点:)
第一种方法:
assume cs:code,ds:data
data segment
db 3 dup ('w e l c o m e t o m a s m ! ') ;定义数据段的数据,我原本想用dw
data ends
code segment
start:mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0
mov si,0
mov di,079eh
mov cx,16
s: mov byte ptr [bx+1],02h
mov byte ptr [bx+35],0aeh
mov byte ptr [bx+69],79h
add bx,2
loop s
mov bx,0
mov byte ptr [bx+33],0
mov byte ptr [bx+67],0
mov cx,50
s1: mov ax,[si]
mov es:[di],ax
add si,2
add di,2
loop s1
mov ax,4c00h
int 21h
code ends
end start
第二种方法:
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
db 02h,0aeh,79h
data ends
stack segment
db 16 dup (0)
stack ends
code segment
start:mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov ax,stack
mov ss,ax
mov sp,16
mov bp,0
mov bx,0
mov cx,3
s1: push cx
mov si,0
mov di,720h 定义屏幕的中间位置
mov cx,16
s: mov al,ds:[si]
mov byte ptr es:[bx+di],al ;感觉这里bx用的好像有点笨
mov al,ds:[bp+16]
mov byte ptr es:[bx+di+1],al
inc si
add di,2
loop s
pop cx
add bx,160
inc bp
loop s1
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-05-07 23:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2008-12-15 16:17 |
这是我实现的代码,类比你第二种方法:
相互学习!
assume cs:codesg ,ds:datasg
datasg segment
db 'welcome to masm!'
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov si,0
mov ax,0b800h
mov es,ax
mov di,780h ;设置中间行
add di,76 ;设置中间列
mov cx,16
s: mov ah,ds:[si]
mov es:[di],ah ;行1字符
mov es:[di+0a0h],ah ;行2字符
mov es:[di+140h],ah ;行3字符 ,通过偏移灵活定位
inc di
mov byte ptr es:[di],02h ;行1颜色
mov byte ptr es:[di+0a0h],24h ;行2颜色
mov byte ptr es:[di+140h],71h ;行3颜色
inc di
inc si
loop s
mov ax,4c00h
int 21h
codesg ends
end start | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-05-08 11:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26 |
呵呵,对比楼上的朋友确实有可学的地方,字符与属性在同一循环中分别设置,有层次感:) | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-05-15 10:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-05-11 15:51 |
学习下,请指教
assume cs:code,es:table,ss:stack
table segment
db 'welcome to masm!'
db 02h,24h,71h,11001010b ;02h:黑底绿色 24h:绿底红色 71h:白底蓝色
table ends
stack segment
db 16 dup(0)
stack ends
code segment
start:
mov ax,0b800h
mov ds,ax
mov ax,table
mov es,ax
mov ax,stack
mov ss,ax
mov sp,16
mov bx,0
mov bp,0
mov cx,4
s:
push cx
mov si,0
mov di,0
mov cx,16
s0:
mov al,es:[si]
mov ds:[bx+di+71eh],al
mov ah,es:[16+bp]
mov ds:[bx+di+71fh],ah
inc si
add di,2
loop s0
inc bp
add bx,160
pop cx
loop s
mov ax,4c00h
int 21h
code ends
end start | | |
|